AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 298835
Accepted
Mark Adam Proctor
Mark Adam Proctor
Asked: 2021-09-01 10:51:09 +0800 CST2021-09-01 10:51:09 +0800 CST 2021-09-01 10:51:09 +0800 CST

估计基数时,优化器如何处理尚未填充的#temp 表?

  • 772

我一直在构建存储过程,但找不到任何关于 SQL Server 优化器如何处理 #temp 表的文档。

如果我有 4 个连接到 #temp 表,其中在存储过程执行期间创建了该 #temp 表,并且 #temp 表可能包含零到多条记录,它是如何估计的?

由于CREATE/ALTER时没有统计信息,估计和join中的一些表一样大吗?估计很小吗?估计和其他#temporary表一样吗?

请注意,这是假设在执行时没有重新编译并且使用原始版本。

sql-server temporary-tables
  • 2 2 个回答
  • 553 Views

2 个回答

  • Voted
  1. Best Answer
    Paul White
    2021-09-02T03:07:30+08:002021-09-02T03:07:30+08:00

    SQL Server 通常会在存储过程开始执行之前为存储过程中的语句构建一套完整的执行计划。

    当存在临时表时,该方法会稍作修改:

    • 引用临时表的每个语句的编译都会延迟到该语句实际执行。
    • 自 2005 版本以来,SQL Server 就支持语句级重新编译。只有受影响的语句被重新编译;该程序的其余计划不受影响。
    • 延迟编译意味着 SQL Server 在优化期间知道临时表的运行时基数。
    • SQL Server 还可以自动创建统计信息以支持正在编译的查询。这发生在编译期间,从技术上讲会导致重新编译。
    • 因此,构建的执行计划受益于准确的基数信息和自动创建的统计对象(如果启用了该选项)。

    从有关重新编译执行计划的文档中:

    在 2005 年之前的 SQL Server 版本中,每当批处理中的语句导致重新编译时,整个批处理(无论是通过存储过程、触发器、临时批处理还是预准备语句提交)都会重新编译。从 SQL Server 2005 (9.x) 开始,仅重新编译批处理中触发重新编译的语句。此外,由于 SQL Server 2005 (9.x) 及更高版本具有扩展的功能集,因此还有其他类型的重新编译。

    语句级重新编译有利于性能,因为在大多数情况下,少量语句会导致重新编译及其相关的损失,就 CPU 时间和锁而言。因此,对于批处理中不必重新编译的其他语句,可以避免这些惩罚。

    并来自表变量延迟编译:

    使用表变量延迟编译,引用表变量的语句的编译将延迟到该语句的第一次实际执行。这种延迟编译行为与临时表的行为相同。


    这是基本的大纲,但不是全部。

    正如在另一个答案中已经指出的那样,存储过程中的临时表也可以被缓存以供重用。这种缓存可以显着提高性能和可伸缩性,但它确实使计划重新编译的条件和统计信息的维护方式变得复杂。

    我在Temporary Table Caching Explained和Temporary Table Caching in Stored Procedures 中为感兴趣的(和高级的)读者描述了这些额外的复杂性。

    • 13
  2. Hannah Vernon
    2021-09-01T11:11:12+08:002021-09-01T11:11:12+08:00

    粗略地说,在#temp 表上创建统计信息的基数估计遵循常规非临时表的基数估计。话虽如此,正如Paul White在这里指出的那样,存储过程中的临时表可能会受到缓存统计值的影响。

    从上面的页面可以看出:

    存储过程中的临时表有许多意想不到的特征:

    • 尽管有明确的 CREATE 和 DROP 语句,但临时对象可能会在执行过程中被缓存
    • 与缓存的临时对象相关的统计信息也被缓存
    • 与临时表的当前内容相比,统计数据可能 100% 错误
    • 过程末尾的隐式 TRUNCATE TABLE 会使对列修改计数器的预期影响加倍
    • 可以在导致它们被创建的语句之前更新缓存的统计信息
    • OPTION (RECOMPILE) 更改在过程调用之间传递列修改的方式
    • 手动更新统计不足以强制重新编译

    我建议看一下这篇文章,以彻底了解临时表缓存对您的影响。

    • 8

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve