인덱싱 된 뷰의 이상적인 시나리오처럼 들리므로 쿼리 시간 대신 쓰기 시간에 계산 및 집계 비용을 지불 할 수 있습니다.
CREATE VIEW dbo.MyIndexedView
WITH SCHEMABINDING
AS
SELECT Enroll_Date, UserID, RawCount = COUNT_BIG(*)
FROM dbo.UserTable
GROUP BY Enroll_Date, UserID;
GO
CREATE UNIQUE CLUSTERED INDEX CIX_miv ON dbo.MyIndexedView(Enroll_Date, UserID);
생성하는 데 시간이 걸리고 기본 테이블의 인덱스와 마찬가지로 모든 DML 작업에서 유지 관리가 필요합니다.
이제이 뷰에 대한 쿼리는 매우 유사합니다. 이제 뷰의 각 행은 고유 한 사용자 / 날짜 콤보를 나타내므로 그림은 단일 COUNT (*)로 계산할 수 있으며 기본 테이블의 총 행 수는 다음과 같습니다. 이미 부분적으로 집계되었으므로 이제 날짜 당 SUM을 사용하여 추가해야합니다.
SELECT Enroll_Date,
[Record #] = SUM(RawCount),
[User #] = COUNT(*)
FROM dbo.MyIndexedView WITH (NOEXPAND)
GROUP BY Enroll_Date;
this 와 this를 기억 한 후 NOEXPAND 힌트를 추가 했습니다 .
각 쿼리마다 정확히 한 명의 사용자가있는 드문 경우 (이 경우 동일한 양의 데이터가있는 경우를 제외하고)이 쿼리가 현재 쿼리보다 빠르다는 것을 의심 할 여지없이 알 수 있습니다 우리가 알고있는 열은 기본 테이블의 인덱스에서 유일한 열입니다. 읽기 시간에 이러한 성능 향상이 워크로드의 쓰기 부분에 영향을 미치는 추가 작업의 가치가 있는지 여부는 우리가 알 수없는 것입니다. 트레이드 오프를 측정하기 위해 테스트해야합니다 (인덱스 없음).
그리고 잘 정의 된 특정 범위 (예 : 현재 분기 또는 연도)에 대해 Enroll_Date에 대해 동일한 공통 WHERE 절을 자주 사용하는 경우 일치하는 필터링 된 인덱스를 추가하여 I / O를 훨씬 더 줄일 수 있습니다 (그러나 항상 거래).
기본 테이블에 클러스터형 인덱스를 넣는 것도 고려할 수 있습니다. 이것은 힙에서 이익을 얻는 매우 드문 사용 사례 중 하나가 아닌 것 같습니다.