Это правильные индексы для индексированного представления для списков лидеров, сгруппированных по часам/дням/месяцам?

Вот пример скрипта, который создает индексированное представление, сгруппированное по часам. У меня также есть 2 других для дня и месяца. В таблице UserPoints хранится запись всякий раз, когда баллы начисляются пользователю с точной отметкой времени DateTime, которая называется CreationDate.

CREATE VIEW [dbo].[HourlyPoints] WITH SCHEMABINDING AS 

SELECT 
     [Count]        = COUNT_BIG(*) --Required by SQL Server
    ,[UserId]
    ,[PointTypeId]
    ,[Points]       = SUM(Points) 
    ,[Hour]         = DATEADD(hour, DATEDIFF(HOUR, 0, [CreationDate]), 0)
FROM [dbo].[UserPoints]
GROUP BY 
     ProfileId
    ,PointTypeId
    ,DATEADD(hour, DATEDIFF(HOUR, 0, [CreationDate]), 0)
GO

CREATE UNIQUE CLUSTERED INDEX [IX_HourlyPoints_UserId_PointTypeId_Hour] ON [HourlyPoints] ([UserId],[PointTypeId],[Hour])
GO

CREATE NONCLUSTERED INDEX [IX_HourlyPoints_PointTypeId_Points_Hour] ON [HourlyProfilePoints] ([PointTypeId],[Points],[Hour]) INCLUDE ([UserId])
GO

Я пытаюсь убедиться, что у меня есть правильные индексы для запроса этого индексированного представления для таблицы лидеров, которая будет ранжировать пользователей на основе PointType и суммы баллов.

Например, мой запрос таблицы лидеров выглядит так, если мне нужна таблица лидеров, основанная на количестве очков, заработанных пользователями за последние 3 часа. (или любое другое временное окно).

SELECT * FROM [HourlyPoints]
WHERE [PointTypeId] = 1 --Gold Points 
  AND [Hour] >= '2013-06-13 01:00:00.000' 
  AND [Hour] < '2013-06-13 04:00:00.000'
ORDER BY Points

Что меня беспокоит, так это то, что когда я запускаю этот запрос, я не вижу окно плана выполнения, показывающее, что он использует индекс IX_HourlyPoints_PointTypeId_Points_Hour. Разве не должно?


person Vyrotek    schedule 13.06.2013    source источник


Ответы (1)


Я понял, что мне нужно использовать WITH(NOEXPAND)!

SELECT * FROM [HourlyPoints] WITH (NOEXPAND)
WHERE [PointTypeId] = 1 --Gold Points 
  AND [Hour] >= '2013-06-13 01:00:00.000' 
  AND [Hour] < '2013-06-13 04:00:00.000'
ORDER BY Points
person Vyrotek    schedule 13.06.2013