【问题标题】:Optimizing delete query by order按顺序优化删除查询
【发布时间】:2021-07-29 16:31:48
【问题描述】:

我们有一个包含大量数据的大数据库,每一行由几列组成,一列是值,另一列是时间。 该表按时间排序。 我们想使用 DELETE 查询来删除 value 在某个范围内的所有行:

    DELETE FROM sometable
WHERE ( value > 80 AND value < 90);

问题是这个查询在服务器上花费了很多时间,我们想要优化它。 我们确实知道我们要删除的所有行都具有一些已知的时间值。 有没有办法利用表按时间排序的事实来优化查询并减少服务器上的时间?

例如,在下表中:

如果我们知道我们要删除的所有行都在 2015 年 2 月 1 日结束,则服务器无需“检查”第 1-3 行和第 10 行结束

谢谢。

编辑: 我们正在使用 Microsoft SQL Server 2019

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。
  • 已编辑,谢谢。
  • 我们要删除的所有行都具有某个已知的时间值 如果您对该列有一个有用的索引,那么只需在 WHERE 子句中包含适当的条件。但是任何人都可以猜测您是否不提供 DDL。注意 - 使用不含歧义且不依赖于运行时设置的日期常量来正确解释。 (例如,'20150201' 假设您的意思是 2 月 1 日)
  • 如果您知道要删除的所有行都是针对时间 '2/1/2015' 的,请将其添加到您的 WHERE 子句中。请注意,表在逻辑上是一组无序的行,但是通过按时使用聚集索引,该索引控制物理顺序并可用于优化删除操作。
  • 如果要删除表中的大部分行,转储到新表并切换可能会更快

标签: sql sql-server optimization


【解决方案1】:

一般来说,删除一堆行需要时间。删除行有很多开销——尤其是日志记录和锁定,但维护索引、触发器和外键也会增加开销。

最常用的处理方法是使用表分区。基本上,表格存储在单独的部分中,在这种情况下是按时间存储的——比如每周或每月一个。数据库处理分区以提高效率。

然后,从特定时期删除行只是删除分区的问题。这通常比删除记录要快得多。

这确实需要重建表(一次性成本)。确切的语法和详细信息取决于您使用的数据库。但这应该为您指明解决问题的方向。

【讨论】:

  • 谢谢,如果我理解正确的话,这个方法会删除时间列在某个范围内的所有行。我只想删除 value 列在某个范围内的行,而不是这个时间范围内的所有数据。
  • @YakirShlezinger 。 . .您实际上可以按任何列进行分区,包括值。也就是说,时间分区是最常见的。
【解决方案2】:

查看表格,我假设第一列是主键。使用 键删除记录。请参见下面的示例。

... in (select id from some table where value > 80 AND value

完整的查询如下所示: 从某个表中删除 where id in(从 value > 80 AND value

【讨论】:

    猜你喜欢
    • 2013-09-27
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2011-08-14
    相关资源
    最近更新 更多