SQL 臨時Table 和 Table變數區別 暫存Table之間的差異
臨時Table和永久Table相似
同樣是使用Create Table TableName( ... )建立Table 並且使用後在最後的時候Drop掉
臨時Table可以當作一般Table使用,如alter等
Table變數則是像於DECLARE @TableName Table( ... ) 如建立Table同樣
Table變數與臨時Table差別
1. Table變數儲存於記憶體中,使用Table變數時,SQL不會產生日誌,而臨時Table則會。
2. Table變數不允許非叢集索引
3. Table變數不允許有Default值,也不允許有約束
4. 臨時Table上的統計資料是健全可靠的,Table變數則否
5. 臨時Table有Lock限制,Table變數則沒有
使用Table變數需要考慮的就是記憶體壓力問題,如果執行的Instance較多,則需要注意記憶體消耗。
對於較小的資料和計算結果推薦使用Table變數。
一般對於較大的資料結果,會使用臨時Table,由於臨時Table是存放在Tempdb中,因此分配的空間很少,可能要對於Tempdb進行優化。
還有一種可能性會使用到臨時Table,用於建立變動名稱且欄位數不確定的Table
Create Table Table01{ ... }
DECLARE @SQL VARCHAR(MAX)
SET @SQL = 'ALTER TABLE Table01 ADD NewC VARCHAR(MAX)'
EXEC sp_executesql @SQL
----------------------------------------------------------------------------------- 補充
Select * into [#Table_name] from [資料表名稱] where 條件
同等於
CREATE TABLE [#Table_name]
(
[欄位1] 資料型態,
[欄位2] 資料型態
)
INSERT INTO #Table_name ([欄位1],[欄位2])
SELECT [欄位1],[欄位2]
FROM [資料表名稱] //要參考的資料表名稱
都可以創造一個暫存table
要注意的是一定要有# 不然會真的搞一個table出來
理論上執行完SQL Code之後就會被卸除table 但是為了保險建議還是加上drop table
@Table 則是以記憶體的變數形態存在 因此一定會消失
一般資料表運算式(Common Table Expressions, CTE)
WITH [CTE名稱] ([CTE的欄位名稱A],[CTE的欄位名稱B],... ) as (SELECT [欄位1],[欄位2],... FROM [資料表名稱])
SELECT * FROM CTE //一定要直接顯示,不直接的話就會立馬消失了,因為CTE查詢完的當下就會從記憶體中消失。
貌似這個可能比上述還要省時間一點,但是沒有測試過不太確定
參考:
https://ithelp.ithome.com.tw/articles/10225120
留言
張貼留言