【问题标题】:How do I figure out what is causing Data IO spikes on my Azure SQL database?如何找出导致 Azure SQL 数据库数据 IO 峰值的原因?
【发布时间】:2017-11-15 16:24:09
【问题描述】:

我有一个 Azure SQL 生产数据库,它的平均 DTU 使用率约为 10-20%,但是,我的 DTU 峰值有时会超过 100%。以下是过去 1 小时的示例:

我意识到这可能是一个恶意查询,因此我切换到 Query Performance Insight 标签,并在过去 24 小时内找到以下内容:

此图表对于 CPU 使用率线很有意义。正如我的应用程序所预期的那样,查询 3780 占用了 CPU 的大部分时间。 Overall DTU(红色)线似乎正确地遵循了这一点(减去尖峰)。

但是,在 DTU 组件 图表中,我可以看到与 总体 DTU 峰值一致的较大 数据 IO 峰值出现。切换到 Data IO 的 TOP 5 查询,我看到以下内容:

这似乎表明没有使用大量数据 IO 的查询。

我如何找出这个Data IO使用的来源?

最后,我看到 Data IO 的 TOP 5 查询 下列出了一个“奇数球”查询 (7966),仅执行了 5 次。选择它会显示以下内容:

SELECT StatMan([SC0], [SC1], [SC2], [SB0000])
    FROM (SELECT TOP 100 PERCENT [SC0], [SC1], [SC2], step_direction([SC0]) over (order by NULL) AS [SB0000]
    FROM (SELECT [UserId] AS [SC0], [Type] AS [SC1], [Id] AS [SC2] FROM [dbo].[Cipher] TABLESAMPLE SYSTEM (1.828756e+000 PERCENT)
    WITH (READUNCOMMITTED) ) AS _MS_UPDSTATS_TBL_HELPER
ORDER BY [SC0], [SC1], [SC2], [SB0000] ) AS _MS_UPDSTATS_TBL 
OPTION (MAXDOP 16)

这是什么查询?

这看起来不像我的应用程序创建/使用的任何查询。详细信息图表上的时间戳似乎与整体数据 IO 峰值的大致时间一致(就在早上 6 点之前),这让我认为这个查询与所有这些有关。

我可以使用任何其他工具来帮助隔离此问题吗?

【问题讨论】:

  • 您是否尝试过关闭 AUTO_UPDATE_STATISTICS?我相信这是一个更新统计元数据的内部 SQL 过程。
  • @DanielG 我还没有尝试过。我可以尝试使用sp_autostats 禁用表dbo.Ciphers 上的统计信息,看看这是否会改变任何东西,尽管我不确定这会对那个表产生什么影响,因为dbo.Ciphers 是应用程序中非常高的流量表。

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


【解决方案1】:

查询正在更新统计信息。当此设置AUTO UPDATE STATISTICS 处于打开状态时会发生这种情况。应该保持打开状态,您不能将其关闭。这是最佳做法。

只有当您发现查询表现不佳且该查询的统计信息已关闭时,您才应手动更新统计信息。

以下是 SQL 自动为您更新统计信息时的一些规则

  • 当没有行的表得到一行时
  • 当500行改成小于500行的表时
  • 当超过 500 行的表中更改 20% + 500 时

“更改”是指插入、更新或删除行。所以,是的,即使是自动创建的统计信息也会随着数据的变化而更新和维护。在最近的版本中,这些规则发生了一些变化,sql 可以更频繁地更新统计信息

参考资料:
https://www.sqlskills.com/blogs/erin/understanding-when-statistics-will-automatically-update/

【讨论】:

  • 我一直在每晚更新统计信息,以帮助缓解这个问题。您提到“只有当您看到查询执行不佳并且该查询的统计信息关闭时,您才应该手动更新统计信息......”。我如何确定哪些查询由于统计问题而表现不佳?
  • @kspearrin:一种方法是检查估计值。如果你看到这张图片,估计的行和实际的行是不同的:i.stack.imgur.com/TG0ll.png
  • 就像仅供参考:我们过去常常在周末更新统计数据,重建索引,而不是每晚..但这又取决于您的工作量,所以每晚的时间表可能适合您:也请查看此链接@ 987654323@
【解决方案2】:

查询似乎是统计信息自动更新过程的一部分。为了减轻此过程对生产的影响,您可以使用运行手册定期更新统计信息和索引,如 here 所述。运行 sp_updatestats 以立即尝试减轻此过程的影响。

【讨论】:

  • 这只是维护统计数据的手动方式吗?似乎 SQL Azure 正在尝试自动为我做这件事,但做得不好?或者我的统计数据刚刚关闭,需要“刷新”。如果我打算每晚/每周使用您建议的脚本之类的东西,我应该打开 AUTO_UPDATE_STATISTICS 吗?
  • 是的,SQL Server 和 Azure SQL 数据库通常会在不存在计划任务时尝试使用示例方法对统计信息进行维护。尝试确定应用程序的维护时段,并创建一个运行手册以在这些时间运行以对索引进行碎片整理和更新统计信息。以下文章向您展示了如何创建 Runbook。 sqlperformance.com/2017/06/azure/automation-methods
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多