ホームページ > データベース > mysql チュートリアル > INNER JOIN の「OR」条件が非常に遅いのはなぜですか?

INNER JOIN の「OR」条件が非常に遅いのはなぜですか?

Mary-Kate Olsen
リリース: 2025-01-10 19:07:42
オリジナル
606 人が閲覧しました

Why Are

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート