ホームページ > データベース > mysql チュートリアル > INNER JOIN の OR 条件によってパフォーマンスが低下するのはなぜですか?

INNER JOIN の OR 条件によってパフォーマンスが低下するのはなぜですか?

Mary-Kate Olsen
リリース: 2025-01-10 18:47:43
オリジナル
1019 人が閲覧しました

Why Does an OR Condition in an INNER JOIN Cause a Performance Penalty?

データベースの最適化: INNER JOIN の OR 条件のパフォーマンスへの影響

データベース クエリの最適化では、JOIN ステートメントのさまざまな条件の影響を理解することが重要です。よくある問題の 1 つは、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>
ログイン後にコピー

このクエリは最初に実行するのに数分かかります。詳細に検査した結果、問題は INNER JOIN の OR 条件であることが判明しました。

この問題を解決するために、クエリは LEFT JOIN のペアを使用するように書き直されました。

<code class="language-sql">SELECT mt.ID, mt.ParentID,
   CASE WHEN ot1.MasterID IS NOT NULL THEN
      ot1.MasterID ELSE
      ot2.MasterID END AS MasterID
FROM dbo.MainTable AS mt
LEFT JOIN dbo.OtherTable AS ot1 ON ot1.ParentID = mt.ID
LEFT JOIN dbo.OtherTable AS ot2 ON ot2.ID = mt.ParentID
WHERE ot1.MasterID IS NOT NULL OR ot2.MasterID IS NOT NULL</code>
ログイン後にコピー

最適化されたクエリは約 1 秒で実行を完了します。

INNER 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>
ログイン後にコピー

等価結合を使用して結果を連結することにより、クエリ オプティマイザーはパフォーマンスを低下させることなく効率的に操作を実行できます。 ここでの UNION ALL の使用に注意してください。重複した行を削除する必要がある場合は、UNION を使用してください。

以上がINNER JOIN の OR 条件によってパフォーマンスが低下するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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