SQL Server Cardinality Estimation 简介

CE简介
CE 是用来估计查询结果返回的记录数的,优化引擎会使用它来生成最优的执行计划。如果新版的CE导致你的查询执行速度更慢,通常是由于以下的原因:

  • 查询语句在OLTP系统中执行的频率非常高, 且经常会并发执行。
  • Select语句中使用大量的聚合条件,并且在OLTP系统的日常工作时间执行。

CE的历史
1998 年,SQL Server 7.0中引入的CE的一次重大更新,兼容级别是70, 当时的CE 模型是基于以下4个假设:

  • Independence独立性: 不同列的数据分布是相互独立的, 除非有关联信息可用。
  • Uniformity均匀分布性: 唯一值均匀分布并且以同样的频率出现。
  • Containment (Simple) 封闭性?:用户只查询存在的数据。 比如,两个表使用等于条件做JOIN,会先针对每个表各自的过滤条件预测各自的可选择性,然后再预测JOIN结果的选择性。
  • Inclusion包容性:针对类似于 WHERE COLUMN=Constant的过滤条件,CE会假定Constant是一个实际存在的值。

后续的更新从SQL Server 2014(12.x)开始,即兼容级别120或更新。这次的内容更新了针对现代的数据仓库和OLTP类型负载的一些假定和算法。下面的模型假设从CE 120开始引入:

  • Independence 变成 Correlation: 不同列之间的值不一定是独立的,这样更贴近实际查询场景。
  • Simple Containment 变成 Base Containment: 用户可能会查询不存在的数据。比如,两个表使用等于条件做JOIN, 会先预测JOIN结果的选择性,然后再考虑每个表的过滤条件。

如何观测CE的提升?用下面的语句分别设置ON 和OFF, 观测执行计划中estimated row count的变化。

ALTER DATABASE SCOPED CONFIGURATION
SET LEGACY_CARDINALITY_ESTIMATION = ON;
GO

参考资料
https://docs.microsoft.com/en-us/sql/relational-databases/performance/cardinality-estimation-sql-server?view=sql-server-2017
https://blogs.msdn.microsoft.com/psssql/2015/06/16/identifying-sql-server-2014-new-cardinality-estimator-issues-and-service-pack-1-improvement/

转载于:https://www.cnblogs.com/sqlzh/p/10051522.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值