2

MS SQL Server クエリ プランナーが、OR 条件を使用した JOIN のユニオンを選択するのではなく、入れ子になったループを作成するのはなぜでしょうか。

注:SOで検索すると、MSSQL固有ではないようです

例えば

SELECT * FROM TableA a
JOIN TableB b
ON a.One = b.One 
OR a.Two = b.Two

私の場合は6分かかります(OneとTwoの両方が両方のテーブルでインデックス化されています)

しかし

SELECT * FROM TableA a
JOIN TableB b
ON a.One = b.One

UNION -- Not ALL, as need to remove duplicates

SELECT * FROM TableA a
JOIN TableB b
ON a.Two = b.Two

2秒かかります。

最初の処理に時間がかかる理由はわかっていますが (2 つのユニオンがインデックスを使用する入れ子になったループのため)、クエリ プランナーが UNION を実行プランとして選択しないのはなぜでしょうか?

UNION を使用していない UNION を使用する場合に注意する必要がある警告はありますか?

このロジックがクエリ プランナーに実装されていないのはなぜですか?

クエリプランナーのコードをよりシンプルに保つためだけですか (おそらくすでにかなり複雑なので)、最適化に取り組まなかったのですか、それとも私が気付いていない他の警告があるためですか?

4

1 に答える 1