【发布时间】: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