Получение синтаксической ошибки при создании фильтрованного индекса - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь добавить этот индекс:

CREATE NONCLUSTERED INDEX [HE_MissingIndex] 
ON [dbo].[HardwareEvents] ([PlaceId] ASC, [EventId] ASC, [UserTokenType])
INCLUDE ([Id], [EventTime], [UserToken], [Username], [UserId],
         [VisitorId], [UserLastname]) 
WHERE (EventId = 16 AND UserTokenType = 5) OR EventId = 58
          WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                SORT_IN_TEMPDB = OFF, DROP_EXISTING = ON, ONLINE = OFF, 
                ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

К сожалению, я получаю это сообщение об ошибке:

Сообщение 156, Уровень 15, Состояние 1, Строка 16
Неверный синтаксис рядом с ключевым словом 'или'.

Что странно для меня. Я ознакомился со связанной страницей MSDN, и я не вижу здесь никаких ограничений. Оба столбца в фильтре присутствуют в индексе. Индекс создается без ИЛИ в выражении. Что мне здесь не хватает?

1 Ответ

1 голос
/ 10 мая 2019

Отфильтрованные индексы допускают только предикаты AND и IN, поэтому ваша проблема в предложении WHERE - вы не можете использовать OR. Вы можете обойти это, создав два индекса:

CREATE NONCLUSTERED INDEX [HE_MissingIndex] ON [dbo].[HardwareEvents]
(
    [PlaceId] ASC,
    [EventId] ASC,
    [UserTokenType] ASC
)
INCLUDE (   [Id],
    [EventTime],
    [UserToken],
    [Username],
    [UserId],
    [VisitorId],
    [UserLastname]) 
    WHERE [EventId] = 16 and [UserTokenType] = 5
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = ON, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]


CREATE NONCLUSTERED INDEX [HE_MissingIndex_2] ON [dbo].[HardwareEvents]
(
    [PlaceId] ASC,
    [EventId] ASC,
    [UserTokenType] ASC
)
INCLUDE (   [Id],
    [EventTime],
    [UserToken],
    [Username],
    [UserId],
    [VisitorId],
    [UserLastname]) 
    WHERE [EventId] = 58
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = ON, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
...