1

私はこのサイトを初めて利用しますが、私に反対しないでください。一度だけ使ったことがあります。

これが私のジレンマです。私は中程度のSQL知識を持っていますが、専門家ではありません。以下のクエリは、かなり前にコンサルタントによって作成されました。

大量のデータがあるため、ほとんどの朝、実行には1.5時間かかります。しかし、他の朝は、4〜6時間かかります。実行中のジョブを削除しようとしました。何がこの問題を引き起こしているのかを突き止めるために何をしようとするかについて、私は完全に混乱しています。

どんな助けでもいただければ幸いです。

私はすでにこのクエリを2つのクエリに分割しましたが、パフォーマンスを向上させるためのヒントをいただければ幸いです。

このクエリは、在庫トランザクションを再構築して、任意の時点での手持ち在庫の価値を見つけます。

SELECT     
    ITCO, ITIM, ITLOT, Time, ITWH, Qty, ITITCD,ITIREF, 
    SellPrice, SellCost,
    case 
        when Transaction_Cost is null 
        then Qty * (SELECT ITIACT 
                    FROM (Select Top 1 B.ITITDJ, B.ITIREF, B.ITIACT
                          From OMCXIT00 AS B 
                          Where A.ITCO = B.ITCO
                          AND A.ITWH = B.ITWH
                          AND A.ITIM = B.ITIM
                          AND A.ITLOT = B.ITLOT 
                          AND ((A.ITITDJ > B.ITITDJ) 
                               OR (A.ITITDJ = B.ITITDJ AND A.ITIREF <= B.ITIREF))
                          ORDER BY B.ITITDJ DESC, B.ITIREF DESC) as C) 
        else Transaction_Cost
    END AS Transaction_Cost, 
    case when ITITCD = 'S' then ' Shipped - Stock' else null end as TypeofSale,
    case when ititcd = 'S' then ITIREF else null end as OrderNumber
FROM  
    dbo.InvTransTable2 AS A

これが実行計画です。 http://i.imgur.com/mP0Cu.png 実行計画のボトルネックはソートだと思います

これがDTAですが、推奨事項が空白であるため、読み方がわかりません。それは「作成」と言うべきではありませんか? http://i.imgur.com/4ycIP.png

4

2 に答える 2

2

dbo.InvTransTable2からすべてのレコードが選択されているため、dbo.InvTransTable2と一致させることはできません。そのため、レコードをスキャンしたままになります。

  1. OMCXIT00にクラスター化されたインデックスがあることを確認してください。これはヒープであり、クラスター化されたインデックスではないように見えます。クラスタ化されたインデックスは小さいが、より明確な値が含まれていることを確認してください。
  2. OMCXIT00のレコードが少ない場合は、主要なITCOを使用してインデックスを作成し、次の列をinclude(ITITDJ、ITIREF、ITWH、ITCO、ITIM、ITLOT)に含めるだけで十分な場合があります。

インデックス作成の例:

   CREATE INDEX IX_dbo_OMCXIT00 
                     ON OMCXIT00 ([ITCO])
                    INCLUDE ( ITITDJ , ITIREF)
  1. それでも問題が解決しない場合は、検索している述語のどの列がより明確な値を持っているかを確認し、それらの1つまたはいくつかのキーを使用してインデックスを作成し、where句で述語の順序を並べ替えることを確認する必要があります。

                      A.ITCO = B.ITCO
                      AND A.ITWH = B.ITWH
                      AND A.ITIM = B.ITIM
                      AND A.ITLOT = B.ITLOT 
    
于 2012-11-15T16:02:11.630 に答える
0

インデックスを追加してインデックスシークのテーブルスキャンを変更する以外に、「このSQLコードでこの順序が本当に必要ですか?」と自問してください。この並べ替えが必要ない場合は、SQLコードからorderbyを削除してください。次に、コードが高速になる可能性が高くなります。

于 2012-11-16T18:55:46.260 に答える