У нас довольно большая таблица (300 тыс. Строк) с большим количеством столбцов (более 80). Один из столбцов является битовым полем, которое указывает, была ли удалена строка:
CREATE TABLE [dbo].[tblProject]
(
[Id] [INT] IDENTITY(1,1) NOT NULL,
...
[Deleted] [BIT] NOT NULL,
CONSTRAINT [PK_tblProject]
PRIMARY KEY CLUSTERED ([Id] ASC) ON [PRIMARY]
)
Некоторые разработчики, которые больше не работают с нами, создали 3 индекса для столбца Deleted
:
CREATE NONCLUSTERED INDEX [IX_tblProject_Deleted]
ON [dbo].[tblProject] ([Deleted] ASC)
INCLUDE ([Id], [FK1Id], [FK2Id], [FK3Id], [SomeDecimalColumn]) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_tblProject_Deleted2]
ON [dbo].[tblProject] ([Deleted] ASC)
INCLUDE ([Id], [FK1Id], [FK2Id], [FK4Id], [FK5Id]) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_tblProject_Deleted3]
ON [dbo].[tblProject] ([Deleted] ASC)
INCLUDE ([Id], [FK1Id], [FK2Id], [FK4Id]) ON [PRIMARY]
Мой первый вопрос - кажется, что третий индекс полностью покрыт индексом 2. Прав ли я, что такой индекс не приносит ничего ценного и может быть удален?
Распределение данных для столбца Deleted
выглядит следующим образом:
99.9% rows contain 0
0.1% rows contain 1
У нас много запросов, соединяющихся с tblProject
по различным внешним ключам, все они включают в себя предложение WHERE Deleted = 0
. Как видите, этот предикат почти не удаляет строки из рабочего набора.
По моим сведениям и по следующим ссылкам:
Индекс сервера SQL в битовых полях
Должен ли я индексировать битовое поле в SQL Server?
Индекс по битовому столбцу
Оптимизатор запросов никогда не будет использовать такие индексы, так как использование этих индексов вообще не уменьшит рабочий набор. Просто более эффективно выполнять сканирование таблицы, чем читать индекс.
Они были бы полезны, если бы в наших запросах содержалось предложение WHERE Deleted = 1
. Но они этого не делают.
Так можно ли безопасно удалить все эти индексы?
Или оптимизатор запросов достаточно умен, чтобы использовать индекс, чтобы быстро найти строки, в которых значение Deleted = 1, а затем удалить их из рабочего набора для достижения значения Deleted = 0?
Я не могу проверить все запросы, которые у нас есть в системе, чтобы убедиться, что индексы не используются. Я хотел бы удалить эти индексы, но не хочу снижать производительность системы. Может ли их удаление негативно повлиять на производительность?