SQL Server 2000表变量引入时的问题破解

数据库 SQL Server
本文主要向你介绍的是SQL Server 2000表变量引入的一些常见问题 (FAQ) 做出的正确解答,我们主要是以一问一答的方式对其进行说明。

 

本文主要是对一些与SQL Server 2000表变量引入的一些常见问题 (FAQ) 做出的解答。要阅读表变量的 SQL Server 数据库的联机丛书说明,你可以通过以下的这些Microsoft 网站,如下所示:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_ta-tz_7ysl.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_ta-tz_7ysl.asp)更多信息

 

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

 

解答 1:与临时表相比,表变量具有下列优点: 如 SQL Server 联机丛书“表”(Table) 一文中所述,表变量(如局部变量)具有明确定义的范围,在该范围结束时会自动清除这些表变量。

与临时表相比,表变量导致存储过程的重新编译更少。

 

涉及表变量的事务仅维持表变量上更新的持续时间。因此,使用SQL Server 2000表变量时,需要锁定和记录资源的情况更少。因为表变量具有有限的范围并且不是持久性数据库的一部分,所以事务回滚并不影响它们。

 

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

 

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

243586 (http://support.microsoft.com/kb/243586/) 存储过程重新编译的疑难解答“由于某些临时表操作引起的重新编译”一节还列出了为避免一些问题(例如使用临时表导致重新编译)而需要满足的一些要求。这些限制不适用于表变量。

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

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

解答 3:与临时表相比,它存在下列缺陷: 在表变量上不能创建非聚集索引(为 PRIMARY 或 UNIQUE 约束创建的系统索引除外)。与具有非聚集索引的临时表相比,这可能会影响查询性能。

表变量不像临时表那样可以维护统计信息。在SQL Server 2000表变量上,不能通过自动创建或使用 Create STATISTICS 语句来创建统计信息。因此,在大表上进行复杂查询时,缺少统计信息可能会妨碍优化器确定查询的***计划,从而影响该查询的性能。

 

在初始 DECLARE 语句后不能更改表定义。

 

表变量不能在 Insert EXEC 或 Select INTO 语句中使用。

 

表类型声明中的检查约束、默认值以及计算所得的列不能调用用户定义的函数。

 

如果表变量是在 EXEC 语句或 sp_executesql 存储过程外创建的,则不能使用 EXEC 语句或 sp_executesql 存储过程来运行引用该表变量的动态 SQL Server 查询。由于表变量只能在它们的本地作用域中引用,因此 EXEC 语句和 sp_executesql 存储过程将在SQL Server 2000表变量的作用域之外。

但是,您可以在 EXEC 语句或 sp_executesql 存储过程内创建表变量并执行所有处理,因为这样表变量本地作用域将位于 EXEC 语句或 sp_executesql 存储过程中。

 

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

 

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

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

解答 5:答案取决于以下三个因素: 插入到表中的行数。

从中保存查询的重新编译的次数。

 

查询类型及其对性能的指数和统计信息的依赖性。

 

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

 

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

如果您没有看到您问题的答案,请访问 Microsoft SQL Server 新闻组,地址是:Microsoft SQL Server 新闻组 (http://support.microsoft.com/newsgroups/)

如果您想对本文或其他 Microsoft SQL Server 知识库文章发表评论,请给我们发邮件,地址是SQLKB@Microsoft.comhttp://support.microsoft.com/?kbid=305977

【编辑推荐】

  1. SQL Server临时表的使用方案大全
  2. SQL Server存储过程的命名标准如何进行?
  3. 卸载SQL Server 2005组件的正确顺序
  4. SQL Server 使用索引来对数据访问进行优化
  5. SQL Server浮点数据类型的详细解析
责任编辑:佚名 来源: 中国网管联盟
相关推荐

2010-07-26 14:09:32

SQL Server

2010-07-26 13:33:28

SQL Server

2010-07-01 17:08:26

2010-06-18 09:26:49

SQL Server

2010-07-02 10:42:11

SQL Server

2010-07-22 16:02:29

2009-05-26 10:21:07

2011-04-06 13:14:29

SQL Server 安装

2010-07-23 09:15:08

安装SQL Serve

2011-03-29 13:22:07

SQL Server临时表表变量

2010-09-16 15:10:48

SQL Server表

2010-07-26 13:25:11

SQL Server分

2010-06-18 11:04:39

SQL Server

2010-07-23 09:44:51

2021-01-18 05:23:14

SQL 排序Server

2010-11-10 15:23:55

SQL SERVER

2011-04-13 14:20:52

SQL Server主键

2015-07-20 17:05:38

SQL ServerNULL值

2010-07-15 10:48:48

SQL Server2

2010-07-05 14:11:07

SQL Server
点赞
收藏

51CTO技术栈公众号