簡體   English   中英

使用OR進行聯接-查詢計划器選擇嵌套循環

[英]JOIN with OR - Query Planner Choosing Nested Loops

我想知道為什么MS SQL Server查詢計划程序創建嵌套循環而不是為具有OR條件的JOIN選擇聯合。

注意:從SO上搜索,似乎不是特定於MSSQL的

例如

SELECT * FROM TableA a
JOIN TableB b
ON a.One = b.One 
OR a.Two = b.Two

以我的情況而言,這需要花費6分鍾的時間(兩個表都索引了一個和兩個)

SELECT * FROM TableA a
JOIN TableB b
ON a.One = b.One

UNION -- Not ALL, as need to remove duplicates

SELECT * FROM TableA a
JOIN TableB b
ON a.Two = b.Two

需要2秒。

我知道第一個花這么長時間的原因(由於嵌套循環,兩個聯合在哪里使用索引),但是我想知道為什么查詢計划程序沒有選擇UNION作為執行計划?

使用UNION時,我需要注意一些注意事項嗎?

為什么未在查詢計划器中實現此邏輯?

僅僅是為了簡化查詢計划程序的代碼(因為它可能已經很復雜了),他們還沒有進行優化的原因,還是因為我沒有意識到其他一些警告?

這是選擇性問題嗎? SQL Server喜歡索引具有高度的選擇性。 一個謂詞將始終被視為比兩個謂詞“或”具有更高的選擇性,您的情況的不同可能是使用索引與否之間的差異。

有關選擇性的冗長文章請參見Bart Duncan的SQL Weblog 查詢優化基礎知識:密度,謂詞,選擇性和基數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM