[解決済み] 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
のオプティマイザは、あなたが書いたクエリでそれを見るほど賢くないのです(論理的には等価ですが)。
関連
-
[解決済み] SQL ServerにおけるLEFT JOINとLEFT OUTER JOINの比較
-
[解決済み] SQL ServerでJOINを使用してUPDATE文を実行するにはどうすればよいですか?
-
[解決済み] JOINとINNER JOINの違いについて
-
[解決済み] SQL Serverでシングルクォートをエスケープするにはどうすればよいですか?
-
[解決済み] INNER JOIN ON vs WHERE句
-
[解決済み] INNER JOINよりもCROSS APPLYを使用すべきなのはどのような場合ですか?
-
[解決済み] Postgres でサブクエリを使用してテーブルの行を更新する
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
-
[解決済み] SQL ServerでINNER JOINを使用して削除するにはどうすればよいですか?
-
[解決済み】SQL ServerにおけるINNER JOINとLEFT JOINのパフォーマンス比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
SQLラーニングノート--オペランドには1つのカラムが必要です。
-
解決策:ユーザー root で localhost:3306 にある MySQL に接続できませんでした。
-
executeQuery()ソリューションでデータ操作文を発行できない。
-
[解決済み] LINQでInclude()は何をするのですか?
-
[解決済み] 各GROUP BYグループの最初の行を選択しますか?
-
[解決済み] SQL Server の CASE ステートメントで OR がサポートされていない。
-
[解決済み] 文字列の一部をUPDATEおよびREPLACEする。
-
[解決済み] DISTINCTでCOUNT(*)を選択する
-
[解決済み] SQL ServerでGROUP BYを使って文字列を連結する方法とは?
-
[解決済み] T-SQL文の接頭辞Nの意味と使うべきタイミングは?