2013-04-19 2 views
0

내 쿼리에서이 문제가 발생했습니다. MSSQL Server 2008을 사용하고 있으며 3 개의 DB에 수백 개의 샘플 데이터가 있습니다. 쿼리는 이름과 값 및 3 개의 DB를 기반으로 계산 된 백분율을 반환합니다. 그러나 내가 가지고있는 질의는 실제로 실행하는데 거의 10 분이 걸릴 것이고, 그것은 정말로 오랜 시간입니다. 나는 아직도 SQL을 배우고 있지만 여전히 좋은 것은 아니므로 내가 가진 질의가 최상의 방법을 사용하지 않고 조직화되어 있지 않다고 생각합니다. 아무도 내 쿼리가 더 빨리 실행되도록 개선 할 수있는 위치 또는 방법을 알려줄 수 있습니까?SQL 쿼리를 실행하는 데 오랜 시간이 걸립니다.

SELECT data.Ret, 
    case 
     when @group_by= 'site' OR (@group_by='attribute' AND @attribute_id = '5') and (data.rowid % 50) = 0 then (data.rowid/50)-1 
     when @group_by= 'site' OR (@group_by='attribute' AND @attribute_id = '5') then (data.rowid/50) 
     else 0 end as batchStore 
     ,data.MajorName,data.MinorName,data.MajorVal,data.MinorVal,data.Version 
     ,data.A_Percent,data.T_Percent,data.F_Percent 
from 
(
    SELECT report.Ret, 
     CASE when @group_by= 'site' OR (@group_by='attribute' AND @attribute_id = '5') 
     then row_number() over (PARTITION BY report.Ret,report.Version order by report.Ret, report.MajorName) 
     else 0 end as rowid 
     ,report.MajorName,report.MinorName,report.MajorVal,report.MinorVal,report.Version 
     ,report.GTotal_A,report.GTotal_T,report.GTotal_F 
     ,ISNULL(sum(report.Abn)/NULLIF(cast(report.GTotal_A as decimal),0),0) * 100 as A_Percent 
     ,ISNULL(sum(report.Trn)/NULLIF(cast(report.GTotal_T as decimal),0),0) * 100 as T_Percent 
     ,ISNULL(sum(report.Fld)/ NULLIF(cast(report.GTotal_F as decimal),0) * 100,0) as F_Percent 
    From 
    (
     Select 
      CASE @group_by 
      WHEN 'object' THEN csl.s_name 
      WHEN 'site' THEN csl.s_name 
      WHEN 'year' THEN CAST(YEAR(dy.Day_Stamp) AS VARCHAR(50)) 
      WHEN 'attribute' THEN CAST(coalesce(attrib.AttributeName,'') AS VARCHAR(50)) 
      ELSE '' 
      END as MajorName, 
      CASE @group_by 
      WHEN 'object' THEN l.l_name 
      WHEN 'site' THEN '' 
      WHEN 'attribute' THEN CAST(coalesce(attrib.AttributeName,'') AS VARCHAR(50)) 
      ELSE '' 
      END as MinorName, 
      CASE @group_by 
      WHEN 'object' THEN csl.s_name 
      WHEN 'site' THEN csl.s_name 
      WHEN 'year' THEN CAST(YEAR(dy.Day_Stamp) AS VARCHAR(50)) 
      WHEN 'attribute' THEN CAST(coalesce(attrib.AttributeValue,'') AS VARCHAR(50)) 
      ELSE '' 
      END as MajorVal, 
      CASE @group_by 
      WHEN 'object' THEN l.l_name 
      WHEN 'site' THEN '' 
      WHEN 'attribute' THEN CAST(coalesce(attrib.AttributeValue,'') AS VARCHAR(50)) 
      ELSE '' 
      END as MinorVal, 
      csl.Cust_Name as Ret,l.SWVersion as Version 
      ,d.Abn,d.Trn,d.Fld,data.GTotal_A ,data.GTotal_T,data.GTotal_F 
     From db_mon.dbo.CustSL csl 
      join db_tax.dbo.vwLane l 
       on (l.externalid = csl.custsl_id) 
      join db_mon.dbo.DaySummary dy 
       on (dy.Str = csl.s_name and dy.Lne = csl.l_name and year(dy.day_stamp) = year(@time_start_date) and year(dy.day_stamp) =year(@time_end_date)) 
      Left Outer Join 
       (
        Select a.id As AttributeId, a.attribute_name As AttributeName, 
        (Case When a.attribute_value_type = 'string' Then ea.string_value 
         Else (Case When a.attribute_value_type = 'integer' Then cast(ea.integer_value as nvarchar(100)) 
          Else (Case When a.attribute_value_type = 'date' Then cast(ea.date_value as nvarchar(100)) 
           Else (Case When a.attribute_value_type = 'boolean' Then cast(ea.boolean_value as nvarchar(100)) 
            Else (Case When a.attribute_value_type = 'entity' Then cast(ea.ref_entity_id as nvarchar(100)) Else null End) 
            End) 
           End) 
          End) 
         End) As AttributeValue, 
        e.id As EntityId 
        From db_tax.dbo.entity_type et 
        Inner Join db_tax.dbo.entity As e on et.id = e.entity_type_id 
        Inner Join db_tax.dbo.entity_attribute As ea on e.id = ea.entity_id 
        Inner Join db_tax.dbo.attribute As a on ea.attribute_id = a.id 
        WHERE et.entity_type_name in ('Sticker','Label') And 
        a.id = (case WHEN @attribute_id = '' then 1 else cast(@attribute_id as int) end) 
       ) AS attrib 
        On attrib.EntityId = l.L_Id 
      inner join db_mon.dbo.DaySummary d 
       on (csl.Cust_Name = d.Ret and csl.s_name = d.stckr and csl.l_name = d.label and l.SWVersion = d.Version) 
      join ( 
       SELECT Ret,version,sum(Abn) as GTotal_A,sum(Trn) as GTotal_T,sum(Fld) as GTotal_F 
       from db_mon.dbo.DaySummary 
       where day_stamp >= @time_start_date and day_stamp <[email protected]_end_date 
       GROUP BY Ret,version 
      ) data 
       on (d.Ret = data.Ret and l.SWVersion = data.Version) 
     WHERE (CHARINDEX(',' + CONVERT(VARCHAR,l.S_Id) + ',','xxx,' + @entities + ',xxx')>0 OR CHARINDEX(',' + CONVERT(VARCHAR,l.L_Id) + ',','xxx,' + @entities + ',xxx')>0) 
     and d.day_stamp >= @time_start_date 
     and d.day_stamp <[email protected]_end_date 
    ) As report 
Group By report.Ret,report.Version,report.MajorName,report.MinorName,report.MajorVal,report.MinorVal 
,report.GTotal_A,report.GTotal_T,report.GTotal_F 
)data 
order By data.Ret,data.Version,batchStore,data.MajorName,data.MinorName,data.MajorVal,data.MinorVal 

많은 참여를 사용하면 느린 실행이 발생합니까?

+1

데이터의 진위는 아무것도 아닙니다. 수백만 데이터가 정상입니다. –

+1

매우 큰 질문입니다. 대답하기가 어려울 것입니다. 왜 이것이 느린지에 대한 가능성은 수백 가지가 있습니다. 병목 현상이있는 위치를 찾을 때까지 쿼리의 크기를 줄여야합니다. –

+0

실행 계획을 보면 시간 구조 소비자, –

답변

0

SUB 선택 쿼리는 항상 적절한 조인보다 느립니다.

3 개의 하위 선택 항목이 실행 중입니다. 이것은 인덱스 변경 등에 관계없이 성능에 영향을 줄 것입니다.

하위 선택 사용을 중지하려면 전체를 다시 작성해야합니다.

관련 문제