1. ホーム
  2. sql

[解決済み] INNER JOINの条件に'OR'を入れるのは悪い考えか?

2022-09-05 04:01:56

質問

非常に遅いクエリの速度を改善しようとする場合 (いくつかの

を改善するために、SQL Server 2008 上で、それぞれ ~50,000 行しかない 2 つのテーブルに対するクエリを実行したところ、その問題を OR というように内部結合にある

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

これを左結合の等価なペアに変更したのがこちらです。

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

...そして、クエリは約1秒で実行されるようになりました!

一般に OR を付けるのは一般的に良くないのでしょうか? それとも、私のテーブルのレイアウトに何らかの運がないだけなのでしょうか?

どのように解決するのですか?

このような JOIN には最適化されません。 HASH JOIN または MERGE JOIN .

2つの結果セットを連結して表現することができます。

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

のように、それぞれが等幅結合であるにもかかわらず SQL Server のオプティマイザは、あなたが書いたクエリでそれを見るほど賢くないのです(論理的には等価ですが)。