2016-05-17 158 views
-4

我想知道哪一個在理論上快得多?「DELETE TOP(1)FROM @TEMP」或「DELETE FROM #TEMP WHERE ..」更快嗎?

IF EXISTS(SELECT TOP 1 1 FROM @ControlOrderList) 
BEGIN 
    SET @RowNumber= (SELECT TOP 1 id FROM @ControlOrderList) 
    ... 
    DELETE @ControlOrderList WHERE [email protected] 
END 

還是這快得多?

IF EXISTS(SELECT TOP 1 1 FROM @ControlOrderList) 
BEGIN 
    SET @RowNumber= (SELECT TOP 1 id FROM @ControlOrderList) 
    ... 
    DELETE TOP 1 @ControlOrderList 
END 

並且使用DELETE TOP 1安全嗎?我可以信任SQL-SERVER刪除「SELECT TOP 1 .....」中的行嗎?

+0

第二條語句是否真的有效?要比較查詢,只需查看他們的實際執行計劃並查看哪些操作員成本最低 –

+4

不要在沒有指定訂單的情況下使用「top N」,而在第二種情況下,您不能保證您將同一行。 – Arvo

+6

我建議你不要再要求我們幫助你學習成千上萬的「X比Y更快」的規則,因爲通常有很多細微之處,而且你不會通過記憶成千上萬的規則來編寫性能良好的代碼。你可以通過寫*清*代碼來完成正確的任務,然後*測量*性能。如果它符合你的*要求*,不要擔心你是否可以更快地寫下它。或者換一種說法,請閱讀Eric Lippert的[哪個更快?](https://ericlippert.com/2012/12/17/performance-rant/) –

回答

1

的SQL Server是爲IF EXISTS(SELECT * FROM TABLE)優化,切換到應該更快理論上

SELECT TOP 1 id FROM @ControlOrderList是不確定的,你有沒有ORDER BY條款。這意味着你甚至不能保證第一條語句每次都會刪除同一行。

您需要查看執行計劃,但我猜測,假設id已編入索引,那麼一旦包含順序,兩者都會執行相同的操作。