T SQL系列 臨時表 表變數

2022-05-30 18:42:13 字數 3221 閱讀 4725

臨時表

臨時表與永久表相似,只是它的建立是在tempdb中,它只有在乙個資料庫連線結束後或者由sql命令drop掉,才會消失,否則就會一直存在。臨時表在建立的時候都會產生sql server的系統日誌,雖它們在tempdb中體現,是分配在記憶體中的,它們也支援物理的磁碟,但使用者在指定的磁碟裡看不到檔案。

臨時表分為本地和全域性兩種,本地臨時表的名稱都是以「#」為字首,只有在本地當前的使用者連線中才是可見的,當使用者從例項斷開連線時被刪除。全域性臨時表的名稱都是以「##」為字首,建立後對任何使用者都是可見的,當所有引用該錶的使用者斷開連線時被刪除。

臨時表可以建立索引,也可以定義統計資料,所以可以用資料定義語言(ddl)的宣告來阻止臨時表新增的限制,約束,並參照完整性,如主鍵和外來鍵約束。

臨時表在建立之後可以修改許多已定義的選項,包括:

1)新增、修改、刪除列。例如,列的名稱、長度、資料型別、精度、小數字數以及為空性均可進行修改,只是有一些限制而已。

2)可新增或刪除主鍵和外來鍵約束。

3)可新增或刪除 unique 和 check 約束及 default 定義(物件)。

4)可使用 identity 或 rowguidcol 屬性新增或刪除識別符號列。雖然 rowguidcol 屬性也可新增至現有列或從現有列刪除,但是任何時候在表中只能有一列可具有該屬性。

5)表及表中所選定的列已註冊為全文索引。

比較臨時表及表變數都可以通過sql的選擇、插入、更新及刪除語句,它們的的不同主要體現在以下這些:

1)表變數是儲存在記憶體中的,當使用者在訪問表變數的時候,sql server是不產生日誌的,而在臨時表中是產生日誌的;

2)在表變數中,是不允許有非聚集索引的;

3)表變數是不允許有default預設值,也不允許有約束;

4)臨時表上的統計資訊是健全而可靠的,但是表變數上的統計資訊是不可靠的;

5)臨時表中是有鎖的機制,而表變數中就沒有鎖的機制。

表變數

基本原則:能用表變數就用表變數.實在不行才使用臨時表

表變數主要是開銷系統的記憶體,而臨時表則使用tempdb.對於小資料量的中間資料儲存,可以使用表變數,而當需要臨時儲存的資料很大時,建議使用臨時表.

表變數建立的語法類似於臨時表,區別就在於建立的時候,必須要為之命名。表變數是變數的一種,表變數也分為本地及全域性的兩種,本地表變數的名稱都是以「@」為字首,只有在本地當前的使用者連線中才可以訪問。全域性的表變數的名稱都是以「@@」為字首,一般都是系統的全域性變數,像我們常用到的,如 @@error代表錯誤的號,@@rowcount代表影響的行數。

1、為什麼要使用表變數

表變數是從2000開始引入的,微軟認為與本地臨時表相比,表變數具有如下優點:

a.與其他變數的定義一樣,表變數具有良好的定義範圍,並會被自動清除;

b.在儲存過程中使用表變數會減少儲存過程重新編譯的發生;

c.表變數需要更少的鎖請求和日誌資源;

d.可以在表變數上使用udf,uddt,xml。

2、表變數的限制

與臨時表相比,表變數存在著如下缺點:

a.在表變數上沒有統計資訊,查詢優化器根據固定的預估值來選擇執行計畫,在資料很多的情況下,會導致查詢優化器選擇很差的執行計畫;

b.不能直接在表變數上建立索引,但可以通過建立約束(主鍵、唯一)來建立索引;

c.在declare後,不能再對錶變數進行更改;

d.不能對錶變數執行insert exec , select into語句(只針對05前的版本);

e.不能通過exec或sp_executesql來執行牽涉到表變數的動態sql語句,但如果表變數是在動態sql語句內定義的,則可以。

3、那什麼時候可以使用表變數

要使用表變數應該根據如下規則來判斷:

a.表的行數;

b.使用表變數能夠減少的重新編譯次數;

c.查詢的型別和對索引或者統計資訊的依賴程度;

d.需要生用udf,uddt,xml的時候。

其實也就說,得從實際出發,根據具體的查詢,作出具體的選擇。但是,其中很關鍵的一點,如果表的行數非常多,使用表變數其實是更費資源的。有人提出了這樣的建議:對於行數較少的情況下(小於1000行)可以使用表變數;如果行數很多(有幾萬行),則使用臨時表。

因此,在實際的開發中,應通過分別使用臨時表或表變數進行對比後,才作出決定。

4、使用表變數的誤區

對於表變數,很多人認為,表變數和其他變數一樣,只存在記憶體中,其實這是不正確的,表變數也存在tempdb中。可以通過下面例子進行對比。

create

table #temptable ( tt_col1 int

)declare

@tablevariable

table ( tv_col1 int

)select

top2

*from

tempdb.sys.objects

order

by create_date desc

drop

table #temptable

5、其他

由於表變數作用域有限,並且不是持久資料庫的一部分,因而不受事務回滾的影響。

表變數不受rollback影響,某些情況下會破壞資料的完整性。

create

table #temptable ( tt_col1 int

)declare

@tablevariable

table ( tv_col1 int

)insert

#temptable

values ( 1

)insert

@tablevariable

values ( 1

)begin

transaction

insert

#temptable

values ( 2

)insert

@tablevariable

values ( 2

)rollback

select

*from

#temptable

select

*from

@tablevariable

drop

table #temptable

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

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

SQL使用臨時表,表變數,公式表表示式

當我們使用巢狀查詢時,有時候希望把乙個查詢到的資料先儲存在乙個臨時表裡供其他查詢使用,這時候就會考慮使用臨時表,表變數,或公式表表示式 1.公式表表示式,sql中使用with as提高效能 使用公用表表示式 cte 簡化巢狀sql 1 with as的含義 with as短語,也叫做子查詢部分 su...

sqlserver 臨時表 表變數 CTE的比較

1 臨時表 1.1 臨時表包括 以 開頭的區域性臨時表,以 開頭的全域性臨時表。1.2 儲存 不管是區域性臨時表,還是全域性臨時表,都會放存在tempdb資料庫中。1.3 作用域 區域性臨時表 對當前連線有效,只在建立它的儲存過程 批處理 動態語句中有效,類似於c 語言中區域性變數的作用域。全域性臨...