【问题标题】:Simple UPDATE query on a very big SQL table对一个非常大的 SQL 表进行简单的 UPDATE 查询
【发布时间】:2019-07-31 09:10:33
【问题描述】:

我有这样一个更新查询:

SET NOCOUNT ON;
DECLARE @rows INT, @count INT, @message VARCHAR(100);
SET @rows = 1;
SET @count = 0;
WHILE @rows > 0
BEGIN
update top(100000)  [dbo].[Table]
set T1=212
where T1=-10
    SET @rows = @@ROWCOUNT;
END

我的表格包含超过 3 亿行。我已将 Azure SQL 数据库设置为 Premium P2,具有 250 个 DTU。如图所示,它的 DTU 使用率几乎保持在 70%。

我现在的问题是:如果我将 DTU 扩展到 500,我的更新查询能否运行得更快?

【问题讨论】:

  • 要回答您的问题,我怀疑增加 DTU 将有助于此更新查询。您隐含的问题是如何使批量更新运行得更快,我们需要更多信息来回答这个问题。 T1 列是否被索引?您希望更新多少行?
  • T1没有索引,应该更新2亿多行
  • 假设表有聚集索引,我建议你改为按聚集索引键的范围进行更新。这样,您就不会在每批中执行迭代扫描,也不会提高并发性。如果您需要帮助,请将表格 DDL 添加到您的问题中。
  • 也没有聚集索引
  • 一般来说,每个表都应该有一个聚集索引。表上有索引吗?如果是这样,您可以使用其中之一按键范围进行批处理。

标签: performance azure tsql azure-sql-database


【解决方案1】:

如果您在堆上运行(无聚集索引),那么您所做的是扫描多达 300M 行以尝试找到前 100k 行以根据您的条件进行更新。然后你可能会多次这样做。您也可以将这些行假脱机到 tempdb 中。

如果您在 where 子句中的列上运行聚集索引,那么您将对要更新的子集进行范围扫描(这样更有效)。请考虑尝试一下。

您当前的查询要么是 cpu 限制的(如果页面适合内存),要么是 io 限制的(如果它们不适合)。无论哪种情况,增加 dtu 都有助于提高查询性能。但是,如果您将查询性能中的算法问题作为下一步修复,您会更开心。

【讨论】:

    【解决方案2】:

    1.如果我将我的 DTU 扩展到 500,我的更新查询会运行得更快吗?

    是的,可以。

    但为了让客户考虑,Azure SQL 数据库不建议您直接扩展 DTU 以提高数据库的性能。请参考:Improving database performance with more resources

    总结:

    作为一般准则,如果您的 CPU 使用率始终保持在 80% 或以上,则说明您遇到了与运行相关的性能问题。如果您遇到运行相关的问题,可能是由于 CPU 资源不足,也可能与以下情​​况之一有关:

    1. 正在运行的查询过多
    2. 编译查询过多
    3. 一个或多个正在执行的查询正在使用次优查询计划

    最后,如果没有可以提高数据库性能的可操作项,您可以更改 Azure SQL 数据库中可用的资源量。您可以随时通过更改单个数据库的 DTU 服务层或增加弹性池的 eDTU 来分配更多资源。

    正如 Clay 所说,为了获得更好的性能和更低的成本,Azure 还提供了一些建议来帮助您提高性能。这些建议之一是优化查询。 更多详情请见:Monitoring and performance tuning

    这有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 2018-04-03
      • 2015-07-21
      • 2018-05-27
      相关资源
      最近更新 更多