Table Variable 成效能殺手?

前言:
  在很多時候我很愛把選取清單放到 Table 變數中,大多數狀況下他是有效能的提升的
而且 Table 有著只在當下執行的 scope 有效,離開後就自動失效,所以我不用清理他,且在使用過程中不會被其它人操作到裡面的值的好處。
  但在昨天使用時就遇到了效能瓶頸... 我從員工資料庫撈取目前在職員工的清單並放到 Table Variable 中,然後其它查詢式子再去透過該列舉清單去撈取我想要的員工的相關資料,結果發現他執行了 40 分鐘多才跑完... 但我如果在該撈取變數上直接使用子查詢來進行在職員工的列舉,並撈取我要的資料,卻跑不到十分鐘,這差異完全打翻我的印象,讓我開始思考差異點究竟為何....

  因為我不是 DBA 出身,所以資料庫很多的效能優化我並不是那麼的懂,只好土法煉鋼請出 SQL Server 的執行計劃,一開始我是先使用估計執行計劃(因為兩個的執行時間加總快一個小時,不希望浪費生命在上面,先使用估計的),但從中看不出差異,只好讓他真的執行,然後使用實際執行計劃去確認可能原因。
  跑完結果後,兩邊最主要的差異,只有子查詢的上面有平行處理的圖示,其餘的都類似,此時發現我的寫法使用了 Table Variable 時,他並不會進行任何平行處理,所以我的電腦雖然是 i5 + HT ,但他也只用第一顆核心作運算,導致其執行十分緩慢 (如果是我家的電腦,說不定會差異更大,因為家裡是用 i7 XD)
  後來找了一些文件,就留在附註供大家參考
  總之 Table Variable 不是萬能丹,在效能提升上他的幫助有限,主要是他能切割 SCOPE ,避免其它 SCOPE 的操作上面的資料,但如果你能保證你建立的暫存資料表同一時間只有你會操作,那使用 temp table 對效能的提升還是會比使用 table variable 來得有幫助。

本來我想截圖來讓大家看到我昨天遇到的問題,但有點忘了昨天是卡哪裡,現在試不出來
如果有試出來再補圖給大家
(昨天改這個改到快抓狂,主要是我的觀念錯誤,太愛 Table Variable 了!)

Reference:
SQL Sever Table Variable 龜速問題
Query performance and table variables

留言

這個網誌中的熱門文章

DB 資料庫呈現復原中

Outlook 刪除大量重覆信件

[VB.Net] If vs IIf ,兩者的差異