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/