我有一個表中刪除記錄(假設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