什麼情況下使用表變量?
什麼情況下使用臨時表?
---------------------------------------------------------------
表變量只存放在內存中,臨時表需要寫磁盤。所以一般情況下,用表變量會快些。
用法不太一樣,有些時候用表變量更方便。
具體的再看SQL 2000的幫助。試用下就知道了。
---------------------------------------------------------------
個人觀點:
1、表變量缺省放在內存,速度快,所以在觸發器,存儲過程裡如果數據量不大,應該用表變量。
2、臨時表缺省使用硬盤,一般來說速度比較慢,那是不是就不用臨時表呢?也不是,在數據量比較大的時候,如果使用表變量,會把內存耗盡,然後使用TEMPDB的空間,這樣主要還是使用硬盤空間,但同時把內存基本耗盡,增加了內存調入調出的機會,反而降低速度。這種情況建議先給TEMPDB一次分配合適的空間,然後使用臨時表。
---------------------------------------------------------------
膚淺理解:
表變量:需要事先知道表結構
普通臨時表:只在當前會話中可用與表變量相同 into一下就可以了,方便
全局臨時表:可在多個會話中使用存在於temp中需顯示的drop
---------------------------------------------------------------
要從表變量的作用域,支持不支持的操作,機器內存大小等幾方面考慮。
如:
.表變量相當於ADO的RECORDSET,速度比臨時表快得多。
表變量不能用在下列語句中:
INSERT INTO table_variable EXEC 存儲過程。
SELECT select_list INTO table_variable 語句。
在定義 table 變量的函數、存儲過程或批處理結束時,自動清除 table 變量。
但臨時表支持。
.表變量速度比臨時表快得多(如果內存足夠)
如果數據量不大:
微軟 BOOK ON LINE 內說:盡可能使用表變量而不使用臨時表
---------------------------------------------------------------
貼出來看看:
盡可能使用表變量而不使用臨時表。table 變量有以下優點:
table 變量的行為類似於局部變量,有明確定義的作用域。該作用域為聲明該變量的函數、存儲過程或批處理。
在其作用域內,table 變量可像常規表那樣使用。該變量可應用於 SELECT、INSERT、UPDATE 和 DELETE 語句中用到表或表的表達式的地方。但是,table 不能用在下列語句中:
INSERT INTO table_variable EXEC 存儲過程。
SELECT select_list INTO table_variable 語句。
在定義 table 變量的函數、存儲過程或批處理結束時,自動清除 table 變量。
在存儲過程中使用表變量與使用臨時表相比,減少了存儲過程的重新編譯量。
涉及表變量的事務只在表變量更新期間存在。這樣就減少了表變量對鎖定和記錄資源的需求。
不支持在表變量之間進行賦值操作。另外,由於表變量作用域有限,並且不是持久數據庫的一部分,因而不受事務回滾的影響。
---------------------------------------------------------------
1.表變量在內存中,臨時表存放在硬盤上;
2.用臨時表要考慮鎖不鎖表的問題;
3.數據量太大應該用臨時表。