Sql-Server

在 T-SQL 中使用 IF 會削弱或破壞執行計劃記憶體?

  • December 20, 2016

有人建議我在 t-SQL 批處理中使用 IF 語句對性能不利。我試圖找到一些確認或驗證這個斷言。我正在使用 SQL Server 2005 和 2008。

斷言是使用以下批次:-

IF @parameter = 0
BEGIN
 SELECT ... something
END

ELSE
BEGIN
 SELECT ... something else
END

SQL Server 無法重新使用生成的執行計劃,因為下一次執行可能需要不同的分支。這意味著 SQL Server 將從執行計劃中完全消除一個分支,因為它已經可以確定目前執行需要哪個分支。這是真的嗎?

此外,在這種情況下會發生什麼:-

IF EXISTS (SELECT ....)
BEGIN
 SELECT ... something
END

ELSE
BEGIN
 SELECT ... something else
END

無法提前確定將執行哪個分支?

SQL Server 通過忽略儲存過程中的條件分支來優化儲存過程的查詢計劃的編譯過程。計劃將根據第一次執行時使用的參數生成,如果分支的參數不同,這將導致問題。

我會將每個分支的 SQL 放入它們自己的儲存過程中,以便生成的計劃基於該分支參數的實際使用情況。

唯一的捷徑將是IF 1 = 1

@parameter 和 EXISTS 仍然需要處理“一般情況”(@parameter = 42比如說)

這麼說…實際執行計劃以及擷取重新編譯事件的分析器是什麼意思?(根據Jao的回答,我不喜歡估計的計劃)

引用自:https://dba.stackexchange.com/questions/9835