2010-08-30 52 views
2

我已經找到了我的自我在一個泡菜。我只有一列(壓縮或包含列表)的表或多或少varchar(25),但事情是我沒有時間索引它們,然後在主查詢中使用它們,並且取決於它的重要性,我不知道每個表中有多少行。所有這些核心的基礎表大約有140萬行和50列。舊IN與存在與左連接(哪裏___是或不是無);表現

我的假設如下:

IN shouln't的情況下有很多的值(行)可用於返回,因爲它看起來雖然連續的值,對不對? (IN上的子查詢不直接傳遞的值)

聯接(INNER列入和LEFT和檢查空值時supression)是最好的大型數據集(超過1K行左右馬赫)

EXISTS一直關注我,因爲它似乎在爲每一行做一個子查詢(全部140萬?喲)。

我的直覺告訴我們,如果可行的話,得到壓縮表的計數並且使用IN(對於子1k行)和INNER/LEFT聯接(對於1k行以上的抑制表)注意,我將被抑制的字段將是大型基表中的索引,但是抑制表不會是。思考?

在此先感謝您提供任何意見和/或建議。

回答

6

假設TSQL意味着SQL Server, have you seen this link regarding a comparison of NOT IN, NOT EXISTS, and LEFT JOIN IS NULL?總之,只要列被比較不能爲NULL,NOT INNOT EXISTSLEFT JOIN/IS NULL更有效......

東西要記住有關的差異之間和EXISTS - EXISTS是一個布爾運算符,第一次滿足標準時返回true。儘管您在語法中看到了相關的子查詢,但EXISTS的性能要優於IN ...

此外,IN和EXISTS只檢查值比較的存在。這意味着沒有重複的記錄就像你發現在接合時...

這要看,所以如果你真的去尋找什麼執行最好的,你得考&比較一下查詢計劃在做。 ..

+0

+1良好的指標,以支持結論。 – Thomas 2010-08-30 20:46:29

+0

@Thomas:thx,提醒我推動Quassnoi解決當列可以爲空時最好的地址... – 2010-08-30 21:01:51

0

使用什麼技術並不重要,如果在應用過濾器或連接的表上沒有索引,系統將執行表掃描。

RE:存在

這不一定是系統將做一個子查詢的所有140萬行的情況。 SQL Server足夠智能地執行內部Exists查詢,然後對主查詢進行評估。在某些情況下,Exists可以執行與Join相同或更好的操作。