临时表和表变量的区别
临时表: 跟一般表差不多, 只不过是存在tempdb数据库中, 只有当连接(connection)结束或者被主动drop掉, 否则回一直存在, 所以它们也可以有primary key, constraints, index和column statistics.
跟一般表不一样的是, 临时表虽然在tempdb中显现, 实际上也是在内存中分配的, 除非内存不够的时候, 也可能分配在硬盘里, 但用户在硬盘里肯定找不到.
如下:
CREATE TABLE ##CustomerAddress
(CustomerAddressID int IDENTITY(1,1),
AddressType char(4) NOT NULL,
PrimaryAddressFlag bit NOT NULL,
CountryID int NULL)
DECLARE @CustomerAddress TABLE
(CustomerAddressID int IDENTITY(1,1),
AddressType char(4) NOT NULL,
PrimaryAddressFlag bit NOT NULL,
CountryID int NULL)
临时表是存放在tempdb,而表变量是存放在mem中?对么?
还想知道以上2种方式分别是在什么情形下使用的?
表变量可用在函数里面
临时表不行
临时表: 跟一般表差不多, 只不过是存在tempdb数据库中, 只有当连接(connection)结束或者被主动drop掉, 否则回一直存在, 所以它们也可以有primary key, constraints, index和column statistics.
跟一般表不一样的是, 临时表虽然在tempdb中显现, 实际上也是在内存中分配的, 除非内存不够的时候, 也可能分配在硬盘里, 但用户在硬盘里肯定找不到.
表变量: 就跟临时变量一样, 作用范围非常狭窄, 出了batch就玩完. (一个batch就是一段在SSMS里以GO结束的query组, 或者是一个存储过程). 表变量不能被主动drop掉.
跟临时表一样的是, 表变量也存在在tempdb数据库中, 表变量可以有一个primary key, 但不能生成索引, 也不能有column statistics, 所以对大数据的表来说, 表变量可能不大合适.
Table Variables
CTE(common table expression)
CTE与其说是一种表, 不如说是一种视图. 如果你仔细研究一下CTE的excution plan的话, 就可以发现很象C语言中的宏(macro)一样, 只是方便写代码而已.
CTE
临时表可以用与存储过程中,便于用户的使用,并且可以自动撤销,存放在tempdb中,有局部和全局的两种,
而表变量,可以用在函数中
http://www.windbi.com/showtopic-90.aspx
说的比较详细
再补充3点:
1. 表变量的操作并不记录在transaction log里, 所以对表变量不能用rollback, 而临时表则可以.
2. 任何有临时表的过程都不能被预编译(pre-compiled),但是有表变量的过程的execution plan却有可能被预先生成.所以从这个意义来看, 表变量的过程要比临时表的过程速度要快.
3. 表变量跟普通变量一样, 在内层的存储过程和exec(string)过程中是不可见的(临时变量则可以, 几个有个大虾还专门发贴庆贺过这件事), 所以表变量也不能用在insert/exec语句里.

浙公网安备 33010602011771号