2014-01-30 42 views

回答

8

不,應該沒有區別。 EXISTS只要找到一個匹配的行,就立即退出。這就是爲什麼它始終優於(select COUNT(*) from ...) > 0 - a COUNT將強制所有行被考慮。

如果您創建以下四個查詢:

select * from sys.objects 
select top 1 * from sys.objects 
select 1 where exists(select * from sys.objects) 
select 1 where exists(select top 1 * from sys.objects) 

並打開執行計劃,你會看到第二個查詢生成包含TOP操作的執行計劃。第3次和第4次查詢產生相同的計劃。 TOP被忽略。

+0

謝謝。但是,通過在SQL SERVER 2012上添加TOP(1),我發現了顯着的性能提升。從20秒到1秒。 – user960567

+1

你確定你做了一個公平的測試嗎?人們犯的最常見的錯誤是僅僅依次運行一個查詢,忘記了在第一個查詢運行後SQL Server可能仍然將表緩存在內存中,所以第二個查詢從中受益。 –

+0

我100%確定。實際上,我每隔15分鐘就會有一些後臺服務。在同一個SP採取超過20秒之前。現在只需添加TOP(1)就可以提高性能。注意我有,如果存在而不是在哪裏存在。但是,謝謝任何方式,我得到了答案。 – user960567

-1

當您添加TOP 1時,它不會繼續到其他行。這是造成差異的原因。否則它會從頭到尾讀取整個表格。

要檢查記錄是否存在,您不需要它,因爲您顯然要添加where子句。這可能會有很小的差異。通過使用索引可以獲得真正的性能差異。

只有按順序使用TOP事宜。

+0

謝謝。但我只需要檢查一行是否存在和/或不存在。 – user960567

相關問題