sql-server - Azure SQL 旧基数估计不像 SQL Server 2016 那样工作
问题描述
我们有两个相同的数据库(完全相同的数据、结构等),一个位于 Azure Sql(Premium 500 DTU)中,另一个位于 Azure 上运行 SQL Server 2016 SP1(8 vcore,64 GB RAM)的 VM 上。我们有一个查询,当在将数据库级别设置为 OFF 的“Legacy Cardinality Estimation”运行时,会导致两个数据库上的查询执行时间约为 4 分钟。
如果我们将两个数据库中的“Legacy Cardinality Estimation”更改为 ON,运行 SQL Server 2016 SP1 的 VM 将在 30 秒内运行相同的查询,而 Azure SQL 数据库的性能甚至更差,并且需要将近 7 分钟才能执行。
此时重写查询不是一种选择。我希望有人能告诉我如何让 Azure SQL 遵守“传统基数估计”设置,并为我提供与我的 SQL Server 2016 SP1 VM 相似的性能。
我确实注意到,在 SQL Server 2016 SP1 框中,当“传统基数估计”为 ON 时,CPU 将飙升(90% 以上),而在 Azure SQL 中,DTU 百分比永远不会超过 25%。
解决方案
在 Azure SQL 数据库上将兼容级别设置为 110 以启用旧的基数估计器。
ALTER DATABASE [YourDatabase] SET COMPATIBILITY_LEVEL = 110
在查询级别,使用以下提示。
USE HINT ( 'FORCE_LEGACY_CARDINALITY_ESTIMATION')
欲了解更多信息,请阅读此处。
推荐阅读
- python - 将偶数行和奇数行分成两个新列
- python - 熊猫从上一行中减去另一列中的值
- scala - 行中的火花计数参数“提及”
- java - 自定义查询的休眠映射
- javascript - 如果第一个为空,则禁用添加更多文件输入,javascript
- c# - 如何从asp.net web api显示android上数据库的实时变化
- asp.net-core - Visual Studio Team Server CI 运行 .NET Core xUnit 测试失败
- webpack - neutrinojs 构建工作但 start 没有写入任何更改
- excel - 使用带通配符的索引匹配来查找部分匹配
- javascript - 如何链接条件异步回调?