3

こんにちは、ご協力ありがとうございます。

2 つのテーブル間の結合を実行する単純なクエリを実行しています。

SELECT
F5_CNOMBRE,
F5_CTD,
F5_CNUMSER,
F5_CNUMDOC,
F5_DFECDOC,
F5_NIMPORT,
CD_DFECCAN,
CD_CCODART
FROM ft1
INNER JOIN cc1
ON RTRIM(cc1.CD_CNRODOC) = RTRIM(ft1.F5_CNUMSER) + ft1.F5_CNUMDOC
WHERE F5_CGLOSA LIKE @varNroExpediente + '%'

テーブル ft1 には約 100 万のレコードがあり、テーブル cc1 には約 700,000 のレコードがあります。

誰もそれらのテーブルに書き込んでいない/使用していない場合、クエリは高速に実行されますが、ユーザーがテーブルを使用している場合、クエリは完了するまでに約 30/50 秒かかります。

フィールド ft1.F5_CNUMSER および ft1.F5_CNUMDOC にインデックスを付けて、インデックス付きビューを作成することを考えていました。これで性能が上がると思います。ビューにインデックスを作成すると、クエリされたテーブルが操作で破損する可能性があります。これらは実際のシステムにとって非常に重要なテーブルです。

この件に関して私が得ることができる洞察に感謝します。

4

2 に答える 2

4

2 つのテーブルには合計 147 列ありますが、そのうちの 8 つしか選択していません (良いことです!)。テーブルに 2 つのインデックスを設定すると、パフォーマンスが向上する可能性があります。

  • tableで、 (句で使用する)ft1にインデックスを作成し、そのテーブルの他の列を含めます。F5_CGLOSAWHERE

    CREATE INDEX IX01_ft1 
    ON dbo.ft1 (F5_CGLOSA)
    INCLUDE(F5_CNOMBRE, F5_CTD, F5_CNUMSER, F5_CNUMDOC, F5_DFECDOC, F5_NIMPORT)
    
  • もう一方のテーブルでcc1、(データ型に応じて) 2 つの列のうち小さい方にインデックスを作成し、もう一方の列を含めます。

    CREATE INDEX IX01_ft1 
    ON dbo.cc1(CD_DFECCAN)
    INCLUDE(CD_CCODART)
    

そうすれば、クエリ (必要なすべての列) は、これらの 2 つのインデックスによって「カバー」され、テーブル全体をスキャンする代わりに、これらの 2 つのインデックスをスキャンする (およびそれらのスキャンの結果を結合する) ことができます。はるかに大きく、はるかに多くの列) は、大幅な改善をもたらす可能性があります (うまくいけば!)。

于 2012-08-05T16:21:22.690 に答える
2

結合は非常に厄介なので、インデックス付きビューでその結合を具体化することは確かに役立つかもしれません。索引は、あまり役に立ちません。ビューを作成するときは、F5_CGLOSA を最初のクラスター化インデックス列にして、クエリがシークできるようにします。

これが可能かどうかはわかりませんが、a) 結合列を変更して、関数の結果を結合して SARGable にする必要がないようにし、b) そのクエリの同時ユーザーがブロックを引き起こす理由を見つけることができますか? スナップショット分離をオンにするだけで、この問題を解決できるかもしれません。

于 2012-08-05T15:05:03.210 に答える