1

这是创建按小时分组的索引视图的脚本示例。我还有另外 2 个用于日和月。每当向用户授予积分时,表 UserPoints 都会存储一条记录,其中包含名为 CreationDate 的确切日期时间时间戳。

使用 SCHEMABINDING AS 创建视图 [dbo].[HourlyPoints]

选择
     [Count] = COUNT_BIG(*) -- SQL Server 要求
    ,[用户身份]
    ,[PointTypeId]
    ,[点数] = SUM(点数)
    ,[Hour] = DATEADD(hour, DATEDIFF(HOUR, 0, [CreationDate]), 0)
FROM [dbo].[UserPoints]
通过...分组
     个人资料 ID
    ,PointTypeId
    ,DATEADD(小时, DATEDIFF(HOUR, 0, [CreationDate]), 0)
去

创建唯一的聚集索引 [IX_HourlyPoints_UserId_PointTypeId_Hour] ON [HourlyPoints] ([UserId],[PointTypeId],[Hour])
去

创建非聚类索引 [IX_HourlyPoints_PointTypeId_Points_Hour] ON [HourlyProfilePoints] ([PointTypeId],[Points],[Hour]) 包括 ([UserId])
去

我正在尝试确保我有正确的索引来查询此索引视图以获得排行榜,该排行榜将根据 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索引。不应该吗?

4

1 回答 1

0

我发现我需要使用 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
于 2013-06-13T03:14:27.157 回答