У меня есть таблица с 5 индексами в SQL-сервере. Мне известно о том, что индексы влияют на вставки, поэтому я хотел бы свести их к минимуму. Мне определенно нужны первые четыре индекса (как видно из примера ниже).
Тем не менее, я совершенно уверен, что последний индекс (TimeSubmitted) абсолютно необходим - обратите внимание, что уже есть индекс CliendId + TimeSubmitted.
Единственная причина, по которой это происходит, состоит в том, чтобы сделать очистку просроченных строк из таблицы более эффективной - или, по крайней мере, таково мое намерение. Задание на очистку будет выполняться один раз в день, скорее всего ночью.
В любой момент времени в таблице могут быть сотни тысяч записей.
Сохраненный процесс очистки таблицы:
CREATE PROCEDURE uspPurgeMyTable
(
@ExpiryDate datetime
)
AS
BEGIN
DELETE FROM MyTable
WHERE TimeSubmitted < @ExpiryDate;
END
Таблица (не релевантные столбцы опущены):
CREATE TABLE MyTable (
[ClientId] [char](36) NOT NULL,
[UserName] [nvarchar](256) NOT NULL,
[TimeSubmitted] [datetime] NOT NULL,
[ProviderId] [uniqueidentifier] NULL,
[RegionId] [int] NULL
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_MyTable_ClientArea] ON [dbo].[MyTable]
(
[ClientId] ASC,
[RegionId] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_MyTable_ClientPrinter] ON [dbo].[MyTable]
(
[ClientId] ASC,
[ProviderId] DESC
)WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_MyTable_ClientTime] ON [dbo].[MyTable]
(
[ClientId] ASC,
[TimeSubmitted] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_MyTable_ClientUser] ON [dbo].[MyTable]
(
[ClientId] ASC,
[UserName] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_MyTable_TimeSubmitted] ON [dbo].[MyTable]
(
[TimeSubmitted] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]