でレコードを削除し、私はテーブルを持っている私は3ヶ月という古いすべてのレコードを削除したいクラスタ化または非クラスタ化インデックス
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)
)
(のはErrorLog
をしましょう)。
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'は8バイト、 'int'はわずか4 )、おそらくクラスタ化されています。 - 選択されたレコードが連続している場合は、クラスタ化インデックスを使用する方が高速です。あなたは本当に '創造された'の中に日付と日付を持っていますか? - (日付なしの) 'Date'カラムは、4バイトだけです。 –
はい、時間の部分もあります – tomassino