首页 > 解决方案 > 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%。

标签: sql-serverazureazure-sql-databasesql-server-2016azure-sql-server

解决方案


在 Azure SQL 数据库上将兼容级别设置为 110 以启用旧的基数估计器。

ALTER DATABASE [YourDatabase] SET COMPATIBILITY_LEVEL = 110

在查询级别,使用以下提示。

USE HINT ( 'FORCE_LEGACY_CARDINALITY_ESTIMATION')

欲了解更多信息,请阅读此处


推荐阅读