sqlserver 临时表于表变量的区别

转载 2012年03月21日 18:59:46

 1.与临时表相比,表变量具有下列优点:

  • 如 SQL Server 联机丛书“表”(Table) 一文中所述,表变量(如局部变量)具有明确定义的范围,在该范围结束时会自动清除这些表变量。
  • 与临时表相比,表变量导致存储过程的重新编译更少。
  • 涉及表变量的事务仅维持表变量上更新的持续时间。因此,使用表变量时,需要锁定和记录资源的情况更少。因为表变量具有有限的范围并且不是持久性数据库的一部分,所以事务回滚并不影响它们。

2. 如果说使用表变量比使用临时表导致存储过程的重新编译更少,这意味着什么?

“由于某些临时表操作引起的重新编译”一节还列出了为避免一些问题(例如使用临时表导致重新编译)而需要满足的一些要求。这些限制不适用于表变量。

表变量完全独立于创建这些表变量的批,因此,当执行 CREATE 或 ALTER 语句时,不会发生“重新解析”,而在使用临时表时可能会发生“重新解析”。临时表需要此“重新解析”,以便从嵌套存储过程引用该表。表变量完全避免了此问题,因此存储过程可以使用已编译的计划,从而节省了处理存储过程的资源。

 

3.与临时表相比,表变量存在下列缺陷:

  • 在表变量上不能创建非聚集索引(为 PRIMARY 或 UNIQUE 约束创建的系统索引除外)。与具有非聚集索引的临时表相比,这可能会影响查询性能。
  • 表变量不像临时表那样可以维护统计信息。在表变量上,不能通过自动创建或使用 CREATE STATISTICS 语句来创建统计信息。因此,在大表上进行复杂查询时,缺少统计信息可能会妨碍优化器确定查询的最佳计划,从而影响该查询的性能。
  • 在初始 DECLARE 语句后不能更改表定义。
  • 表变量不能在 INSERT EXEC 或 SELECT INTO 语句中使用。
  • 表类型声明中的检查约束、默认值以及计算所得的列不能调用用户定义的函数。
  • 如果表变量是在 EXEC 语句或 sp_executesql 存储过程外创建的,则不能使用 EXEC 语句或 sp_executesql 存储过程来运行引用该表变量的动态 SQL Server 查询。由于表变量只能在它们的本地作用域中引用,因此 EXEC 语句和sp_executesql 存储过程将在表变量的作用域之外。但是,您可以在 EXEC 语句或 sp_executesql 存储过程内创建表变量并执行所有处理,因为这样表变量本地作用域将位于 EXEC 语句或sp_executesql 存储过程中。

4.与临时表或永久表相比,表变量的仅存在于内存中的结构保证了更好的性能,是否因为它们是在驻留在物理磁盘上的数据库中维护的?

   表变量不是仅存在于内存中的结构。由于表变量可能保留的数据较多,内存中容纳不下,因此它必须在磁盘上有一个位置来存储数据。与临时表类似,表变量是在 tempdb 数据库中创建的。如果有足够的内存,则表变量和临时表都在内存(数据缓存)中创建和处理。

5.必须使用表变量来代替临时表吗?

  • 插入到表中的行数。
  • 从中保存查询的重新编译的次数。
  • 查询类型及其对性能的指数和统计信息的依赖性。

在某些情况下,可将一个具有临时表的存储过程拆分为多个较小的存储过程,以便在较小的单元上进行重新编译。

通常情况下,应尽量使用表变量,除非数据量非常大并且需要重复使用表。在这种情况下,可以在临时表上创建索引以提高查询性能。但是,各种方案可能互不相同。Microsoft 建议您做一个测试,来验证表变量对于特定的查询或存储过程是否比临时表更有效。




http://support.microsoft.com/kb/305977/zh-cn

 

 

 

相关文章推荐

SQLServer中临时表与表变量的区别分析

在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候去使用临时表而不使用表变量,有时候去使用表变量而不使用临时表呢? 临时表  临时表与...

SQL Server中 临时表 与 表变量的区别 1

什么情况下使用表变量?什么情况下使用临时表?表变量:    DECLARE @tb  table(id   int   identity(1,1), name   varchar(100))    I...

SQL临时表和表变量的区别

临时表   临时表与永久表相似,只是它的创建是在Tempdb中,它只有在一个数据库连接结束后或者由SQL命令DROP掉,才会消失,否则就会一直存在。临时表在创建的时候都会产生SQL Server的系...

SQL Server中临时表与表变量的区别

我们在数据库中使用表的时候,经常会遇到两种使用表的方法,分别就是使用临时表及表变量。在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候...

SQL SERVER 中临时表与表变量的区别

我们在数据库中使用表的时候,经常会遇到两种使用表的方法,分别就是使用临时表及表变量。在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候...

SQL Server中的临时表和表变量的区别

在SQL Server的性能调优中,有一个不可比面的问题:那就是如何在一段需要长时间的代码或被频繁调用的代码中处理临时数据集?表变量和临时表是两种选择。记得在给一家国内首屈一指的海运公司作SQL Se...

临时表、表变量、CTE的比较

  1、临时表 临时表包括:以#开头的局部临时表,以##开头的全局临时表。   a、存储 不管是局部临时表,还是全局临时表,都会放存放在tempdb数据库中。   b、作用域 局部...

临时表和表变量、内联UDF 派生表 CTE

----------------------------------------------------------------------- Chapter 02 - Temporary Table...

sqlserver临时表或表变量代替游标

为什么要用游标呢?数据量超过1万,游标就很慢了。 在很多场合,用临时表或表变量也可以替代游标 临时表用在表没有标识列(int)的情况下. 在表有标识列(int)的情况下可以用表变量,当然也可...

临时表vs.表变量以及它们对SQLServer性能的影响

临时表vs.表变量以及它们对SQLServer性能的影响--王成辉翻译整理,转贴请注明出自微软BI开拓者www.windbi.com--原帖地址在临时表create table #T (…)和表变量d...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sqlserver 临时表于表变量的区别
举报原因:
原因补充:

(最多只允许输入30个字)