0

ストアド プロシージャに次のクエリがあります。

UPDATE  dbo.CRM_tblActivityStore
SET StoDateChngFlg = CASE 
             WHEN x.STAGE_STAD <> x.ACTSTR_STAD THEN 1 ELSE 0 END
FROM    (SELECT CASE 
WHEN sd.stad = '00000000' THEN '12-31-2049' ELSE CONVERT (DATE, sd.stad) 
END AS STAGE_STAD,
                CONVERT (DATE, tas.StoDateSTA) AS ACTSTR_STAD,
                tas.StoActivityNbr,
                sd.Proj_Code,
                sd.OrderNbr,
                sd.FileNbr
         FROM   [SCM Server].[OrdrMgmt].dbo.STAGE_StageData AS sd
                INNER JOIN
                dbo.CRM_tblActivityStore AS tas
                ON sd.Proj_Code = tas.StoProjCode
                   AND sd.OrderNbr = tas.StoOrderNbr
                   AND sd.FileNbr = tas.StoFile) AS x
        INNER JOIN
        dbo.CRM_tblActivityStore AS tast
        ON tast.StoActivityNbr = x.StoActivityNbr
           AND tast.StoProjCode = x.Proj_Code
           AND tast.StoOrderNbr = x.OrderNbr
           AND tast.StoFile = x.FileNbr;

役立つ可能性のあるその他の情報:

[SCM サーバー].[OrdrMgmt].dbo.STAGE_StageData - 2,000,000 行を超える dbo.CRM_tblActivityStore - 5,000,000 行を超える

これらのテーブルはどれもインデックス化されておらず、プライマリ キーもありません。

こちらは3時間以上かかります。

インデックスを追加すると、どの程度劇的に改善できますか?

それを改善するための他のアイデアはありますか?

ありがとう、

宜蘭

4

3 に答える 3

1

David が言うように、結合列にインデックスを追加すると、このクエリの応答時間が改善されます。ただし、これらのテーブルに主キーがない理由という根本的な問題には対処していません。主キーは、テーブル内の各行を一意に識別します。データ モデルで行の重複が許可されていることを/本当に/確信していますか? もしそうなら、それはあなたのビジネスニーズに合っていますか? あなたが解決しようとしている問題にアプローチする別の、おそらくより良い方法はありますか。

考慮すべきルール: 1 - 各行は一意に識別可能 (主キー) 2 - 行の各列は主キーに関連付けられている 3 - 各列は主キーのみに関連付けられている

これらのテーブルを複数のテーブルに分割する必要がある場合があります。各テーブルが何を記述しようとしているのか、および他のテーブルとの関係を慎重に検討してください。1 つのテーブルに、その主キーで許可されている以上のことをさせようとしないでください。

于 2015-02-11T22:00:02.077 に答える
0

クエリを最適化するときは、常に

実際の実行計画を含める

SSMS の [クエリ] メニュー オプションの下にあるオプション。

その後、クエリを最適化する方法に関する情報が得られます。追加する必要があると思われる実際のインデックス作成スクリプトも提供します。

これで頑張ってください。このクエリを数分に短縮できると確信しています。

于 2015-02-11T21:40:51.793 に答える
0

いくつかのインデックスを追加すると、データベースが大幅に改善されます。あなたが提供したクエリには、関連する列にインデックスが付けられることで恩恵を受けるいくつかの結合があります。つまり、sd.Proj_Code = tas.StoProjCode および sd.OrderNbr = tas.StoOrderNbr および sd.FileNbr =tas.StoFile

一致させようとしているフィールドが同じデータ型である限り、インデックスを作成するとクエリ時間が大幅に短縮されます。

いくつかの列にインデックスを付けてから、プランナーが何をしようとしているのかを確認して、インデックス付けされているものを変更する必要があるかどうかを確認します - 単一または複数の列インデックス、主キーなど

于 2015-02-11T21:41:40.590 に答える