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