Azure SQL 数据库中缺少列统计信息

时间:2020-12-19 06:54:54

标签: sql-server azure azure-sql-database

我最近将 SQL Server 数据库从本地 SQL Server 实例迁移到 Azure SQL,并开始注意到性能问题。我使用 Data Migration Assistant 迁移架构和数据。数据库位于弹性池中。

例如,Azure 中的存储过程运行时间超过 1 分钟,而在本地则几乎是即时的。相同的数据和数据库结构(包括索引和外键)。

比较 Azure 和本地服务器之间的执行计划时,有很多不同之处。有很多与缺少列统计信息相关的警告,这似乎是问题的原因。

据我所知,当在 JOIN 或 WHERE 子句中使用该列时,数据库引擎会自动创建列统计信息。但这似乎不是这个数据库的情况。

我确认所需设置“自动创建统计信息”和“自动更新统计信息”已开启。

如果我导出表架构并创建一个具有不同名称和完全相同结构的新表,然后使用 WHERE 子句编写查询,则立即创建列统计信息。但是在现有表上运行完全相同的查询时,不会创建统计信息。

我可以像 here 所描述的那样手动为当前列创建统计信息,但是如果将来将新列添加到表中,则可能不会创建它。只是为了检查一下,我确实为上面提到的存储过程手动创建了一个列统计信息并且它起作用了,执行时间从 > 1 分钟减少到 5 秒。

这里可能缺少什么,为什么不为现有表自动创建统计信息?

1 个答案:

答案 0 :(得分:0)

不知道为什么,但现在正在创建统计信息,我上面提到的 SP 立即运行。

我在使用前一天重建了索引和主键的统计信息:

https://github.com/olahallengren/sql-server-maintenance-solution

但它似乎没有任何效果(也许它有延迟效果?)。这也被列为此处的迁移建议

https://docs.microsoft.com/en-us/azure/azure-sql/database/migrate-to-database-from-sql-server#optimize-performance-after-the-migration-completes

另外,我发现并不是所有的列都应该有列统计信息。如果某列是索引或主键的一部分,则将为该对象创建统计信息,并且该列不会有单独的统计信息。