2009-11-12 2 views
1

약 80 개의 열이있는 비정규 화 된 테이블이 있고 1 개월에 약 1,000 만 행 (약 5GB)의 비율로 증가한다고 가정합니다. 현재 3 1/2 년의 데이터 (~ 400M 행, ~ 200GB)가 있습니다. 비정규 화 된 테이블에서 비 스칼라 집계의 성능을 향상시키는 방법

우리는 우리가 테이블을 쿼리 할 때 때문에, 우리가 항상 가지고 ... 우리의 기본 키의 역할을 다음과 같은 열을 테이블에서 데이터를 검색에 가장 적합한에 클러스터 된 인덱스 ...

[FileDate] ASC, 
    [Region] ASC, 
    [KeyValue1] ASC, 
    [KeyValue2] ASC 

를 만들 전체 기본 키

이러한 쿼리는 항상 클러스터 된 인덱스 검색을 수행하므로 매우 빠르며 조각화는 최소로 유지됩니다. 그러나, 우리는이 클러스터되지 않은 만드는 것입니다에 "최고"솔루션은 내가 올 수 즉

SELECT 
    [Region] 
    , MAX([FileDate]) AS [FileDate] 
    FROM 
    HugeTable 
    GROUP BY 
    [Region] 

, 보고서 일반적으로, 우리는 모든 지역에 대한 가장 최근의 FileDate을 얻을하려는 상황을해야합니까 지역 색인. 로드하는 동안 테이블에 추가 삽입을 의미하지만 히트는 최소가 아닙니다 (하루에 4 번로드하므로로드 당 추가 인덱스 삽입이 100,000 개 미만입니다). 테이블도 FileDate에 의해 파티셔닝되기 때문에, 쿼리에 대한 결과는 충분히 빠르게 돌아옵니다 (200ms 정도). 그리고 그 결과 세트는 다음로드 때까지 캐시됩니다.

그러나 나는 데이터웨어 하우징 경험이 많은 사람이 어떤 이유로 최적의 솔루션을 갖고 있다고 생각합니다.

답변

1

영역이 아닌 영역 (FileDate)에 커버리지 인덱스 (비 클러스터링)를 생성합니다. 그러나 클러스터 된 키가 크기 때문에 키가 커집니다.

그렇지 않으면, AdamRalph의 아이디어를 시도하지만이 오버 헤드가 생각하는 다른 인덱스

+0

원래 질문에 오타가 있었습니까? 실제로 클러스터되지 않은 추가 색인보다 더 나은 것을 생각할 수 없었습니다. 보람있는 제품을 만들기 위해서는 너무 많은 사전 처리 또는 후 처리가 필요합니다. –

1

또 다른 옵션은 각 Region에 대해 가장 최근의 FileDate을 보유하는 다른 테이블 (Region, FileDate)을 갖는 것입니다. 로드하는 동안이 테이블을 업데이트하십시오.

+0

(Region, FileDate)에 대한 다른 색인은 더 간단할까요? – gbn

+0

네, 확실히 간단합니다. 나는 데이터 볼륨과 b) 업데이트 시간을 생각하고 있었다. 후자의 이점을 얻으려면 데이터로드와 별도로 Region, Max (FileDate)에 대한 지식이 필요합니다. 그렇지 않으면 각 삽입에 조건부를 수행하게됩니다. 데이터 볼륨이 문제가 아니거나 설명 된대로 업데이트 수를 줄일 수없는 경우 추가적인 커버링 인덱스가 가장 좋습니다. –

0

당신이 분석 서비스에 큐브를 구축하고, 큐브에 대한 당신의 집계 쿼리를 실행할 수있는 모든 기회를 능가?

큐브가 업데이트를 완료 할 때까지 데이터가 변경 될 때까지 지연이 있지만 쿼리가 더 빨라야합니다.

관련 문제