簡體   English   中英

存儲過程中的IF / ELSE性能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM