我将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中是否支持聚簇索引?
答案 0 :(得分:10)
简短回答:您的表的主键必须是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-tree的形式存储表数据和索引。每个b树将条目存储为唯一键(一个或多个列)和数据(零个或多个列)的列表。表数据总是以“数据b树”的形式组织,其中单个列键为long。如果在创建表时指定了BIGINT,INT,SMALLINT,TINYINT类型的单列主键,则此列将用作数据b树的键。如果未指定主键,如果主键列属于另一种数据类型,或者主键包含多个列,则会将一个类型为BIGINT的隐藏自动增量列添加到表中,该列用作数据b树的关键。表的所有其他列都存储在此数据b树的数据区域中(大型BLOB,CLOB列除外,这些列存储在外部)。
对于每个附加索引,创建一个新的“索引b树”。此b树的关键字包括索引列以及数据b树的键。如果在插入数据后创建主键,或者主键包含多个列,或者主键不是上面列出的数据类型,则主键存储在新的索引b树中。