[英]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.