临时表和表变量的区别

临时表:   跟一般表差不多,   只不过是存在tempdb数据库中,   只有当连接(connection)结束或者被主动drop掉,   否则回一直存在,   所以它们也可以有primary   key,   constraints,   index和column   statistics.
跟一般表不一样的是,   临时表虽然在tempdb中显现,   实际上也是在内存中分配的,   除非内存不够的时候,   也可能分配在硬盘里,   但用户在硬盘里肯定找不到.

在数据库中的TAble分   临时表和表变量:
如下:
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语句里.
posted @ 2009-03-05 00:03  YaSin  阅读(643)  评论(0)    收藏  举报