2013-03-12 66 views
0

在過去,我們有一個存儲功能,基本上是這樣的:的SQL Server 2008 R2 - EXISTS VS TOP 1

IF EXISTS (SELECT * FROM ...) RETURN 1 

凡SELECT將需要相當長的時間來執行,但是,與EXISTS纏繞我們很快完成。

但是,我們現在需要在應用程序中的「證書」,「給我一個例子,你爲什麼返回1」。我們將查詢改爲:

DECLARE @cert BIGINT 
SELECT TOP 1 @cert = id FROM ... 
RETURN @cert 

但是,現在需要更長的時間。我們的查詢中沒有ORDER BY子句。

SQL Server仍然檢索所有行,然後只選擇第一個? 我們監督了一些事情嗎?我們不應該有相同的速度? 爲什麼第二個查詢需要比第一個查詢多得多的時間? (時間的大小)

+1

您是否嘗試過使用數據執行計劃? – 2013-03-12 12:22:03

+3

這裏有什麼問題...... – Mingebag 2013-03-12 12:22:48

+0

我們並不是真的只能執行這個函數(是的,不是最優的......),並且如果我們查看基本過程的查詢計劃,這個過程位於堆棧跟蹤調用的某處我們的功能,我們只得到基本程序的計劃... – 2013-03-12 12:24:23

回答

3

你的if檢查是否存在匹配條件,並在找到匹配條件後停止,但從不必返回結果。我相信,只要你選擇了一套,它就必須返回一些東西,並根據設置,可能需要一段時間的最高評價?

如果需要很長時間,我會調查執行計劃並查看是否有任何索引可供您添加。

+2

我會給同樣的答案完全同意! – Mingebag 2013-03-12 13:20:30