我有三個表:SQL查詢執行快捷方式或邏輯?
SmallTable
(id int, flag1 bit, flag2 bit)
JoinTable
(SmallTableID int, BigTableID int)
BigTable
(id int, text1 nvarchar(100), otherstuff...)
SmallTable
有,頂多幾十記錄。 BigTable
已經有幾百萬了,實際上是UNION在這個數據庫中的一張表,在同一臺服務器上的另一個數據庫中有一張表。
這裏的加入邏輯:
SELECT * FROM
SmallTable s
INNER JOIN JoinTable j ON j.SmallTableID = s.ID
INNER JOIN BigTable b ON b.ID = j.BigTableID
WHERE
(s.flag1=1 OR b.text1 NOT LIKE 'pattern1%')
AND (s.flag2=1 OR b.text1 <> 'value1')
平均加入尺寸爲幾千元的結果。顯示的所有內容都被索引。
對於大多數SmallTable
記錄,flag1
和flag2
設置爲1
,所以真的沒有必要,甚至訪問BigTable.text1索引,但SQL Server不無論如何,導致代價高昂的索引掃描和嵌套循環。
有沒有更好的方式來暗示到SQL Server,如果flag1
和flag2
都被設置爲1
,它應該甚至懶得看text1
?
其實,如果我可以在這些情況下完全避免與BigTable的連接(JoinTable被管理,所以這不會產生問題),這將使這個關鍵查詢更快。
+1有趣的問題。希望能夠從這裏學到更多! – AdaTheDev 2010-01-25 21:50:11
你提到了一個關於'BigTable'的索引掃描,這是一個視圖。它是索引視圖還是索引掃描在基礎表上執行?你可以在這裏發佈查詢計劃嗎? – Quassnoi 2010-01-27 17:03:41