table 变量的行为类似于局部变量,有明确定义的作用域。该作用域为声明该变量的函数、存储过程或批处理。

在存储过程中使用 table 变量与使用临时表相比,减少了存储过程的重新编译量
涉及表变量的事务只在表变量更新期间存在。这样就减少了表变量对锁定和记录资源的需求。
另外,由于表变量作用域有限,并且不是持久数据库的一部分,因而不受事务回滚的影响。

考虑使用表变量而不使用临时表。当需要在临时表上显式地创建索引时,或多个存储过程或函数需要使用表值时,临时表很有用。通常,表变量提供更有效的查询处理。

表变量局限:

Table 变量没有分发统计信息,不会触发重新编译。 因此,在许多情况下,优化器会在假定 table 变量没有行的前提下生成查询计划。 出于这一原因,如果您预计会存在大量行(超过 100 行),那么在使用 table 变量时应小心谨慎。 这种情况下,使用临时表可能是更好的解决方案。 或者,如果查询联接 table 变量和其他表,则可使用 RECOMPILE 提示,这使优化器会对 table 变量使用正确的基数。

在 SQL Server 优化器基于成本的原因模型中,不支持 table 变量。 因此,在需要基于成本的选择来实现高效的查询计划时,不应使用这些变量。 在需要基于成本的选择时,临时表是首选。 这通常包含具有联接、并行度决策和索引选择选项的查询。

修改 table 变量的查询不会生成并行查询执行计划。 修改特大型 table 变量或复杂查询中的 table 变量时,可能会影响性能。 在这种情况下,请考虑改用临时表。 有关详细信息,请参阅 CREATE TABLE (Transact-SQL)。 还可以并行执行读取 table 变量而不对变量进行修改的查询。

不能显式创建 table 变量的索引,也不保留 table 变量的任何统计信息。 在某些情况下,可以通过改用支持索引和统计信息的临时表来改善性能。 有关临时表的详细信息,请参阅 CREATE TABLE (Transact-SQL)。

table 类型声明中的 CHECK 约束、DEFAULT 值和计算列不能调用用户定义函数。

不支持在 table 变量之间进行赋值操作。

由于 table 变量作用域有限,并且不是持久数据库的一部分,因而不受事务回滚的影响。

表变量在创建后就无法更改。

最新文章

  1. 单机多实例Tomcat部署
  2. SqlServer中的一些非常用功能
  3. JDK里的设计模式
  4. rtx信息泄漏利结合弱口令导致被批量社工思路
  5. [C#]Linq To Xml 实例操作- 转
  6. 【HDOJ】3487 Play with Chain
  7. 企业门户(Portal)项目实施方略与开发指南
  8. php多条件组合查询
  9. 利用C++11的function和bind简化类创建线程
  10. 将Qt 动态链接生成的exe及依赖dll打包方法
  11. oop学习 计算器类的规划
  12. 打字机效果-so easy
  13. 将jdbc连接明文密码加密方案
  14. JavaScript深拷贝
  15. ES6字符串操作
  16. 跨域 jsonp 和 CORS 资料
  17. Scala学习之路 (四)Scala的数组、映射、元组、集合
  18. PHP 7中利用OpenSSL代替Mcrypt加解密的方法详解
  19. C语言学习笔记 (004) - 数组名和数组首地址(转)
  20. Ajax接收并显示后台传来的list集合内的数据信息

热门文章

  1. Java面向对象三大特性
  2. 如何配置使用HTML在线编辑工具
  3. Failed to create Accelerated Display. Please check the display hardware and drivers meet the minimum requirements.
  4. mysql-数据库管理安装
  5. es6 promise对象
  6. Python GUI - tkinter
  7. pip软件包安装 + Anaconda软件库安装 教程
  8. 非对称加密算法-RSA算法
  9. Spark-Unit1-spark概述与安装部署
  10. Hibernate中报错org.hibernate.HibernateException: No CurrentSessionContext configured!