Tsurugi 1.0.0 - Known Issues (ja) #102
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
-
1.0.0 既知の問題
解決された問題
以下は本バージョンで解決された重要な問題のうち、既存ユーザーの注意が必要なものです。
TSURUGI-IS-923 レコードが存在するテーブルを
DROP TABLE
するとトランザクションログに不整合な状態でレコードに対するログデータが残る問題:
レコードが存在するテーブルに対して
DROP TABLE
文によってテーブルを削除したのちにログコンパクションツールを実行しても、ディスク容量が解放されない場合があります。これは、トランザクションログ上で削除したテーブルのレコードデータが残り続けるためです。
また、上記の状態となったトランザクションログを用いてTsurugiサーバを起動すると、残り続けたログからデータベースイメージが復元されるため、起動にかかる時間が増大する上に不必要なメモリ消費の増加を招きます。
なおテーブル管理情報は削除されているため、削除したテーブルにアクセスすることはできません。
DROP TABLE
の対象となるテーブルに対しては、事前にDELETE
文などを実行して空にした状態でDROP TABLE
を実行すると上記の問題を回避できます。ステータス:
バージョン
1.0.0
で修正済み。ただし、1.0.0
より以前のバージョンで不整合な状態になったトランザクションログを本バージョンに移行した場合、ログコンパクションツールを実行しても不整合は解消されません。不整合となっている可能性のある旧バージョンのトランザクションログは通常のアップグレード手順では移行せずに、バージョン
1.0.0
で新規にTsurugiをサーバを起動した上でデータ移行を行ってください。既知の問題
以下は本バージョンで未解決な問題です。
特別な記載が無い限り、これらの問題は将来のバージョンで修正、もしくは制限を緩和する対応を計画しています。
TSURUGI-IS-177 DML処理中にDDLを実行するとデータベースが不安定な状態になる
問題:
SELECT
文やINSERT
文等の DML の実行中にCREATE TABLE
文やDROP TABLE
文等の DDL が実行されると、データベースが不安定な状態になることがあります。このような状態を避けるため、DML 実行前に DDL をあらかじめ実行しておくなどして、DDL と DML でその実行時間が互いにオーバーラップしないように注意してください。
TSURUGI-IS-252 空でないテーブルに対してインデックスを作成できない
問題:
CREATE INDEX
文によってインデックスを作成する際、対象のテーブルにデータが存在する場合、エラーとなります。Note
ワークアラウンド:
テーブルを一度空にしてからインデックスを作成してください。
テーブルデータを退避するにはダンプを利用し、インデックス作成後にロードを行うことでデータを復元できます。
TSURUGI-IS-289 トランザクションログの増加に伴いデータベースの起動が遅くなる
問題:
トランザクションログに多くのデータが含まれる状態でデータベースを起動すると、起動時間が長くなります。
以下に、1レコードのサイズが約200バイトのテーブルデータに対するレコード数、トランザクションログサイズ、データベース起動時間の測定例は以下の通りです。
またトランザクションログはデータベースへの書き込みのたびに増大していき、データベース上で行を削除してもログサイズが即座に減少することはありません。
Note
ワークアラウンド:
ログコンパクションツールを利用してトランザクションログを圧縮することで、データベースの起動時間を短縮できる場合があります。
同ツールは同一の行に対する複数回の操作をまとめたり、削除された行に関する情報をログから除去することでログサイズを削減します。
バージョン
1.0.0
では2種類のログコンパクションツールを提供しています。以下のコマンドはTsurugiインストールディレクトリ配下の
bin
ディレクトリに配置されています。tglogutil compaction
: オフラインログコンパクションツールtglogutil compaction
はデータベース停止状態のトランザクションログファイルを圧縮することができます。コマンドの詳細は以下のドキュメントを参照してください。
tglogutil-compaction
- reorganize a Tsurugi transaction log directorytgcmpct_logs.sh
: (試験的機能) オンラインログコンパクションツールtgcmpct_logs.sh
はデータベース起動状態のトランザクションログファイルを圧縮することができます。このコマンドは実行時に圧縮した結果生成される削除可能となったログファイルを削除しません。
削除可能なログファイルを削除するには、別途
tgdel_logs.sh
を実行してください。tgdel_logs.sh
はtgcmpct_logs.sh
の実行によって削除可能となったログファイルを削除します。基本的には
tgcmpct_logs.sh
とtgdel_logs.sh
を組み合わせて使用してください。本機能は現時点では試験的なサポートとなります。正式対応時は提供コマンドや機能が変更される予定です。
また本機能を利用する際には、データベースのバックアップを取得した上で利用することを推奨します。
TSURUGI-IS-448 DDLを実行したトランザクションを中断するとテーブルが不正な状態になる
問題:
CREATE TABLE
やDROP TABLE
等のDDL文をトランザクション内で実行した後、そのトランザクションがアボートされるか、またはロールバックを実行するとTsurugi内部のテーブル管理情報が不整合な状態になります。不整合な状態になったテーブルに対する操作は不正な結果を返す可能性があります。
例えば、以下の手順でSQLを実行するとテーブルが不整合な状態になります。
上記のような状態になった場合、速やかに
DROP TABLE
を実行してテーブルを削除してください。TSURUGI-IS-702 テーブルを削除した際にテーブルに対するアクティブな PreparedStatement が不正な状態になる
問題:
PreparedStatement を保持したまま対象テーブルを
DROP TABLE
を実行、続けて同名テーブルをCREATE TABLE
した後その PreparedStatement を使うと、サーバからのレスポンスが返らない、またはサーバが異常終了することがあります。Note
ワークアラウンド:
対象の PreparedStatement を使う前に再度作成し直すことで問題を回避できます。
TSURUGI-IS-706 広範囲のSELECT, UPDATE, DELETE を行うと他の処理が待たされる場合がある
問題:
同じテーブルに対して、あるトランザクションにて広範囲のデータに対する
SELECT
,UPDATE
,DELETE
を実行中に別のトランザクションからINSERT
文を実行すると、前者の処理が完了するまでINSERT
処理がブロックされることがあります。Note
ワークアラウンド:
開発中の機能として、構成定義ファイル
tsurugi.ini
に対してsql.scan_block_size
を指定することにより、スキャン処理のブロックを緩和できる可能性があります。これは、一度のスキャン処理で処理するレコード数を指定するものです。
一度のスキャン操作で指定した値を超えた場合、スキャン処理を一時中断して他のタスクに処理を譲ることができます。
上記機能は開発中のため、現時点では正常に動作しない場合があります。また将来的にパラメータの仕様が変更される可能性があります。
TSURUGI-IS-731 列定義と異なる型のキーを使って検索を行うと一部の結果が正しくないことがある
問題:
列定義と異なる型のキーを使って検索を行うと型の最大値・最小値付近の値において誤った結果が得られる場合があります。
以下はその例です:
上記の例では、条件
c0=2147483648
にマッチしないはずの-2147483648
が結果に含まれています。期待するクエリ結果は0行です。
Note
ワークアラウンド:
異なる型での比較にならないように、あらかじめCAST式で型を列定義と合わせることで問題を回避できます。
例えば前述の例では
WHERE
句の条件の右項を、左項と同じ型にキャストしています。ただしCAST式の仕様として
CAST(2147483648 AS INT)
= 2147483647 (INTの最大値) となることに注意してください。TSURUGI-IS-732 DECIMALとDECIMAL以外の型の間で二項演算を行うとエラーが発生することがある
問題:
DECIMAL
型とDECIMAL
以外の型の間で二項演算を行った際、結果が仕様と異なることがあります。仕様では
DECIMAL
とDOUBLE PRECISION
(float8
) の比較演算は、暗黙の型変換によりDECIMAL
の値がDOUBLE PRECISION
へと変換したうえで比較しますが、現在の実装ではエラーになります。TSURUGI-IS-891 同一トランザクション内で同じ行にINSERTとDELETEを行うと不正な状態になる
問題:
同一トランザクション内で
INSERT
またはINSERT OR REPLACE
文で登録したレコードをDELETE
文で削除した場合、そのレコードはトランザクション完了時に削除されていなければなりませんが、実行タイミングによってはそのレコードが削除されずに残ることがあります。Note
ワークアラウンド:
DELETE
を2回実行することで確実に該当レコードを削除できます。TSURUGI-IS-897 数値演算結果がラップアラウンドする
問題:
数値型同士の演算結果がオーバーフローする場合はエラーとなるべきですが、現時点の実装では数値型に応じたラップアラウンドした値が返ってしまいます。
TSURUGI-IS-933 SQL内で特定の構文要素を大量に繰り返すと、データベースが不安定になる
問題:
SQL内で特定の構文要素を大量に繰り返すと、データベースがクラッシュを含む不安定な挙動を示すことがあります。
現在判明している例は以下の2点です:
IN
句の値リストに大量の要素を指定する (例:x IN (1, 2, 3, ...)
)OR
繋ぎで大量の項を指定する (例:x = 1 OR x = 2 OR x = 3 OR ...
)上記はいずれも、単純なケースではコンパイラが自動的に検出し、不安定になる前にコンパイルエラーとなるようにしています。
しかし、複雑なケースではコンパイラが検出できないことがあります。
TSURUGI-IS-942 ORDER BY や LIMIT をクエリ式全体に適用できない
問題:
SQLにおいて
ORDER BY
やLIMIT
句によってクエリ結果の要素順や要素数の指定を行えますが、UNION ALL
等を含むクエリ式全体に対して適用することができません。以下はその例です。上記は、テーブル
t1
とt2
のすべての行の和を取得し、そのうちの最大 1 行だけを返すことが期待されますが、現在の実装ではt2
の内容を 1 行だけ取り出し、それとt1
の内容を和を取った結果を返します。つまり、合計行数は (t1
の行数) + 1 行となります。Note
ワークアラウンド:
テーブルサブクエリでデータを取り出し、その外側のクエリに
ORDER BY
やLIMIT
を適用することで目的の結果を得ることができます。以下はその例です。TSURUGI-IS-945 大量データに対して
COUNT(DISTINCT ...)
を実行すると、データベースが不安定になる問題:
SELECT COUNT(DISTINCT ...)
を実行した結果、大量のレコードが返されるような場合にデータベースが不安定になり、正しくレスポンスが返されないことがあります。TSURUGI-IS-957
CHAR
型に対するMIN
,MAX
関数の結果が不正となることがある問題:
CHAR
型に対する集約関数MIN
,MAX
を実行した場合、アルファベット順でソートした結果に対する最小、最大値が取得される仕様ですが、CHAR
型のサイズによっては集約関数の結果が不正となることがあります。TSURUGI-IS-959 クエリーに
COUNT(DISTINCT)
と他の集約関数が含まれるとエラーとなることがある問題:
COUNT(DISTINCT ...)
のようにDISTINCTな値に対して実行する集約関数と、MAX
のように重複ありで計算する集約関数を同一のSELECT文
で記述すると、エラーとなることがあります。TSURUGI-IS-960 UNION ALL や一部の LIMIT が非効率的な処理を行う
問題:
UNION ALL
によって複数のクエリ結果を連結する際、内部的に非効率的な処理を行うことがあります。具体的には、SQL実行エンジンは
UNION ALL
のオペランドを一度メモリ上に展開し、それらを連結するという動作を行います。このため、クエリの実行に必要なメモリ量が増大し、また全体の応答速度も遅くなることがあります。
同様に、一部の
LIMIT
(ORDER BY
を伴わないもの) でも類似の問題が発生します。こちらは、
LIMIT 1
によって任意の1件だけを取得したい場合でも、テーブル全体を読み出す場合があります。ただし、
UNION ALL
の場合とは異なり、それらをすべてメモリ上に展開することはなく、指定された件数を超えるものは破棄されます。TSURUGI-IS-139
OR
を含む条件式が非効率的な実行計画を生成する問題:
条件式に
OR
を含む場合、非効率的な実行計画が生成されることがあります。例えば、
key
という主キーを持つテーブルt
に対して以下のSQLを実行した場合、テーブルt
のフルスキャンを行う実行計画を生成します。また、現状では
IN
句は内部的にOR
に展開されるため、同様の問題が発生します。Note
ワークアラウンド:
条件の項ごとに
UNION (DISTINCT)
やUNION ALL
で繋いでやると同様の結果が得られます。TSURUGI-IS-681
MIN
,MAX
が非効率的な実行計画を生成する問題:
インデックスキー項目に対して集約関数
MAX
,MIN
を指定した場合でも、フルスキャンを伴う実行計画が生成されます。本来であれば、これらのケースはインデックスの先頭や末尾から1件だけ取り出すことで高速に動作するべきですが、現状ではそのような最適化が行われていません。
これは、
ORDER BY ... LIMIT ...
(いわゆるTOP-N
クエリ) に対しても同様です。TSURUGI-IS-863 JOIN 句の結合優先順位を指定できない
問題:
3つ以上のテーブルでJOIN操作を行う場合、SQL標準では
t1 JOIN (t2 JOIN t3 ON ...) ON ...
のような記法で結合順序を規定できますが、現状ではこの記法をサポートしていません。Note
ワークアラウンド:
代わりにサブクエリを用いて、結合順序を明示的に指定することができます。
Beta Was this translation helpful? Give feedback.
All reactions