我有一個測試語句來檢查我的數據的有效性是這樣的:爲什麼<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
部分造成如此大的差異......
如果您的UNION表現良好的兩個查詢的性能如何? – mbeckish