SQL Server 2008 の INNER JOIN 条件での "OR" の使用によって引き起こされるパフォーマンスの問題の分析
約 50,000 行の 2 つの小さなテーブルに対する低速なクエリと、SQL Server 2008 データベースの専門家による慎重な検査により、原因は INNER JOIN 条件の "OR" 演算子であることが判明しました。
問題のあるコード スニペットは次のとおりです:
<code class="language-sql">SELECT mt.ID, mt.ParentID, ot.MasterID FROM dbo.MainTable AS mt INNER JOIN dbo.OtherTable AS ot ON ot.ParentID = mt.ID OR ot.ID = mt.ParentID</code>
「OR」を LEFT JOIN のペアに置き換えると、クエリ速度が大幅に向上し、わずか 1 秒で完了します。
JOIN 条件の「OR」は悪い習慣ですか?
専門家は、JOIN 条件で「OR」を使用することが常に望ましくないのか、それとも、専門家らのケースは特定のテーブル構造による例外にすぎないのか疑問に思っています。
技術解説
JOIN 条件で「OR」を使用する場合の問題は、HASH JOIN または MERGE JOIN 操作に最適化できないことです。クエリ オプティマイザーは、これを異なる結果セットのマージとしてのみ表すことができます:
<code class="language-sql">SELECT * FROM maintable m JOIN othertable o ON o.parentId = m.id UNION ALL SELECT * FROM maintable m JOIN othertable o ON o.id = m.parentId</code>
個々の結果セットは等結合ですが、「OR」が存在する場合、オプティマイザーはそれらを等結合として認識しません。 これにより、非効率的なクエリが発生します。
以上がINNER JOIN の「OR」条件が非常に遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。