sas*_*aso 19 sql-server sql-server-2014
我有一个数据仓库数据库,我遇到了SQL Server 2014的新基数估算器的问题.
将数据库服务器升级到SQL Server 2014后,我发现查询性能有很大差异.有些查询的执行速度要慢得多(SQL 2012中为30秒,SQL 2014中为5分钟).在研究执行计划之后,我已经看到SQL Server 2014上的基数估计已经过时了,我无法找到它的原因.
以下是SQL 2012与SQL 2014中的查询执行计划(左上角运算符)的示例:
一些细节:
我的查询是典型的数据仓库事实表加载查询.我查询一个事务表并加入很多(15-20)维度表(总是从维表中加入0或1个记录).
我已更新所有表的统计信息(使用FULLSCAN)以确保统计信息是最新的.
维度表的业务键被索引(唯一的非clusted索引).在我看来,由于这个索引的唯一性,旧的基数估计(SQL 2012)正确地假设有最大值.1个连接记录(估计的记录数量在执行计划中没有变化).
我试图将问题缩小到最简单的例子 - 使用2个连接的SELECT:
以下是SQL 2012与SQL 2014中运算符1和2的基数估计:
| Est.rows - SQL2012 | Est.rows - SQL2014
Operator 1 | 7653 | 7653
Operator 2 | 7653 | 10000
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,SQL Server 2014错过了超过30%的估计(10000对7653).因为我有cca.15-20连接在一个典型的查询中,最终估计结束了.
我可以将数据库置于较低的兼容模式(110),然后它可以正常工作(与SQL Server 2012上的相同),但我真的想知道这种行为的原因是什么.为什么SQL Server 2014的基数估算结果错误?
我认为今天对这个有趣的问题没有简单的答案.我知道的最佳答案是以下视频:http://channel9.msdn.com/events/TechEd/NorthAmerica/2014/DBI-B331#fbid=.它有许多新旧估算器的例子.该视频长约50多分钟,但值得花时间.
与此问题相关的视频摘要:
基数估计的旧假设:
要在SQL SERVER 2014中使用SQL SERVER 2012基数估算器,请使用以下选项:
什么是新估算器(基于视频):
要做/清单:
1. Auto Create / Update Stats
2. Check database compatibility mode (120/110)
3. Test using query trace flags
4. XML showplan
Run Code Online (Sandbox Code Playgroud)
更新 基数估算器中的新增功能(SQL Server 2016)
更多细节:
https://www.sqlshack.com/query-optimizer-changes-in-sql-server-2016-explained/
归档时间: |
|
查看次数: |
4836 次 |
最近记录: |