zoukankan      html  css  js  c++  java
  • table 变量

    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 变量作用域有限,并且不是持久数据库的一部分,因而不受事务回滚的影响。

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

  • 相关阅读:
    波段是金牢记六大诀窍
    zk kafka mariadb scala flink integration
    Oracle 体系结构详解
    图解 Database Buffer Cache 内部原理(二)
    SQL Server 字符集介绍及修改方法演示
    SQL Server 2012 备份与还原详解
    SQL Server 2012 查询数据库中所有表的名称和行数
    SQL Server 2012 查询数据库中表格主键信息
    SQL Server 2012 查询数据库中所有表的索引信息
    图解 Database Buffer Cache 内部原理(一)
  • 原文地址:https://www.cnblogs.com/ly7454/p/3655971.html
Copyright © 2011-2022 走看看