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)

簡稱CTE,與暫存資料表(#table)不同的是,使用CTE查詢完的當下就會從記憶體中消失
可以減少重覆計算所耗的I/O、CPU和執行時間,如果同樣的查詢需使用很多次時,非常適合使用CTE,例如分頁。

WITH [CTE名稱] ([CTE的欄位名稱A],[CTE的欄位名稱B],... ) as (SELECT [欄位1],[欄位2],...  FROM [資料表名稱])

SELECT * FROM CTE //一定要直接顯示,不直接的話就會立馬消失了,因為CTE查詢完的當下就會從記憶體中消失。


貌似這個可能比上述還要省時間一點,但是沒有測試過不太確定


參考:

https://ithelp.ithome.com.tw/articles/10225120







留言

這個網誌中的熱門文章

無法載入檔案或組件 'System.IO.Compression' 或其相依性的其中之一。

MongoDB 入門

javascript 更改屬性及創建標籤