「OR」条件を含む SQL INNER JOIN
クエリの最適化: パフォーマンス分析
SQL Server 2008 クエリにおける最近のパフォーマンスのボトルネックは、OR
内の INNER JOIN
条件に起因していました。 元のクエリには 2 つのテーブル (それぞれ 50,000 行のみ) が含まれており、大幅な速度低下が見られました。
非効率なクエリでは次の JOIN
条件が使用されました:
<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>
これは、一対の LEFT JOIN
を使用してリファクタリングされ、パフォーマンスが劇的に向上しました (数分から約 1 秒に)。
<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>
これにより、OR
節内の JOIN
条件は避けるべきかという疑問が生じます。普遍的に有害というわけではありませんが、パフォーマンスへの影響を理解することが重要です。
中心的な問題は、オプティマイザーの制限にあります。 JOIN
条件を持つ OR
では、HASH JOIN や MERGE JOIN などの最適化された結合方法を利用できません。 クエリのロジックは基本的に、UNION
:
<code class="language-sql">SELECT * FROM maintable m JOIN othertable o ON o.parentId = m.id UNION SELECT * FROM maintable m JOIN othertable o ON o.id = m.parentId</code>
ただし、SQL Server オプティマイザーはこの等価性を認識できない可能性があり、特に大規模なデータセットの場合、実行計画の効率が低下する可能性があります。 対照的に、LEFT JOIN
アプローチを使用すると、オプティマイザーはより効率的な戦略を採用できます。 したがって、常に問題があるわけではありませんが、OR
内の JOIN
条件は慎重に検討し、最適なパフォーマンスを得るためにリファクタリングする必要があります。
以上がパフォーマンスを向上させるために「OR」条件を使用して SQL INNER JOIN クエリを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。