2013-06-13 3 views
1

다음은 시간별 그룹화 된 인덱싱 된보기를 만드는 스크립트의 예입니다. 나는 또한 일 및 월을 위해 2 다른 사람이있다. UserPoints 테이블은 CreationDate라는 정확한 DateTime 타임 스탬프로 포인트가 사용자에게 부여 될 때마다 레코드를 저장합니다. 나는 포인트의 PointType & 합계를 기반으로 사용자를 평가하는 리더이 인덱싱 된 뷰를 조회 할 수있는 권리 인덱스가 있는지 확인하기 위해 노력하고있어시간/일/월 단위로 그룹화 된 리더 보드의 인덱싱 된보기에 대한 올바른 인덱스입니까?

 
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 

.

예를 들어 지난 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 인덱스를 사용하고 있음을 보여주는 볼 수 없다는 것입니다. 그래야하지 않니?

답변

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 
관련 문제