2013-07-15 2 views
0

지난 주에이 쿼리를 실행하려고했지만 7 시간이 지난 후에도 여전히 실행 중이 었으므로 결국 끝내야했습니다. 최종 결과는 20,000 행이어야하는 800+ 행만 반환했습니다. 성능 향상에 대한 조언은 대단히 감사하겠습니다.실행하기에 너무 오래 걸리는 쿼리 선택 (SQL Server 2008)

감사합니다.

Select 
    a.entryID, g.GroupName, 
    MAX(CASE WHEN e.attributedefinitionid = 15 THEN e.AttributeValue END) AS EnglishWording, 
    MAX(CASE WHEN e.attributedefinitionid = 41 THEN e.AttributeValue END) AS GermanWording, 
    MAX(CASE WHEN e.attributedefinitionid = 64 THEN e.AttributeValue END) AS RussianWording, 
    MAX(CASE WHEN e.attributedefinitionid = 91 THEN e.AttributeValue END) AS FrenchWording, 
    MAX(CASE WHEN e.attributedefinitionid = 143 THEN e.AttributeValue END) AS ItalianWording, 
    MAX(CASE WHEN e.attributedefinitionid = 160 THEN e.AttributeValue END) AS SpanishWording, 
    MAX(CASE WHEN e.attributedefinitionid = 165 THEN e.AttributeValue END) AS ChineseWording, 
    MAX(CASE WHEN e.attributedefinitionid = 170 THEN e.AttributeValue END) AS JapaneseWording, 
    MAX(CASE WHEN h.attributedefinitionid = 17 
       THEN convert(varchar(10), h.AttributeValue, 120) 
     END) as DateA, 
    MAX(CASE WHEN h.attributedefinitionid = 557 
       THEN convert(varchar(10), h.AttributeValue, 120) 
     END) as DateO, 
    MAX(CASE WHEN h.attributedefinitionid = 558 
       THEN convert(varchar(10), h.AttributeValue, 120) 
     END) as DateC, 
    MAX(CASE WHEN j.attributedefinitionid = 29 THEN j.AttributeValue END) AS Warning, 
    MAX(CASE WHEN l.attributedefinitionid = 23 THEN l.AttributeValue END) AS Highlight, 
    MAX(CASE WHEN n.attributedefinitionid = 572 THEN n.AttributeValue END) AS Investigations, 
    MAX(CASE WHEN p.attributedefinitionid = 30 THEN p.AttributeValue END) AS Comments, 
    MAX(CASE WHEN s.attributedefinitionid = 39 THEN s.AttributeValue END) AS USD, 
    MAX(CASE WHEN s.attributedefinitionid = 40 THEN s.AttributeValue END) AS EUR, 
    MAX(CASE WHEN s.attributedefinitionid = 92 THEN s.AttributeValue END) AS GBP, 
    MAX(CASE WHEN s.attributedefinitionid = 450 THEN s.AttributeValue END) AS RBN, 
    MAX(CASE WHEN s.attributedefinitionid = 451 THEN s.AttributeValue END) AS JPY, 
    MAX(CASE WHEN s.attributedefinitionid = 552 THEN s.AttributeValue END) AS HK$, 
    MAX(CASE WHEN u.attributeDefinitionID = 142 THEN u.attributeValue END) AS [Status] 
From 
    Entry as a 
inner join 
    entrycategory as b on b.entryid = a.entryid 
inner join 
    category as c on c.categoryid = b.categoryid 
inner join 
    [Group] as g on g.groupID = c.groupID 
left outer join 
    EntryAttribute AS d on d.entryID = A.entryid 
left outer join 
    attributestring AS e on e.attributeid = d.attributeid 
left outer join 
    EntryAttribute as f on f.EntryID = a.EntryID 
left outer join 
    AttributeDateTime as h on h.AttributeID = f.AttributeID 
left outer join 
    EntryAttribute as i on i.EntryID = a.EntryID 
left outer join 
    AttributeString as j on j.AttributeID = i.AttributeID 
left outer join 
    EntryAttribute as k on k.EntryID = a.EntryID 
left outer join 
    AttributeString as l on l.AttributeID = k.AttributeID 
left outer join 
    EntryAttribute as m on m.EntryID = a.EntryID 
left outer join 
    AttributeString as n on n.AttributeID = m.AttributeID 
left outer join 
    EntryAttribute as o on o.EntryID = a.EntryID 
left outer join 
    AttributeString as p on p.AttributeID = o.AttributeID 
inner join 
    EntryAttribute AS r on r.entryID = A.entryid 
inner join 
    attributestring AS s on s.attributeid = r.attributeid 
left outer join 
    EntryAttribute as t on t.EntryID = a.EntryID 
left outer join 
    AttributeString as u on u.AttributeID = t.AttributeID 
Group by 
    a.entryID, g.GroupName 

답변

4

는 지금까지 내가 말할 수있는, 당신은 단지 하나가 EntryAttributeAttributeString 테이블에 가입해야합니다. 집계는 나머지를 처리합니다. 복수를 가짐으로써

Select a.entryID,g.GroupName, 
MAX(CASE WHEN e.attributedefinitionid = 15 THEN e.AttributeValue END) AS EnglishWording, 
MAX(CASE WHEN e.attributedefinitionid = 41 THEN e.AttributeValue END) AS GermanWording, 
MAX(CASE WHEN e.attributedefinitionid = 64 THEN e.AttributeValue END) AS RussianWording, 
MAX(CASE WHEN e.attributedefinitionid = 91 THEN e.AttributeValue END) AS FrenchWording, 
MAX(CASE WHEN e.attributedefinitionid = 143 THEN e.AttributeValue END) AS ItalianWording, 
MAX(CASE WHEN e.attributedefinitionid = 160 THEN e.AttributeValue END) AS SpanishWording, 
MAX(CASE WHEN e.attributedefinitionid = 165 THEN e.AttributeValue END) AS ChineseWording, 
MAX(CASE WHEN e.attributedefinitionid = 170 THEN e.AttributeValue END) AS JapaneseWording, 

MAX(CASE WHEN e.attributedefinitionid = 17 THEN convert(varchar(10),e.AttributeValue,120) END) as DateA, 
MAX(CASE WHEN e.attributedefinitionid = 557 THEN convert(varchar(10),e.AttributeValue,120) END) as DateO, 
MAX(CASE WHEN e.attributedefinitionid = 558 THEN convert(varchar(10),e.AttributeValue,120) END) as DateC, 

MAX(CASE WHEN e.attributedefinitionid = 29 THEN e.AttributeValue END) AS Warning, 
MAX(CASE WHEN e.attributedefinitionid = 23 THEN e.AttributeValue END) AS Highlight, 
MAX(CASE WHEN e.attributedefinitionid = 572 THEN e.AttributeValue END) AS Investigations, 
MAX(CASE WHEN e.attributedefinitionid = 30 THEN e.AttributeValue END) AS Comments, 

MAX(CASE WHEN e.attributedefinitionid = 39 THEN e.AttributeValue END) AS USD, 
MAX(CASE WHEN e.attributedefinitionid = 40 THEN e.AttributeValue END) AS EUR, 
MAX(CASE WHEN e.attributedefinitionid = 92 THEN e.AttributeValue END) AS GBP, 
MAX(CASE WHEN e.attributedefinitionid = 450 THEN e.AttributeValue END) AS RBN, 
MAX(CASE WHEN e.attributedefinitionid = 451 THEN e.AttributeValue END) AS JPY, 
MAX(CASE WHEN e.attributedefinitionid = 552 THEN e.AttributeValue END) AS HK$, 
MAX(CASE WHEN e.attributeDefinitionID = 142 THEN e.attributeValue END) AS [Status] 

From Entry as a 
inner join entrycategory as b on b.entryid = a.entryid 
inner join category as c on c.categoryid= b.categoryid 
inner join [Group] as g on g.groupID = c.groupID 
left outer join EntryAttribute AS d on d.entryID = A.entryid 
left outer join attributestring AS e on e.attributeid = d.attributeid 
Group by a.entryID,g.GroupName; 

는 각 entryId, GroupName 그룹 내 humungous 한 데카르트의 제품을 생성하는 조인.

+0

aaah 예 이제 1 분 안에 실행됩니다 !!! 정말 고맙습니다. 나는 많은 NULL을 반환했습니다. 이것들을 제외 할 수 있고 NULL 인 경우 공백을 반환 할 수 있습니까? – Jasmine

+0

@ 재스민. . . 'NULL' 대신 공백으로 되돌리려면'else ''절을 모든 case 문에 추가하십시오. –

+0

일치하는 항목이 발견되면 실제 값 대신 예를 반환하는 필드를이 쿼리에 추가하고 싶습니다. 그래서 존재한다면 나는 단지 예를 돌려주고 싶습니다. 그러나 이것을 집합되지 않은 필드로 추가한다면 Group by 절에 추가해야 할 것이며 그렇게하고 싶지는 않습니다. 항목 x에서 x.entryID, a.attributeValue를 x로 선택 (EntryAttribute에서 EntryAttribute를 선택하여 e 내부 조인 AttributeString으로 a.AttributeID = e.AttributeID에서 e.entryID = x.entryID 및 a.AttributeDefinitionID = 44로 선택) – Jasmine

관련 문제