2010-07-22 5 views
3

많은 시간 계열을 포함하는 환경 데이터에 H2 데이터베이스를 사용합니다. 시계열은 주기적으로 데이터베이스에 기록되는 센서의 측정 값입니다 (시간당 한 번). 테이블에 저장된H2 데이터베이스 : 클러스터 된 인덱스 지원

데이터 :

CREATE TABLE hydr 
(dt timestamp 
,value double 
,sensorid int) 
내가 예를 들어, 테이블에 대해 범위 쿼리를하고 싶습니다

:

select * from hydr 
where dt between '2010-01-01' and '2010-10-01' 

싶습니다 성능을 개선하기 위해이 클러스터 구축하기 위해 dt 컬럼을 통한 인덱스. 그러나 H2가 클러스터 된 인덱스를 지원한다면 찾지 못했습니다. 누구든지 클러스터 된 인덱스이 H2에서 지원되는지 알고 있습니까?

답변

9

짧은 대답은 : 테이블의 기본 키는 형 BIGINT 될 필요가있다 :이 경우

CREATE TABLE hydr(dt bigint primary key, value double, sensorid int); 

는 테이블이 구성되어있는 "DT"열을 사용하여. 이것을 "clustered index"라고합니다. TIMESTAMP 데이터 유형은 주로 나노초도 포함되어 있기 때문에 지원되지 않습니다. 당신이 할 수있는 일은 유닉스 타임 스탬프 (1970 년부터 밀리 세컨드)를 BIGINT로 저장하는 것입니다.

긴 대답 : 데이터가 내부적으로 H2에 저장되는 방법에 대한 문서는 좋지 않습니다. H2 데이터베이스의 "성능"문서에 다음 섹션을 추가하겠습니다. 나는 (말씀 해주십시오하지 않은 경우)이 물건을 정리 바랍니다 : 테이블이 형 BIGINT, INT의 단일 열 기본 키를 사용하여 생성 된 경우

이 데이터는 내부적으로 지속 데이터베이스의 경우

을 저장 되는가 , SMALLINT, TINYINT이면 테이블의 데이터는 이런 식으로 구성됩니다. 이것은 때때로 "클러스터 된 인덱스"또는 "인덱스 구성 테이블"이라고도합니다.

H2는 내부적으로 테이블 데이터와 인덱스를 b- 트리 형식으로 저장합니다. 각 b- 트리는 항목을 고유 키 (하나 이상의 열) 및 데이터 (0 개 이상의 열) 목록으로 저장합니다. 테이블 데이터는 항상 long 유형의 단일 열 키가있는 "데이터 b- 트리"형식으로 구성됩니다. 테이블을 작성할 때 BIGINT, INT, SMALLINT, TINYINT 유형의 단일 컬럼 기본 키가 지정되면,이 컬럼은 데이터 b- 트리의 키로 사용됩니다. 기본 키가 지정되지 않은 경우, 기본 키 열이 다른 데이터 형식 인 경우 또는 기본 키에 둘 이상의 열이있는 경우 숨겨진 BIGINT 자동 증가 열이 테이블에 추가됩니다.이 열은 다음과 같이 사용됩니다. 데이터 b 트리의 키 테이블의 다른 모든 C 럼은이 데이터 b- 트리의 데이터 영역에 저장됩니다 (외부 BLOB, CLOB C 럼 제외).

각 추가 색인에 대해 하나의 새로운 "색인 b- 트리"가 작성됩니다. 이 b- 트리의 키는 색인 된 열과 데이터 b- 트리의 키로 구성됩니다. 데이터가 삽입 된 후 기본 키가 작성되거나 기본 키에 여러 컬럼이 들어 있거나 기본 키가 위에 나열된 데이터 유형이 아닌 경우 기본 키는 새 인덱스 b- 트리에 저장됩니다.

+0

토마스에게 답변 해 주신 것에 감사 드리며,이 점은 H2를 조금 더 잘 이해하는 데 도움이됩니다. 물론 이것은 질문에 대한 대답입니다. – Tim

관련 문제