【发布时间】:2017-01-24 05:42:50
【问题描述】:
我有一张桌子(比如说ErrorLog)
CREATE TABLE [dbo].[ErrorLog]
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[Created] [datetime] NOT NULL,
[Message] [varchar](max) NOT NULL,
CONSTRAINT [PK_ErrorLog]
PRIMARY KEY CLUSTERED ([Id] ASC)
)
我想删除所有超过 3 个月的记录。
我在Created 列上有一个非聚集索引(升序)。
我不确定其中哪一个更好(似乎需要相同的时间)。
查询 #1:
DELETE FROM ErrorLog
WHERE Created <= DATEADD(month, - 3, GETDATE())
查询 #2:
DECLARE @id INT
SELECT @id = max(l.Id)
FROM ErrorLog l
WHERE l.Created <= DATEADD(month, - 3, GETDATE())
DELETE FROM ErrorLog
WHERE Id <= @id
【问题讨论】:
-
第一种方法很好
-
最后一种方法应该更快,因为
id已经有索引,它只有一半宽,...(DateTimes 是 8 个字节,ints 只有 4 个) ,并且可能是聚集的。 - 如果选择的记录是连续的,则使用聚集索引会更快。Created真的有时间和日期吗? - 因为Date列(没有时间)也只有 4 个字节。 -
对,还有时间部分
-
我个人会使用第一种方法。它可能会稍微慢一些(甚至可能不明显),但我更愿意明确我的标准,而不是仅仅假设你身份的每个值都会更低。由于目的是在特定时间范围内删除行,因此您应该通过该列中的值而不是标识值来识别这些行。
-
好吧,既然你说两者之间没有明显区别,我建议你使用第一个。它的意图立即清晰,它需要更少的编码,更容易维护并且在所有情况下都是逻辑正确的。
标签: sql sql-server