古いレガシーシステムを書き直しています。という機能がありますcheckExisting()
。古いシステムは、次のように MSSQL データベースからオブジェクトを抽出するためにクエリを使用していました (ADO DB を使用):
SELECT ObjectId, Name.....
FROM tblRegisteredIncludes
WHERE UPPER("Name") IN ('PROGA.H', 'PROGB.H'............... list)
多くのテーブルがありますがtblRegisteredIncludes
、SQL はテーブル名でグループ化され、オブジェクト名のリストで IN 句を使用しています。
これは、SQL Server が 1 回のスキャンですべてのオブジェクトを収集Name
し、テーブルの列にインデックスがあったため、適切に高速に実行されています。
しかし、新システムではWHERE
条件が複雑になるため、同じSQLを使うことができません。また、ソース フィールドを使用しており、場合によっては条件内の他のフィールドも使用しています。多数の単一 SQL クエリがあります。
SELECT ObjectId, Name..... FROM tblRegisteredIncludes
WHERE UPPER("Name") = 'PROGA.H' AND UPPER("Source") = "..."
SELECT ObjectId, Name..... FROM tblRegisteredIncludes
WHERE UPPER("Name") = ('PROGB.H') AND UPPER("Source") = "..."
表の Name-IndextblRegisteredIncludes
を の複合インデックスに置き換えました(Name,Source)
。
それでも、合計 SQL 実行は少し遅くなることが予想されますが、15 ~ 20% を超えることはありません。代わりに、はるかに遅くなり、時には最大 100% になります。UNION ALL を使用して、SQL を 1 つの大きな SQL クエリに結合しようとしました。
SELECT ObjectId, Name..... FROM tblRegisteredIncludes
WHERE UPPER("Name") = 'PROGA.H' AND UPPER("Source") = "..."
UNION ALL
SELECT ObjectId, Name..... FROM tblRegisteredIncludes
WHERE UPPER("Name") = ('PROGB.H') AND UPPER("Source") = "..."
結果のADO DBレコードセットを後で処理しますが、さらに遅くなります!
これらのクエリをより速く実行するための効率的な方法があるかどうかを知る必要がありますか? IN 句と名前のリストを使用する場合、以前のケースと同様のパフォーマンスを達成する必要があります。実行計画を提供できます。