我有一个表中删除记录(假设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'已经具有只有一半宽度的索引,...('DateTime's是8个字节,'int's只有4个),并且可能是聚类的。 - 如果选择的记录是连续的,则使用聚簇索引会更快。 ''创造''你真的有时间和日期吗? - 导致“日期”列(没有时间),也只有4个字节。 –
是的,也有一个时间部分 – tomassino