2010-07-22 2 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' 

В целях повышения производительности я хотел бы построить кластерные index over dt, но дело в том, что я не нашел, поддерживает ли H2 кластеризованные индексы. Кто-нибудь знает, поддерживаются ли в H2? кластерные индексы?

ответ

9

Короткий ответ: первичный ключ вашей таблицы должно быть типа BIGINT:

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

В этом случае таблица организована с использованием «DT» колонку. Это называется «кластеризованным индексом». Тип данных TIMESTAMP не поддерживается, главным образом потому, что он также содержит наносекунды. Что вы можете сделать, так это хранить временную метку unix (миллисекунды с 1970 года) как BIGINT.

Длинный ответ: документация о том, как данные хранятся внутри Н2, оставляет желать лучшего. Я добавлю следующий раздел в документацию «производительности» базы данных H2. Я надеюсь, что это прояснится вещи (если не скажите, пожалуйста):

как данные хранятся внутри

Для постоянных баз данных, если таблица создается с помощью одного столбца первичного ключа типа BIGINT, INT , SMALLINT, TINYINT, то данные таблицы организованы таким образом. Это иногда также называют «кластеризованным индексом» или «индексной организованной таблицей».

H2 внутренне хранит данные таблицы и индексы в виде b-деревьев. Каждое b-дерево хранит записи как список уникальных ключей (один или несколько столбцов) и данных (ноль или более столбцов). Данные таблицы всегда организованы в виде «дерева данных b» с одним столбцом ключа типа long. Если для создания таблицы указывается первичный ключ одного столбца типа BIGINT, INT, SMALLINT, TINYINT, то этот столбец используется как ключ для b-дерева данных. Если первичный ключ не указан, если столбец первичного ключа относится к другому типу данных или если первичный ключ содержит более одного столбца, то в таблицу добавляется скрытый столбец автоматического нарастания типа BIGINT, который используется как ключ для данных b-дерева. Все остальные столбцы таблицы хранятся в области данных этого дерева данных (за исключением больших столбцов BLOB, CLOB, которые хранятся извне).

Для каждого дополнительного индекса создается одно новое «b-дерево индекса». Ключ этого b-дерева состоит из индексированных столбцов плюс ключ данных b-дерева. Если первичный ключ создается после того, как данные были вставлены или первичный ключ содержит несколько столбцов, или если первичный ключ не относится к перечисленным выше типам данных, первичный ключ сохраняется в новом b-дереве индекса.

+0

спасибо Томас за ответ, это помогло понять H2 немного лучше. Конечно, это ответ на вопрос. – Tim

Смежные вопросы