Repository navigation
Tsurugi 1.13.0 - Release Notes (ja) #250
akirakw
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
1.13.0 リリースノート
概要
Tsurugi 1.13.0 では、インデックス構造の格納効率を改善し、特にセカンダリインデックスを使用するテーブルのメモリ使用量を削減しました。
Tsurugi はテーブルとインデックスのデータを、キーを8バイトずつ区切った階層構造でメモリ上に格納します。
従来のバージョンでは、他のキーと区別できた後の残りも8バイトごとに1階層ずつ格納しており、長いキーほどメモリを多く使っていました。
これはカラムの値の後ろに主キーが続くセカンダリインデックスや、UUIDなどの長い文字列の主キーで顕著でした。
本バージョンではこの残りの部分をまとめて格納するよう改善しました。
例えば、2つのセカンダリインデックスを持つテーブルを使用するベンチマーク (Phone-Bill) では、メモリ使用量 (RSS) が約130GBから約62GBへと半分以下に削減されています。
また、Tsurugi 1.13.0 では
GROUP BY句に任意の式を指定できるようになりました。従来のバージョンでは
GROUP BY句にはカラムのみを指定でき、式の結果でグループ化するには、サブクエリーで式の結果を列として取得する必要がありました。本バージョンでは
GROUP BY EXTRACT(YEAR FROM ts)のようにGROUP BY句に式を直接記述できます。Tsurugi 1.12.0 で対応した
EXTRACT関数と組み合わせることで、年ごとや月ごとといった時系列データの集計を、より簡潔なSQLで記述できます。その他、本バージョンではいくつかの重要な不具合修正や安定性の向上を行っています。
前バージョンを利用するすべてのユーザーは本バージョンへのアップグレードを強く推奨します。
機能追加と改善
機能追加と改善 - SQL
GROUP BY句に任意の式を指定できるよう対応GROUP BY句の要素として、カラムに加えて関数呼び出しや演算などの式を指定できるようになりました。GROUP BY句に指定した式は、SELECT句,HAVING句,ORDER BY句から参照できます。式の一部として参照することもできます。SELECT句などから参照する式は、GROUP BY句に指定した式と同じ形で記述する必要があります。例えばGROUP BY a + 1に対してSELECT 1 + aは同じ式とみなされず、エラー (column must be aggregated) となります。Note
本バージョンでは、
GROUP BY句の式について以下の制約があります。GROUP BY句の要素として指定できません。GROUP BY 1)GROUP BY a + COUNT(*))BLOB型,CLOB型の式GROUP BY句の要素として指定できますが、SELECT句などから参照できません。BETWEEN述語,IN述語を含む式CASE式 (例:CASE a WHEN 1 THEN ... END)NULLIF式これらの式でグループ化した結果を参照したい場合は、従来と同様に、サブクエリーで式の結果を列として取得し、その列を
GROUP BY句に指定してください。Important
本バージョンより、
GROUP BY句でCOLLATEを指定するとエラー (collation in GROUP BY is not yet supported) となります。従来のバージョンでは
GROUP BY句に指定したCOLLATEはエラーにならず、無視されていました。Note
その他、SQL機能の詳細仕様や現時点での制約については、tsurugidbの以下のドキュメントを参照してください。
機能追加と改善 - Transaction
テーブルの行とインデックスのエントリは、キーを先頭から8バイトずつ区切った階層構造でメモリ上に格納されます。従来のバージョンでは、キーの途中で他のキーと区別できるようになった後も、残りの部分を8バイトごとに1階層ずつ格納していたため、長いキーほど多くのメモリを使っていました。本バージョンでは、この残りの部分をまとめて格納するよう改善しました。
テーブル本体やインデックスごとの削減の効果は、キーの先頭に近い位置で他のキーと区別でき、残りの部分が長いほど大きくなります。
BIGINTのテーブル本体のようにキーが8バイトに収まる場合は、削減の余地はほぼありません。ベンチマーク Phone-Bill では、データベースのメモリ使用量 (RSS) が約130GBから約62GBへと半分以下になりました。このベンチマークの通話履歴テーブルは、電話番号や通話開始日時からなる平均約32バイトの主キーを持ち、通話開始日時などのセカンダリインデックスが作成されています。通話開始日時はほぼ一意で、その後ろに長い主キーが連結されるため、本バージョンの改善が大きく効きます。
その他、単一のインデックス構成による効果例を以下に示します。主キーが
BIGINTの300万行のテーブルに、値の傾向が異なるカラムでセカンダリインデックスを1つずつ作成し、エントリ1件あたりのメモリ使用量を測定したものです。CHAR(36))VARCHAR(64))TIMESTAMP)CHAR(10))BIGINT)DECIMAL(12,2))TIMESTAMP)BIGINT)INT)機能追加と改善 - Client
Cursor.explainメソッドを追加explainメソッドの引数はexecuteメソッドと同様です。詳細は以下のドキュメントを参照してください。Connection.commit,Connection.rollbackの呼び出し時に、トランザクションを明示的にクローズするよう変更commit,rollbackの呼び出し時にリソースを解放します。queryツールが保持するリソースの数の上限を指定する起動オプション--query-pool-sizeを追加queryツールは、結果が応答サイズの上限を超えた場合に、続きを読むためのセッションやトランザクションなどのリソースを保持します。続きが読まれない場合、これらのリソースは解放されずに残り続けていました。--query-pool-sizeを指定すると、保持するリソースの数が上限を超えたときに、最も古いリソースから解放します。デフォルトは0(無制限) です。機能追加と改善 - Distribution
apache.jfrog.ioからpackages.apache.orgに変更packages.apache.orgが推奨されていることに合わせた変更です。どちらのホストからも同じパッケージを取得でき、インストールされる Apache Arrow のバージョンに変更はありません。バグ修正
バグ修正 - SQL
TRUNCATE TABLEの実行中に、同じテーブルに対するDMLが実行されるとデータベースが異常終了することがあるTRUNCATE TABLEの処理中に、同じテーブルへのDMLを排他できない区間がありました。この区間でプレースホルダーを使用しない文の実行やprepareが行われると、TRUNCATE TABLEがエラー (DDL operation was blocked by other DML operation) で失敗し、その後のDMLの実行でデータベースが異常終了することがあります。また、TRUNCATE TABLEがエラーを返したにもかかわらず、テーブルのデータが削除されることがあります。DECIMAL型の値 (例:1.0と1) が混在すると、GROUP BY,SELECT DISTINCT,COUNT(DISTINCT ...), 等価結合でそれらが異なる値として扱われ、クエリの結果が正しくないことがあるCASE式やCOALESCE関数で分岐ごとに型が異なる場合や、UNION ALLでスケールの異なる式の結果を合わせる場合など、式で計算したDECIMAL型の値をキーとして使用する場合に発生します。テーブルのカラムをそのままキーとして使用する場合は発生しません。REAL型,DOUBLE型の値に対するCOUNT(DISTINCT ...)で、NaN同士が異なる値として扱われ、正しくない値を返すGROUP BYやSELECT DISTINCTと同様にNaN同士を等しい値として扱います。CHAR_LENGTHなどの文字列関数を実行すると、文字列の範囲外のメモリを参照し、正しくない結果を返すことがあるCHAR_LENGTHはNULLを返します。バグ修正 - Transaction
INSERTした後、同じトランザクションのスキャン範囲に他のトランザクションがINSERTを行った場合に、Serializableの違反を検出できずにコミットが成功してしまうことがあるWRITE PRESERVEに指定したテーブルを他のトランザクションがDROP TABLEまたはTRUNCATE TABLEすると、LTXのコミットまたはロールバック時にデータベースが異常終了することがあるバグ修正 - Endpoint
BLOB型,CLOB型のデータを送信すると、送信したデータのファイルがデータベース側のvar/blob/sessionsディレクトリ配下に残り続けるPreparedStatementのパラメータやLargeObjectClientでデータを送信した場合にこの問題が発生します。UDFのBLOBクライアントAPIでは発生しません。バグ修正 - UDF
APPLY演算子を使用してユーザー定義表値関数を呼び出すクエリが途中でエラーになると、データベースが異常終了するudf-plugin-builderでUDFプラグインを再生成してデプロイしてください。APPLY演算子を使用してユーザー定義表値関数を呼び出す際に、結果行に16バイト以上のVARCHAR,VARBINARY型の値が含まれると、その値が同じ行の他のカラムの値などで上書きされることがあるBLOB,CLOB型のカラムの後ろに16バイト以上の可変長のカラムがある場合に発生します。エラーにはならず、値だけが変わります。<plugin-name>.ini) のendpoint,secureパラメータに、パイプ文字|の前後にスペースを入れて複数の値を指定すると、2件目以降の値が正しく反映されないバグ修正 - Client
Connection.commitがエラーになった後に同じコネクションでSQLを実行すると、エラーになったトランザクションが使われ続け、以降のSQLもInactiveTransactionExceptionとなるqueryツールでSQLがエラーになると、セッションとトランザクションが解放されずに残り続けるアップグレードについて
クライアント互換性リスト
Tsurugi 1.13.0 では 以下のクライアントに対応しています。
Tsurugi のアップグレードに併せて、必要に応じて各クライアントをアップグレードしてください。
トランザクションログのフォーマット変更
本バージョンではトランザクションログのフォーマットバージョンが Version 8 に変更されています。バージョン 1.12.0 で利用していたトランザクションログを利用してバージョン 1.13.0 を起動すると、トランザクションログのフォーマットバージョンが自動でアップデートされます。
これにより、バージョン 1.13.0 で起動したトランザクションログはバージョン 1.12.0 では利用できなくなります。また、バージョン 1.13.0 以降で作成したバックアップを バージョン 1.12.0 で復元することもできなくなりますのでご注意ください。
アップグレード手順
旧バージョンからのアップグレード手順については、以下のドキュメントを参照してください。
その他
本バージョンにおける変更内容の一覧は、以下のChangelogを参照してください。
本バージョンに対する既知の問題、および本バージョンにて修正された問題の補足情報については、以下のリンクを参照してください。
All reactions