[英]IF/ELSE Performance in Stored Procedures
我發現這篇文章解釋了在SP中使用IF / ELSE語句會導致性能下降,而不是為每個“分支”使用單獨的SP。 http://sqlmag.com/t-sql/if-statements-and-stored-procedure-performance
但我有一個SP,從相同的表中選擇相同的列,只有WHERE子句根據存在的變量而改變。 這是一個例子:
IF @Variable1 IS NOT NULL
BEGIN
SELECT
*
FROM
dbo.Table1
WHERE
Column1 = @Variable1
END
ELSE IF @Variable1 IS NULL AND @Variable2 IS NOT NULL
BEGIN
SELECT
*
FROM
dbo.Table1
WHERE
Column1 = Column1
AND
Column2 = @Variable2
END
所以在這個例子中,最好有2個單獨的SP來處理不同的變量,還是可以將它們全部放在這樣的一個? (我知道使用SELECT *
不是很好的做法。我只是為了舉例而做了)
通常情況下,我不擔心這一點,盡管您應該查看Mikael Eriksson引用的白皮書,該白皮書有關於此主題的大量有用信息。 但是,我會刪除else
分支中的Column1 = Column1
語句,因為這可能會使優化器混淆。
本文所指的是存儲過程在第一次運行時編譯的事實。 這可能會產生不正常的結果。 例如,如果第一次調用表時表是空的,那么優化器可能更喜歡將全表掃描更改為索引查找,這會因表變大而變壞。
問題可能是其中一個分支獲得了次優的性能計划,因為數據在第一次調用時並不典型。 如果其中一個值為NULL
則尤其如此。 這不僅發生在if
,而且是您需要對問題敏感的一種情況。
我會推薦以下內容:
對於您的示例, table1(column1)
和table1(column2)
上的索引就足夠了。
建議的摘要不是在您發現問題之前解決此問題。 把邏輯分為兩個存儲過程應該是固定 ,你實際看到的,而不是可能永遠存在先發制人預問題一個問題。 如果您采用雙過程方法,您仍然可以使用單個接口來調用每個過程,因此您仍然擁有相同的API。 換句話說,一個程序應該變成三個而不是兩個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.