关闭

表变量与临时表对比(1)

146人阅读 评论(0) 收藏 举报
分类:

原文: 点击打开链接

问题 1:为什么在已经有了临时表的情况下还要引入表变量?

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

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

解答 2:下面的文章讨论了重新编译存储过程的一些原因:

243586 存储过程重新编译的疑难解答

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

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

问题 3:表变量有哪些缺陷?

解答 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:与临时表或永久表相比,表变量的仅存在于内存中的结构保证了更好的性能,是否因为它们是在驻留在物理磁盘上的数据库中维护的?

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

问题 5:必须使用表变量来代替临时表吗?

解答 5:答案取决于以下三个因素:

  • 插入到表中的行数。
  • 从中保存查询的重新编译的次数。
  • 查询类型及其对性能的指数和统计信息的依赖性。
在某些情况下,可将一个具有临时表的存储过程拆分为多个较小的存储过程,以便在较小的单元上进行重新编译。 

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

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

表变量与临时表的优缺点

表变量:     DECLARE @tb  table(id   int   identity(1,1), name   varchar(100))     &...
  • Gordennizaicunzai
  • Gordennizaicunzai
  • 2016-02-28 17:57
  • 2790

比较表变量和临时表

1、回滚事务对表变量无效,回滚事务对临时表有效SET NOCOUNT ON; DECLARE @TestTable TABLE ( RowID INT IDENTITY PRIMARY KEY CLUSTERED, Name VARCHAR(9) NOT NULL UNIQUE...
  • roy_88
  • roy_88
  • 2013-01-03 19:13
  • 3958

SQL SERVER临时表的使用&表变量的使用

临时表: 创建临时表可以创建本地和全局临时表。本地临时表仅在当前会话中可见;全局临时表在所有会话中都可见。 本地临时表的名称前面有一个编号符 (#table_name),而全局临时表的名称前面有两个编号符 (##table_name)。
  • S630730701
  • S630730701
  • 2016-08-03 16:57
  • 2349

SQL Server 表变量和临时表系列之概念篇

问题引入 “菜鸟啊,最近我看到阿里云开发者论坛的数据库RDS中有人在提SQL Server表变量和临时表如何选择的问题,你去深入探讨下这个问题吧,解答解答他们的疑惑吧”,老鸟又开始为菜鸟找活干了。 “鸟哥啊,关于表变量和临时表使用选择的问题啊,向来行业里争论不休,我比较担心我们的观点被人家拍...
  • lishimin1012
  • lishimin1012
  • 2017-01-06 14:37
  • 521

sqlserver 中临时表、临时变量和with as关键词创建“临时表”的区别

SQL数据库中数据处理时,有时候需要建立临时表,将查询后的结果集放到临时表中,然后在针对这个数据进行操作。   创建“临时表”(逻辑上的临时表,可能不一定是数据库的)的方法有一下几种:   1.with tempTableName as方法(05之后出现):   with temp...
  • miqi770
  • miqi770
  • 2016-05-26 15:39
  • 3722

MySQL中的两种临时表

http://mysql.taobao.org/monthly/2016/06/07/ 外部临时表 通过CREATE TEMPORARY TABLE 创建的临时表,这种临时表称为外部临时表。这种临时表只对当前用户可见,当前会话结束的时候,该临时表会自动关闭。这种临时表的命名与非临时表可以...
  • chinajobs
  • chinajobs
  • 2017-01-17 14:58
  • 1057

Sql表变量和临时表

我们在数据库中使用表的时候,经常会遇到两种使用表的方法,分别就是使用临时表及表变量。在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候去使用临时表而不使用表变量,有时候去使用表变量而不使用临时表呢?   临时表   临时表...
  • liwei825755184
  • liwei825755184
  • 2016-03-29 10:15
  • 1317

MySQL临时表的简单用法 在大数据量时有时会加快查询速度

MySQL临时表的简单用法 在大数据量时有时会加快查询速度 当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后在这些表运行查询。 创建临时表很容易,...
  • YZWDNN
  • YZWDNN
  • 2017-03-10 15:33
  • 1470

临时表与表变量

 临时表、表变量的比较 1、临时表 临时表包括:以#开头的局部临时表,以##开头的全局临时表。 a、存储 不管是局部临时表,还是全局临时表,都会放存放在tempdb数据库中。 b、作用域 局部临时表:对当前连接有效,只在创建它的存储过度、批处理、动态语句中有效,类似于C语言中局部变...
  • musecangying007
  • musecangying007
  • 2015-12-18 14:37
  • 183

表变量和临时表

定义一个sql server表变量的方法和定义一个用户自定义表的方法是一样的;然而,定义了一个表变量之后,你就不能再改变该表的定义了。而且你必须在定义这个表变量的时候给出它所有属性的定义。 定义表变量:DECLARE @T_ChartsIdeaItem1 Table(XData char(20) ...
  • xiaowenliuwen
  • xiaowenliuwen
  • 2016-04-14 18:09
  • 219
    个人资料
    • 访问:1964590次
    • 积分:27256
    • 等级:
    • 排名:第237名
    • 原创:791篇
    • 转载:313篇
    • 译文:1篇
    • 评论:191条