3

時系列が多い環境データにはH2データベースを使用しています。時系列は、データベースに定期的に(たとえば、1時間に1回)記録されるセンサーの単なる測定値です。

テーブルに保存されているデータ:

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でサポートされて いるかどうか誰かが知っていますか?

4

1 に答える 1

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ツリーの形式で内部的に格納します。各Bツリーは、エントリを一意のキー(1つ以上の列)とデータ(0つ以上の列)のリストとして格納します。テーブルデータは常に、long型の単一の列キーを持つ「データBツリー」の形式で編成されます。テーブルの作成時にタイプBIGINT、INT、SMALLINT、TINYINTの単一列の主キーが指定されている場合、この列はデータBツリーのキーとして使用されます。主キーが指定されていない場合、主キー列が別のデータ型である場合、または主キーに複数の列が含まれている場合、タイプBIGINTの非表示の自動インクリメント列がテーブルに追加されます。データbツリーのキー。テーブルの他のすべての列は、このデータBツリーのデータ領域内に格納されます(大きなBLOB、CLOB列、

追加のインデックスごとに、1つの新しい「インデックスbツリー」が作成されます。このBツリーのキーは、インデックス付きの列とデータのBツリーのキーで構成されます。データが挿入された後に主キーが作成された場合、主キーに複数の列が含まれている場合、または主キーが上記のデータ型でない場合、主キーは新しいインデックスBツリーに格納されます。

于 2010-07-23T07:51:27.193 に答える