2010-07-22 161 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”一栏。这被称为“聚集索引”。数据类型TIMESTAMP不受支持,主要是因为它也包含纳秒。你可以做的是将unix时间戳(自1970年以来的毫秒)存储为BIGINT。

长答案:数据如何存储在H2中的文档很差。我将在H2数据库的“性能”文档中添加以下部分。我希望这将清除的东西(如果不是,请告诉我):

数据如何存储在内部

对于持久性的数据库,如果表与类型BIGINT,INT的一列主键生成,SMALLINT,TINYINT,那么表格的数据就是这样组织的。这有时也称为“聚集索引”或“索引组织表”。

H2内部以b树的形式存储表数据和索引。每个b-tree将条目存储为唯一键(一个或多个列)和数据(零个或多个列)的列表。表格数据总是以“数据b-tree”的形式组织成一个long类型的单个列键。如果在创建表时指定了BIGINT,INT,SMALLINT,TINYINT类型的单列主键,则此列将用作数据B树的键。如果没有指定主键,如果主键列是另一种数据类型,或者如果主键包含多个列,那么会在表中添加一个类型为BIGINT的隐藏自动增量列,该列用作数据B树的关键。表中的所有其他列都存储在此数据b-tree的数据区域内(大BLOB,CLOB列除外)。

对于每个附加索引,创建一个新的“索引b树”。这个B树的关键是索引列和数据B树的关键字。如果在插入数据后创建了主键,或者主键包含多个列,或者主键不是上面列出的数据类型,则主键存储在新的索引b-tree中。

+0

谢谢托马斯的回应,这有助于更好地理解H2。当然,这是一个问题的答案。 – Tim 2010-07-26 20:10:28