臨時表與表變數

2021-07-09 01:39:17 字數 1363 閱讀 3218



臨時表、表變數的比較

1、臨時表

臨時表包括:以#開頭的區域性臨時表,以##開頭的全域性臨時表。

a、儲存

不管是區域性臨時表,還是全域性臨時表,都會放存放在tempdb資料庫中。

b、作用域

區域性臨時表:對當前連線有效,只在建立它的儲存過度、批處理、動態語句中有效,類似於c語言中區域性變數的作用域。

全域性臨時表:在所有連線對它都結束引用時,會被刪除,對建立者來說,斷開連線就是結束引用;對非建立者,不再引用就是結束引用。

但最好在用完後,就通過drop table 語句刪除,及時釋放資源。

c、特性

與普通的表一樣,能定義約束,能建立索引,最關鍵的是有資料分布的統計資訊,這樣有利於優化器做出正確的執行計畫,但同時它的開銷和普通的表一樣,一般適合資料量較大的情況。

有乙個非常方便的select ... into 的用法,這也是乙個特點。

2、表變數

a、儲存

表變數存放在tempdb資料庫中。

b、作用域

和普通的變數一樣,在定義表變數的儲存過程、批處理、動態語句、函式結束時,會自動清除。

c、特性

可以有主鍵,但不能直接建立索引,也沒有任何資料的統計資訊。表變數適合資料量相對較小的情況。

必須要注意的是,表變數不受事務的約束,

與臨時表相比,表變數存在下列缺陷:

•在表變數上不能建立非聚集索引(為 primary 或 unique 約束建立的系統索引除外)。與具有非聚集索引的臨時表相比,這可能會影響查詢效能。

•表變數不像臨時表那樣可以維護統計資訊。在表變數上,不能通過自動建立或使用 create statistics 語句來建立統計資訊。因此,在大表上進行複雜查詢時,缺少統計資訊可能會妨礙優化器確定查詢的最佳計畫,從而影響該查詢的效能。

•在初始 declare 語句後不能更改表定義。

•表變數不能在 insert exec 或 select into 語句中使用。

•表型別宣告中的檢查約束、預設值以及計算所得的列不能呼叫使用者定義的函式。

•如果表變數是在 exec 語句或sp_executesql儲存過程外建立的,則不能使用 exec 語句或sp_executesql儲存過程來執行引用該錶變數的動態 sql server 查詢。由於表變數只能在它們的本地作用域中引用,因此 exec 語句和sp_executesql儲存過程將在表變數的作用域之外。但是,您可以在 exec 語句或sp_executesql儲存過程內建立表變數並執行所有處理,因為這樣表變數本地作用域將位於 exec 語句或sp_executesql儲存過程中。

表變數與臨時表

什麼情況下使用表變數?什麼情況下使用臨時表?表變數 declare tb table id int identity 1,1 name varchar 100 insert tb select id,name from mytable where name like zhang 臨時表 select...

SQL 表變數與臨時表

表變數在sql server 2000中首次被引入。表變數的具體定義包括列定義,列名,資料型別和約束。而在表變數中可以使用的約束包括主鍵約束,唯一約束,null約束和check約束 外來鍵約束不能在表變數中使用 定義表變數的語句是和正常使用create table定義表語句的子集。只是表變數通過de...

mysql表變數臨時表 表變數和臨時表詳解

首先讓我們來看看什麼是表變數和臨時表。sql server 表變數 1.初識表變數 表變數在sql server 2000中首次被引用。表變數的定義和建立乙個表大致相同,只不過是使用declare variable而不是create table,表變數定義包括列定義,列名,資料型別和約束 可用的約束...