INF:常見問題集 - SQL Server 2000 - 資料表變數

文章翻譯 文章翻譯
文章編號: 305977 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

結論

本文將會為您解答 SQL Server 2000 中與資料表變數相關的一些常見問題集 (FAQ)。

如果要讀取《SQL Server 線上叢書》對於資料表變數的說明,請造訪下列 Microsoft 網站:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_ta-tz_7ysl.asp

其他相關資訊

問 1:為什麼已經可以使用暫存資料表,還要引入資料表變數呢?

答 1: 資料表變數具有下列優於暫存資料表的優點:
  • 如同《SQL Server 線上叢書》的<資料表>文章所提及,資料表變數 (例如區域變數),在自動清除的底部都會有定義良好的範圍。
  • 與暫存資料表相較之下,資料表變數需要重新編譯的預存程序比較少。
  • 只有在更新資料表變數的期間,才會進行與資料表相關的異動。所以,資料表變數需要的鎖定和記錄資源也比較少。因為資料表變數的範圍有所限制,而且不屬於持續資料庫的一部分,所以異動復原不會對它們造成影響。
問 2:「與暫存資料表相較之下,資料表變數需要重新編譯的預存程序比較少」這句話是什麼意思?

答 2: 下列文章將告訴您為什麼要重新編譯預存程序的原因:

243586 Troubleshooting stored procedure recompilation
<因為特定暫存資料表作業而進行重新編譯>一節也會列出一些需求,以避免因為暫存資料表,而必須進行重新編譯。這些限制不適用於資料表變數。

資料表變數會與建立它們的批次檔完全隔離,所以當執行 CREATE 或 ALTER 陳述式時,並不會發生任何 re-resolution (暫存資料表可能會發生這種情形)。暫存資料表必須具有這個 re-resolution,才可以從巢狀預存程序參考資料表。資料表變數可以完全避免這種情形,因此預存程序可以使用已編譯的計劃,藉以節省處理預存程序的資源。

問 3:資料表變數有哪些缺點?

答 3: 將資料表變數與暫存資料表作比較,資料表變數有下列缺點:
  • 除了針對 PRIMARY 或 UNIQUE 條件約束建立的系統索引以外,也不能在資料表變數上建立非叢集索引。在與具有非叢集索引的暫存資料庫作比較時,這一點可能會影響查詢效能。
  • 暫存資料夾維護統計資料的能力優於資料表變數。無法透過自動建立或使用 CREATE STATISTICS 陳述式,在資料表變數上建立統計資料。因此,對於大型資料表上的複雜查詢,缺少統計資料可能會阻止最佳化器判斷查詢的最佳計劃,如此便會影響該查詢的效能。
  • 在初始的 DECLARE 陳述式之後,便無法再變更資料表定義。
  • 無法在 INSERT EXEC 或 SELECT INTO 陳述式中使用資料表變數。
  • CHECK 條件約束、DEFAULT 值和資料表類型宣告中的計算資料行無法呼叫使用者定義功能。
  • 如果資料表變數是在 EXEC 陳述式或 sp_executesql 預存程序以外建立,您就無法使用 EXEC 陳述式或 sp_executesql 預存程序,來執行參照資料表變數的動態 SQL Server 查詢。因為只可以在本機範圍中參照資料表變數,所以 EXEC 陳述式和 sp_executesql 預存程序可能不在資料表變數的範圍內。但是,您還是可以建立資料表變數,並執行所有 EXEC 陳述式或 sp_executesql 預存程序中的所有處理,因為之後的資料表變數本機範圍就會在 EXEC 陳述式或 sp_executesql 預存程序中。
問 4:與暫存或永久資料表作比較,資料表變數僅供記憶的結構可以確保較佳的效能,是因為它們是保留在實體硬碟上的資料庫的關係嗎?

答 4: 資料表變數並不是僅供記憶的結構。因為資料表變數可保留的資料可能多於記憶體的存放量,所以在磁碟中必須擁有儲存資料的空間。資料表變數建立於與暫存資料表類似的 tempdb 資料庫中。如果有記憶體可供使用,則當資料表變數和暫存資料表尚在記憶體 (資料快取區) 時,便會予以建立及進行處理。

問 5:我一定要使用資料表變數,而不能使用暫存資料表嗎?

答 5: 這個問題的回答將視下列三個因素而有所不同:
  • 插入資料表的列數。
  • 重新編譯儲存查詢的數量。
  • 查詢類型、其與索引的相依性,和效能的統計資料。
在某些情況下,將具有暫存資料表的預存程序分解成較小的預存程序,以便在較小單位上重新編譯,是很有幫助的。

一般而言,除非您有大量的資料或必須重複使用資料表,否則,您都可以隨心所欲地使用資料表變數。在這種情況下,您可以在暫存資料表上建立索引來增加查詢效能。但是,每個案例都可能有所不同。Microsoft 建議您進行測試,以便確定針對特定查詢或預存程序而言,資料表變數是否比暫存資料表更有幫助。

沒有找到心中問題的答案?請造訪下列 Microsoft SQL Server 新聞群組:Microsoft SQL Server Newsgroups

您是否對本文或其他「Microsoft SQL Server 知識庫」文件有任何意見呢?請來信 SQLKB@Microsoft.com 表達您的意見。

屬性

文章編號: 305977 - 上次校閱: 2006年11月20日 - 版次: 5.1
這篇文章中的資訊適用於:
  • Microsoft SQL Server 2000 Standard Edition
關鍵字:?
kbfaq kbinfo KB305977
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com