H2Databaseを追っかけていたりしたブログ

H2 database のリリースノートを読んだりとか。

Version 1.3.174 (2013-10-19)

約3ヶ月ぶりのリリースでした。最近は、MVS周りの実装に力が注がれていて、その他はあんまり。あと、Geometory関連は粛々とパッチが送られてきているのできっと充実してきているのかな。

QUERY_STATISTICSまわりは実装大丈夫なのかなと言う気はしますが、パフォーマンスチューニングに便利でしょう。ちょっと突っ込んでみてみたい。

久しぶりにConsoleツールの不具合を見つけたので、久しぶりにパッチ書いてみようかな。

  • LIRSキャッシュ: 空のエントリのみを含むキャッシュについてのバグ修正
    • よくわかりません。
  • インメモリデータベースで、ハッシュインデックスのカラムでgroup byを行った場合RuntimeExceptionがスローされていた
  • 一部のシンタックスエラーについてエラーメッセージの改善
  • ファイルシステム抽象化: 直接使用された場合、いくつかのファイルシステムで正しくバイトが出力されなかった(データベースエンジンはこれらを使用していない)
  • MVStoreストレージエンジン(現在開発中)を使用するため、データベースURLに";mv_store=true"を設定可能に。テーブルを作成する際にMVTableEngineを使うのは推奨されなくなった。
  • ユーザ定義関数をコンパイルするために、使用できるようであれば、javax.tools.JavaCompilerが使われるようになり、テンポラリファイルも作成されなくなった。これにより並列に同一のユーザ定義関数を作成する際の問題が解決される。無効にするためには、システムプロパティ"h2.javaSystemCompiler"をfalseに設定する。
  • 異なるデータベースで並列にfunction aliasを作成すると例外"javac: file not found"が発生する結果となっていた。
  • 関数 "regexp_replace"が不正な置換文字列が渡された場合に適切ではない種類の例外をスローしていた。
  • チェックポイントがMAX_LOG_SIZEの二分の一ごとに実施されるようになった(変更前はMAX_LOG_SIZE毎)。そのためトランザクションログはそれほど大きくならなくなった。
  • MVStore table engine: 古いデータを保持する時間を設定するための新しい設定"retention_time"。デフォルトは45秒。
  • TableEngine.createTable()メソッドがTableオブジェクトを返すようになった。
  • 読み込み専用のデータベースでトレースレベルが"debug"のとき、トレース情報がテンポラリのディレクトリに出力されるようになった
    • 元々は出力されていなかったようです。
  • ファイルロックのクローズがバックグラウンドのスレッドが停止されるのを待つようなった。
  • version 1.3.172にて、Issue 389(複合主キーがある場合に必ずしも正しいインデックスを選択できない)の修正においてパフォーマンスのリグレッションが発生していた。これは"order by"のカラムリストにマッチしたインデックスを選択されやすくする機能に関連している(適切ではないインデックスが使用されるケースがあった)
  • 位置情報索引とデータタイプの改善。
  • Issue 467: OSGiクラスローダー(他のクラスローダー内のクラスへの参照を作成できるようにする。例えば他のOSGi bundleなど)
  • 集約関数を使ったサブクエリを含む"group by"クエリでいくつかのケースで不正な結果を返していた。
  • 検索のキーとテーブルのハッシュインデックスの型が異なる場合、不正確な結果になっていた。例えば、片方がINTで片方がLONGという場合。
    • 原文は"Fix bug in unique and non-unique hash indexes which manifested as incorrect results when the search key was a different cardinal type from the table index key. e.g. where the one was INT and the other was LONG"
  • Bug: データベースの定義が変わった際に、クエリーキャッシュの無効化が行われていなかった
  • 新機能: データベース毎にカスタムのJavaオブジェクトのシリアライズエンジンを使えるようになった
  • とても大きなデータベース(6G超)においてリカバリーツールが走っている時、いくつかの統計がマイナスの値を返していた
  • 大きなトランザクションを保持しているセッションを検知するために、SESSIONSテーブルにCONTAINS_UNCOMMITEDカラムが追加された
    • 機能追加当初は、UNDO_LOG_SIZEというカラムだったのが途中で変更された
  • いくつかのGEOMETRY関連の修正
  • BNFツールとオートコンプリートの機能がOSGi向けにエクスポートされた。これによりエディタでオートコンプリートが可能になるかもしれない。
  • DROP ALL OBJECTSとDROP SCHEMAにおいて導出項目による依存関係チェックの修正
    • 原文は、"Fix DROP ALL OBJECTS and DROP SCHEMA in the presence of tables with computed column dependencies."。正確に訳すとなんでしょうね。
    • CREATE TABLE B (B INT AS SELECT A FROM A)みたいに作られたテーブルの依存関係のチェック。
    • あまり細かくは見てないのですが、元々動作上は問題なさそうな感じでしたが、単体のテーブルをドロップする場合(この例だと、drop table a した場合)に、エラーメッセージが二度表示されていたのが一回になっています。これは副次的な効果なのかもしれませんが。
    • とか見てるときに、しょうもないバグ(org.h2.tools.Shell周り)見つけた...。
  • セッションテンポラリのLOGが時々累積されてしまっていて、シャットダウンまでDBファイルのサイズが増加してしまっていた。コミット毎にクリアされるようになった。
  • 1カラムより多いカラムを持つハッシュインデックスが暗黙に通常のインデックスに変換されてしまうバグがあった。このような場合は、例外をスローするようになった。
    • CREATE HASH INDEX ON HOGE(ID, ID2)みたいな場合。
  • クエリの統計: 直近に実行された100のSQLとそのパフォーマンスデータが蓄積されるようになった。パフォーマンスが悪いクエリを見つけ出すのに有用。
    • ヘルプにもかいてありますが、SET QUERY_STATISTICS=trueで有効化、select * from infromation_schema.query_statisticsで参照可能です。
    • が、なんだかちょっと動きが微妙な気が...
  • LOBカラムの読み込みと更新による、LOBデッドロックの修正
  • JDBC DatabaseMetaData#getClientInfoProperties()メソッドのサポート。空の結果を返却する。これはWebSphereの為に実装された。
  • Server#openBrowserが環境変数$BROWSERをチェックするようになった。
  • org.h2.util.ScriptReaderの閉じられていないブロックコメントのハンドリングの修正
  • 巨大なステートメントを生成する壊れたスクリプトをハンドリングする際により適切な例外をスローするようにした
    • "Make org.h2.util.ScriptReader throw a better exception when handling broken scripts which generate extremely large statements."
    • この修正により、1ステートメントの長さが約1GB(というかInteger.MAX_VALUE/2)に制限された
  • ALLOW_LITERALS=NONEの場合、insertの際に定期的に実行されるテーブルのアナライズで、例外が発生しており、そのバグの修正。コンソールツールの同様の問題も修正された。
    • INFORMATION_SCHEMA.SETTINGSテーブルからMODEを取得する際に内部的に使っていたSQL文がNAME='MODE'とリテラルでかかれていたのでそれでエラーになっていた模様。
  • Issue 510: 利用者のために org.h2.bnfをpublicにした
    • 原文は"Issue 510: Make org.h2.bnf public for consumption by external projects, patch by Nicolas Fortin"
    • あと、追加でプロシージャ(エイリアス)もBnfオブジェクトに入るようになったとか。
  • Issue 509: ジオメトリデータ型の重要な修正。ValueGeometry#getDimensionCount の信頼性の向上。不正なジオメトリ値をチェックするユニットテストの追加。ジオメトリ型からオブジェクトへの変換に関してのユニットテストの追加。ジオメトリ値がWKBで表現できるかチェック。
  • Issue 506: デッドロックが発生した場合に備えて、Thread.getName()もデッドロックの際のエラー表示に含めてほしい。
  • "GRANT ALTER ANY SCHEMA TO "のサポート