Deals
これは、すべての金融取引エントリを含む一般的なテーブルであり、その数は数十万または数百万になる可能性があります。の各行にDeals
は と呼ばれる 1 つの列がProduct
あり、これは varchar 型で、さまざまな取引タイプ (債券取引、株式取引、先物またはオプション取引) に対応しています。単純なものもあれば、より複雑なものもあります。ここで、テーブル全体を検索して、満期になっていないすべての取引を取得したいと考えています。取引の種類によって、「成熟」という用語は異なる意味を持ちます。たとえば、製品タイプ「BOND」などの場合MaturityDate
、Deals
テーブルの列の値が指定された日付よりも大きいかどうかを確認します。つまり、MaturityDate > @DATE です。取引タイプ「FUTURE」には、列があります。ValueDate
指定された日付よりも大きく、かつ指定された日付よりも大きい同じテーブル内MaturityDate
。したがって、クエリの最初のドラフトは次のようになります。
SELECT * FROM Deals
WHERE
(
(Product IN ('ProdA', 'ProdB') AND MaturityDate > @CD) OR
(Product IN ('ProdC', 'ProdD') AND (MaturityDate > @CD AND ValueDate > @CD)) OR
(Product IN ('ProdE', 'ProdF', SOME_OTHER_PRODUCT_TYPE) AND (MaturityDate > @CD AND ValueDate > @CD) AND SOME_OTHER_CRITERIA) OR
...
)
30 を超えるProduct
値と少なくとも 8 セットの基準があります (最も一般的な基準セットはおそらく 7 または 8 つProduct
の値に適用され、最も一般的でない基準セットは 1 つまたは 2 つのProduct
値のみに適用されます)。列Product
にはインデックスが付けられます。たとえば、条件の一部の列 (すべてではない) にMaturityDate
もインデックスが付けられます。ほとんどの基準セットはDeals
テーブル内の列の値のみをチェックしますが、実際には、他のテーブルへの JOIN に関係し、そこでも値をチェックするいくつかの基準セットがあります。
私の質問は、そのようなクエリをどのように最適化できるかということです (SW 開発者として、私は実際には DB の専門家ではなく、データ アクセス コードを書くことはめったにありません)。OR句をUNIONに置き換えるのは良い考えかもしれないとどこかで読んだからです。ただし、UNION と OR を使用してクエリを実行すると、前者は私の開発マシン (テーブル内のアイテムが 100,000 未満Deals
) で 5 秒かかり、後者は 3 秒かかりました。そして、私が言ったように、私は知識が限られているので、そのようなクエリを最適化する他の方法があるかどうかはわかりません. 誰か経験を共有できますか?ありがとう!