2014-09-02 84 views
3

我有一個巨大的存儲過程,它將表中的數據收集到3個臨時表(表變量)中。無限期執行select語句的存儲過程

@table1: 50,000 records 
@table2: 23,000 records 
@table3: 15,000 records 

準備數據後,將存儲過程執行從這些臨時表和一些物理表爲XML格式並返回到客戶端轉換數據中的一個巨大的選擇語句(180線)。

由於項目的機密性,我無法在此處發佈存儲過程。存儲過程卡在這個select聲明。即使運行存儲過程24小時後,它也沒有完成執行。

然後我換成本地臨時表(#table1, #table2, #table3)所有表變量。令我驚訝的是,存儲過程用相同的數據成功執行。

我無法理解兩種方法的區別;以及爲什麼存儲過程無限期執行table variables

+0

誰告訴你表變量駐留在內存中? http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/03/30/sql-server-table-variable-vs-local-temporary-table.aspx - 表格變量可以存放在光盤上,在tempdb中確切地說。 – TomTom 2014-09-02 08:27:16

+0

@TomTom感謝您糾正我,編輯我的帖子 – Jaguar 2014-09-02 08:43:08

回答

2

表變量是有點棘手,因爲

  1. 他們沒有與它們相關的
  2. SQL Server查詢優化器的統計數據 - 由於缺乏對這些表變量的統計 - 總是假定它們只包含一行

這些「缺點」可能導致查詢優化器誤入歧途 - 看起來非常糟糕!假設一行可能會導致效率很低的執行計劃,如果在這些表變量中確實有更多的行。

如果您使用5或10行 - 沒有biggie - 但在您的情況下,您使用成千上萬的行,這是顯着不同於一行。

因此,在這種情況下,我總是建議使用「正確」的臨時表,而不是表變量。

+0

事實上錯誤,因爲您可以通過一個表變量索引 - 通過priamry鍵 - 索引。 http://blogs.msdn.com/b/blogdoezequiel/archive/2012/12/01/table-variables-and-row-estimations.aspx#.VAV_QPmSyZA也解釋了假設的1行問題以及如何解決它。並非所有的都是那麼暗淡...... – TomTom 2014-09-02 08:26:28

+0

@TomTom:好的 - 你*可以*索引表變量。但是根據[這篇肯德拉小博客文章](http://www.brentozar.com/archive/2014/04/table-variables-good-temp-tables-sql-2014/),即使在SQL Server 2014中,table變量**沒有統計支持** - 所以行估計將**關閉**大時間..... – 2014-09-02 08:30:47

相關問題