2011-09-23 3 views
1

사용자가 날짜 인덱싱 된 레코드를 찾아야하는 대규모 데이터베이스 테이블 (약 5 천만 행)에 상황이 발생합니다.날짜 인덱스를 통한 Oracle 데이터 배포

그러나 데이터를 탐색하는 사용자는 타임 라인 데이터의 위치와 간격이 어디인지 알 필요가 없습니다. 과거의 프로젝트에서 나는 레코드를 24 시간짜리 버킷으로 양자화했고 막대의 높이가 그 기간의 레코드 수를 나타내는 막대 그래프 타임 라인을 만드는 데 사용했습니다. 이를 통해 사용자는 데이터가 실제로 존재하는 영역에 집중할 수있었습니다.

이 솔루션의 단점은 레코드 수를 지속적으로 업데이트하고 유지해야한다는 것입니다 (데이터를 타임 라인의 임의 지점에서 삽입/제거 할 수있는 경우).

이러한 합계 레코드 수를 얻는 더 좋은 해결책이 있습니까? 예를 들어, 날짜 인덱스를보고 해당 인덱스와 연결된 값의 수를 확인하면됩니까?

답변

1

이것이 실제로 작동하는지 잘 모르겠지만 찾고있는 것 같아서 histograms입니다. 색인에 대한 히스토그램이있는 경우 USER_HISTOGRAMS을 쿼리하여 색인에서 값 분포에 대한 대략적인 아이디어를 얻을 수 있습니다. 단점은 인덱스에 대한 통계가 마지막으로 수집되었을 때만 정확하므로 데이터가 자주 변경되는 경우 최신 정보가 아닐 수 있습니다.

+0

이것은 유망한 것으로 들립니다. 나는 월요일에 다시 확인해보고 더 많은 답이 들어 왔는지 알아볼 것입니다. 만약 더 이상 맞는 것이 없다면, 제가 이것을 선택할 것입니다. 감사! – Klay

1

아니 당신도 부탁하지만 난 다음을 수행 할 비슷한 상황에 직면 무엇인지 :

파티션 s_date의 표. (그게 당신의 "양동이", 파티션 무엇입니까?)

s_date에 비트 맵 인덱스를 만듭니다.

이 같은 통계를 생성합니다

select s_date, count(s_date) from big_table where s_date > '01-APR-11' group by s_date; 

는 또한 오라클의 "수집 최적화 통계"에 읽을 할 수 있습니다, 그것을 아는 것이 좋다.

건배.

+0

일종. 버킷은 오라클 자체가 아니라 데이터에 액세스하는 코드로 작성되었습니다. 나는 몇 년 동안의 데이터를 가지고 있기 때문에 24 시간 동안 테이블을 분할하고 싶지 않습니다. 나는 날짜 인덱스를 조사하고 인덱스 트리의 여러 잎에 첨부 된 값을 계산하는 방법이 있는지 궁금합니다. – Klay

+0

@Klay : 하루에 파티션을 나누었고 로컬 색인을 사용했다면 USER_IND_PARTITIONS.NUM_ROWS에서 좋은 견적을 얻을 수있었습니다. 하루에 데이터를 분할하지 않으시겠습니까? 수백 개의 파티션을 생성하는 것이 반드시 문제가되는 것은 아닙니다. 특히 오라클의 최신 버전을 사용하는 경우 특히 그렇습니다. INTERVAL 파티셔닝은 필요한 파티션을 자동으로 생성하며, 지연된 세그먼트 생성 및 자동 세그먼트 공간 관리는 파티셔닝을 통한 스토리지 오버 헤드의 양을 줄이는 데 도움이됩니다. –