Я создаю Notification
таблицу со следующей спецификацией:Нужна помощь с отфильтрованным Индексом
CREATE TABLE [Notification] (
[NotificationId] [int] NOT NULL IDENTITY (1, 1),
[IsActive] [bit] NOT NULL,
[TriggerKey] [nvarchar](50) NOT NULL,
[ObjectId] [int] NOT NULL,
[RecipientType] [tinyint] NOT NULL,
CONSTRAINT PK_Notification PRIMARY KEY CLUSTERED
(
[NotificationId] ASC
)
)
Каждый раз, когда уведомление получает изменилось, а не обновлять свои ценности, я хочу, чтобы создать новую, «Активный msgstr "уведомление и деактивация предыдущего. Но предыдущее уведомление должно быть доступно, если оно указано в NotificationId. Поэтому я ожидаю, что в конечном итоге будет гораздо больше неактивных уведомлений, чем активных.
Это будет относительно редкость для добавления или изменения уведомлений. Гораздо более распространенным будет:
- Запрос на внешней таблицы, которая соединяет с этой таблицей на основе NotificationId и
- Запрос на «Active» уведомлений с заданной TriggerKey и ObjectId
В первом случае я считаю, что индекс первичного ключа будет достаточным. Во втором случае, я имею в виду создание следующий отфильтрованный индекс:
CREATE NONCLUSTERED INDEX IDX_Notification_ActiveTriggerObject
ON [Notification] (IsActive, TriggerKey, ObjectId)
WHERE IsActive = 1
Однако, когда я проверяю план выполнения до и после создания этого индекса, это, кажется, не привыкать. Зачем?
Update
Благодаря the article связанным в общепринятом ответе, вот исправленная версия индекса: (? Большинства)
CREATE NONCLUSTERED INDEX IDX_Notification_ActiveTriggerObject
ON [Notification] (TriggerKey, ObjectId)
INCLUDE (IsActive, NotificationId, RecipientType)
WHERE IsActive = 1
В этой статье мне все ясно. Спасибо! – StriplingWarrior