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 を使用する場合に注意する必要がある警告はありますか?
このロジックがクエリ プランナーに実装されていないのはなぜですか?
クエリプランナーのコードをよりシンプルに保つためだけですか (おそらくすでにかなり複雑なので)、最適化に取り組まなかったのですか、それとも私が気付いていない他の警告があるためですか?