【问题标题】:Missing column statistics in Azure SQL databaseAzure SQL 数据库中缺少列统计信息
【发布时间】:2021-03-29 17:18:21
【问题描述】:

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

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

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

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

我验证了所需的设置“自动创建统计”和“自动更新统计”已打开。

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

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

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

【问题讨论】:

  • 仅当您的设置正确时才会自动创建统计信息。您需要为数据库运行“alter database set auto_create_statistics on”(google 精确语法)。
  • 我不知道您是如何重建统计信息的,但如果没有统计信息,那么重建将无济于事。您也可以手动创建统计信息。还要确保您的索引与迁移前一样。

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


【解决方案1】:

不知道为什么,但是现在正在创建统计信息,并且我上面提到的 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

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

【讨论】:

    猜你喜欢
    • 2017-02-26
    • 1970-01-01
    • 2017-05-08
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多