2010-07-22 114 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