我有一臺現有的SP在我的生產服務器上運行。我發現從變化IF EXIST(SELECT 1 FROM)
到IF EXIST(SELECT TOP 1 1 FROM)
和IF NOT EXIST(SELECT 1 FROM)
到IF NOT EXIST(SELECT TOP 1 1 FROM)
一些顯着的性能增益。唯一的區別是TOP 1個關鍵字。只是想知道改變這是否有副作用?正在更改IF EXIST(SELECT 1 FROM)到IF EXIST(SELECT TOP 1 FROM)是否有任何副作用?
3
A
回答
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
被忽略。
-1
當您添加TOP 1時,它不會繼續到其他行。這是造成差異的原因。否則它會從頭到尾讀取整個表格。
要檢查記錄是否存在,您不需要它,因爲您顯然要添加where子句。這可能會有很小的差異。通過使用索引可以獲得真正的性能差異。
只有按順序使用TOP事宜。
+0
謝謝。但我只需要檢查一行是否存在和/或不存在。 – user960567
相關問題
- 1. select top 1 * vs select top 1 1
- 2. JavaScript if if select statement from select box
- 3. SELECT SUM(1)FROM(SELECT \t'0'as R FROM dual UNION ALL SELECT'1'as R FROM dual)
- 4. 如果EXISTS(SELECT 1 FROM#tempTable1)AND NOT EXISTS(SELECT 1 FROM#tempTable2哪裏...)
- 5. SELECT COUNT +(SELECT COUNT FROM表1 WHERE)FROM表1中的Zend
- 6. SELECT FROM表,ORDER BY IF(...)
- 7. 困惑在SELECT 1 FROM
- 8. 「SELECT 1 FROM(SELECT 1 FROM table)q」在本地機器上不工作
- 9. IF EXIST GOTO NEXT
- 10. Sql SELECT TOP 1
- 11. MYSQL IF SELECT COUNT()是否大於零SELECT * FROM表,否則返回沒有發現
- 12. 我們可以在FROM子句中使用CASE嗎? SELECT * FROM(case if if = 1 then TABLE1 else TABLE2 end)
- 13. SELECT * FROM與SELECT指定FROM
- 14. select select(*)from
- 15. select top 1 nhibernate oracle
- 16. Oracle:select * from(select table_name from ...)?
- 17. 「DELETE TOP(1)FROM @TEMP」或「DELETE FROM #TEMP WHERE ..」更快嗎?
- 18. Mysql:insert into select && where does not exist
- 19. 選擇1 FROM和if語句
- 20. SELECT SUM()FROM(SELECT(SELECT())
- 21. 軌道 - ActiveRecord的SELECT TOP 1 FIELD_NAME * FROM table_name的
- 22. JPA Select(from select)
- 23. SQL:SELECT FROM(SELECT,SELECT)
- 24. 是否有任何替代此SELECT * FROM類型WHERE tid ='1'或tid ='2';查詢?
- 25. Sql insert if row does not exist
- 26. MySQL&php PDO如何獲取:SELECT EXISTS(SELECT 1 FROM x WHERE y =:value)
- 27. ngrx/store select does not exist
- 28. INSERT if does not exist in database
- 29. LARAVEL:relation「table」不存在LINE 1:select * from「table」^(SQL:select * from「table」)
- 30. WHERE id =(SELECT parent_id FROM sametable LIMIT 1)
謝謝。但是,通過在SQL SERVER 2012上添加TOP(1),我發現了顯着的性能提升。從20秒到1秒。 – user960567
你確定你做了一個公平的測試嗎?人們犯的最常見的錯誤是僅僅依次運行一個查詢,忘記了在第一個查詢運行後SQL Server可能仍然將表緩存在內存中,所以第二個查詢從中受益。 –
我100%確定。實際上,我每隔15分鐘就會有一些後臺服務。在同一個SP採取超過20秒之前。現在只需添加TOP(1)就可以提高性能。注意我有,如果存在而不是在哪裏存在。但是,謝謝任何方式,我得到了答案。 – user960567