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