Вот пример скрипта, который создает индексированное представление, сгруппированное по часам. У меня также есть 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. Разве не должно?