0

クエリが本当に遅いという問題があります。私は MSSQL サーバー 2008 を使用しており、数百のサンプル データを含む 3 つの DB があります。クエリは、名前と値、および 3 つの DB に基づいて計算されたパーセンテージを返します。しかし、私が持っているクエリは、実行に約 10 分かかります。これは本当に時間がかかります。私はまだ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 <=@time_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 <=@time_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

多くの結合を使用すると実行が遅くなりますか?

4

1 に答える 1

0

SUB Select クエリは、適切な結合よりも常に遅くなります。

3 つのサブセレクトを深く実行しています。これは、インデックスなどの変更に関係なく、パフォーマンスに影響を与えます。

サブセレクトの使用をやめるには、全体を書き直す必要があります。

于 2013-04-19T09:42:40.437 に答える