ホームページ > データベース > mysql チュートリアル > パフォーマンスを向上させるために「OR」条件を使用して SQL INNER JOIN クエリを最適化するにはどうすればよいですか?

パフォーマンスを向上させるために「OR」条件を使用して SQL INNER JOIN クエリを最適化するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-10 18:56:42
オリジナル
221 人が閲覧しました

How Can I Optimize SQL INNER JOIN Queries with 'OR' Conditions for Improved Performance?

「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:

を使用して結合された 2 つの個別の結合と同等です。
<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 サイトの他の関連記事を参照してください。

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