mysql表变量临时表_表变量和临时表详解
首先讓我們來看看什么是表變量和臨時表。
sql server 表變量
1.初識表變量
表變量在sql server 2000中首次被引用。表變量的定義和創建一個表大致相同,只不過是使用DECLARE @variable而不是CREATE Table,表變量定義包括列定義,列名,數據類型和約束(可用的約束有:主鍵約束、唯一約束、null約束、和CHECK約束。注:外鍵約束不可以哦)。表變量和其他變量不同,它不止存在于內存中,還存在于tempdb中。
2.表變量優點
1).表變量擁有特定的作用域(在當前批處理中),表變量在批處理結束后自動被清除。
2).在存儲過程中使用表變量較臨時表會減少存儲過程重新編譯的發生。
3).表變量需要更少的鎖請求和日志資源。
4).可以在表變量上使用UDF,UDDT,XML
3.表變量的缺點
1).在表變量上沒有統計信息,查詢優化器根據固定的預估值來選擇執行計劃,在數據量很大的情況下,會導致查詢優化器選擇很差的執行計劃。
2).不能在表變量上創建索引,但是可以通過創建約束(主鍵、唯一)來建立索引;
3).在 DECLARE 之后,不能再對表變量進行更改;
4).不能對表變量使用 SELECT INTO,INSERT EXEC 語句;
5).不能通過EXEC或sp_executeSQL 來執行牽涉表變量的動態SQL語句,但如果表變量是在動態SQL語句內定義的,則可以。
4.何時使用表變量(可以根據以下規則來判斷何時使用表變量)
1).表的行數
2).使用表變量能夠減少的重新編譯次數
3).查詢的類型和對索引或者統計信息的依賴程度
4).是否需要使用UDF,UDDF,XML
5.表變量不能做的事
1).雖然表變量是一個變量,但是其不能賦值給另一個變量。
2).check約束、默認值、計算列不能引用自定義函數。
3).不能為約束命名
4).不能truncate 表變量
5).不能向標識列中插入顯示值(也就是說表變量不支持SET IDENTITY_INSERT ON)
sql server 臨時表
臨時表和Create Table語句創建的表的不同之處在于:
1).臨時表的名稱不能超過116個字符,這是由于數據庫引擎為了辨別不同會話建立的臨時表,會自動在臨時表名字后附加一串。
2).局部臨時表作用域僅僅在當前的連接內,從存儲過程中建立局部臨時表的角度來看,局部臨時表會在以下情況下別Drop:
a.顯示調用DROP TABLE語句
b.當局部臨時表在存儲過程內被創建時,存儲過程結束就意味著局部臨時表被Drop
c.當前會話結束,在會話內創建的所有局部臨時表都會被DROP。
3).全局臨時表在所有的會話內可見,但是在其創建的會話結束后即被drop,drop后其它會話也將不能對其進行引用。
4).不能對臨時表進行分區。
5).不能對臨時表加外鍵約束。
6).臨時表內列的數據類型不能定義成沒有在TempDb中沒有定義自定義數據類型(自定義數據類型是數據庫級別的對象,而臨時表屬于TempDb)。由于TempDb在每次SQL Server重啟后會被自動創建,所以你必須使用startup stored procedure來為TempDb創建自定義數據類型。你也可以通過修改Model數據庫來達到這一目標。
7).XML列不能定義成XML集合的形式,除非這個集合已經在TempDb中定義。
至于表變量和臨時表的區別,在介紹表變量時所提到的優缺點中基本概括了,另外還有一個區別是體現在排序規則上:表變量使用當前數據庫的排序規則,臨時表使用TempDb的排序規則。如果它們不兼容,你還需要在查詢或者表定義中進行指定。
下面是看到的別人整理的一張表格,看著清晰一點。
總結
特性
表變量
臨時表
作用域
當前批處理
當前會話,嵌套存儲過程,全局:所有會話
使用場景
自定義函數,存儲過程,批處理
自定義函數,存儲過程,批處理
創建方式
DECLARE statement only.只能通過DECLEARE語句創建
CREATE TABLE 語句
SELECT INTO 語句.
表名長度
最多128字節
最多116字節
列類型
可以使用自定義數據類型
可以使用XML集合
自定義數據類型和XML集合必須在TempDb內定義
Collation
字符串排序規則繼承自當前數據庫
字符串排序規則繼承自TempDb數據庫
索引
索引必須在表定義時建立
索引可以在表創建后建立
約束
PRIMARY KEY, UNIQUE, NULL, CHECK約束可以使用,但必須在表建立時聲明
PRIMARY KEY, UNIQUE, NULL, CHECK. 約束可以使用,可以在任何時后添加,但不能有外鍵約束
表建立后使用DDL (索引,列)
不允許
允許.
數據插入方式
INSERT 語句 (SQL 2000: 不能使用INSERT/EXEC).
INSERT 語句, 包括 INSERT/EXEC.
SELECT INTO 語句.
Insert explicit values into identity columns (SET IDENTITY_INSERT).
不支持SET IDENTITY_INSERT語句
支持SET IDENTITY_INSERT語句
Truncate table
不允許
允許
析構方式
批處理結束后自動析構
顯式調用 DROP TABLE 語句.
當前會話結束自動析構 (全局臨時表: 還包括當其它會話語句不在引用表.)
事務
只會在更新表的時候有事務,持續時間比臨時表短
正常的事務長度,比表變量長
存儲過程重編譯
否
會導致重編譯
回滾
不會被回滾影響
會被回滾影響
統計數據
不創建統計數據,所以所有的估計行數都為1,所以生成執行計劃會不精準
創建統計數據,通過實際的行數生成執行計劃。
作為參數傳入存儲過程
僅僅在SQL Server2008, 并且必須預定義 user-defined table type.
不允許
顯式命名對象 (索引, 約束).
不允許
允許,但是要注意多用戶的問題
動態SQL
必須在動態SQL中定義表變量
可以在調用動態SQL之前定義臨時表
總結
以上是生活随笔為你收集整理的mysql表变量临时表_表变量和临时表详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java什么是网络接口_java 网络编
- 下一篇: mysql把用户权限授予新用户_MySQ