База данных H2: поддержка кластерных индексов - PullRequest
3 голосов
/ 22 июля 2010

Я использую базу данных 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?

1 Ответ

10 голосов
/ 23 июля 2010

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...