SQL Server 2019后表变量基数估算规则变更咨询
SQL Server表变量统计与基数估算的变更说明
核心变更时间线
SQL Server 2019(兼容级别150+)
- 引入表变量延迟编译功能,默认启用。优化器会延迟查询编译时机,直到第一次执行时获取表变量的实际行数,以此生成更精准的执行计划,替代了此前固定1行的基数估算逻辑。
- 若无法触发延迟编译(例如在
IF...ELSE等流程控制块内查询表变量、表变量刚完成DDL操作就立即查询等场景),优化器会采用启发式估算规则:基数估算值为表变量实际总行数的平方根(如你测试的4999行对应~70.7行)。
SQL Server 2022及后续版本(兼容级别160+)
- 新增表变量自动统计创建机制:当表变量的数据量达到内部阈值时,优化器会自动为其创建临时统计信息,此时基数估算将基于实际统计数据,不再依赖平方根规则。
- 支持手动为表变量创建统计信息,执行
CREATE STATISTICS [统计名] ON @表变量名 ([列名])语句后,优化器会直接使用这些统计数据进行基数估算。
平方根估算规则的适用范围
该规则并非始终适用,仅作为无统计信息且无法触发延迟编译时的 fallback 策略:
- 适用场景:
- 数据库兼容级别低于160,且未触发延迟编译;
- 兼容级别160+,但表变量数据量未达自动统计阈值、未手动创建统计,且无法触发延迟编译。
- 不适用场景(此时会使用更精准的估算逻辑):
- 触发表变量延迟编译;
- 表变量存在自动或手动创建的统计信息;
- 查询使用
OPTION (RECOMPILE)提示,强制重新编译时会获取表变量实际行数进行估算。
内容的提问来源于stack exchange,提问作者KnowledgeSeeeker
相关产品推荐
相关产品推荐

