2013-05-15 129 views
2

我有一個測試語句來檢查我的數據的有效性是這樣的:爲什麼<columnname> IS NULL需要很長時間?

SELECT id, owner_id 
FROM table 
WHERE ISNULL(owner_id,0)=0 
    OR (owner_id NOT IN(SELECT lid FROM actors) AND owner_id <> -65536) 

OR

SELECT id, owner_id 
FROM table 
WHERE owner_id IS NULL 
    OR (owner_id NOT IN(SELECT lid FROM actors) AND owner_id <> -65536) 

兩個語句拿1分,並在我的測試情況下進行45秒。

owner_id應該是一個有效的int> 0,所以我的SQL語句應該檢查它,如果我有無效的數據toshow me。

聲明按預期工作,但需要很長時間。 我在第一次嘗試之後在該列上添加了一個sql索引,並查看是否有任何改進。不用找了。

如果我只是這樣做:

SELECT id, owner_id 
FROM table 
WHERE (owner_id NOT IN(SELECT lid FROM actors) AND owner_id <> -65536) 

然後查詢執行,在不到1秒。

table約有7K條記錄,actors約5K條記錄。

所以有人知道爲什麼IS NULL?驗證需要很長時間?我可以對此做任何改進嗎?

EDIT

SELECT id, owner_id 
FROM table 
WHERE ISNULL(owner_id,0)=0 

執行以1秒爲好,所以它是採取這樣的長的時間語句的組合。 所以它不是ISNULL驗證,但有點在我的WHERE語句組合。

修訂

試過@mbeckish建議

SELECT lid, lownerid 
FROM xapptqadr 
WHERE ISNULL(lownerid,0)=0 

UNION 

SELECT lid, lownerid 
FROM xapptqadr 
WHERE (lownerid NOT IN(SELECT lid FROM kractor) AND lownerid <> -65536) 

會在不到1秒錶現不如預期。 但我真的不知所措OR部分造成如此大的差異......

+2

如果您的UNION表現良好的兩個查詢的性能如何? – mbeckish

回答

4

這不是空檢查。這是OR。尋找這個或者在查詢中經常會破壞良好的索引使用,導致查詢性能不佳。以下不會得到相同的結果嗎?

SELECT id, owner_id 
FROM table 
WHERE owner_id NOT IN(SELECT lid FROM actors WHERE lid IS NOT NULL) AND owner_id <> -65536 
+0

我明白'OR'會打破我的表現。但是您的語句不會給出與'owner_id = NULL'的行不會成爲結果集一部分的結果相同的結果。 – YvesR

+0

由於沒有其他答案,並且您向我提供有關性能問題的正確提示,因此我將其標記爲答案。 – YvesR

+0

@YvesR不會將其標記爲不適合您的答案。離開它沒有答案是完全沒問題 –

相關問題