コンテンツにスキップ
7.8 制約、エラー、トラブルシューティング

7.8 制約、エラー、トラブルシューティング

失敗したSQLを繰り返しても原因は解消せず、状態が複雑になることがあります。 まず未サポートの操作か、入力値やオブジェクトの状態の問題かを区別してください。 この節では、症状に応じて確認箇所を絞り込みます。

機能のサポート範囲

要求LOGの対応代替方法
一般的なUPDATE未サポート訂正イベントを設計するか、更新可能なテーブルを選択
任意条件のDELETE WHERE未サポートBEFORE・OLDEST・EXCEPTを使用するか、モデルを変更
PRIMARY KEY・UNIQUE制約未サポート収集段階で重複を処理するか、別のテーブルを選択
値・範囲インデックスLSMをサポート型と条件に合わせて選択
単語検索KEYWORDをサポートVARCHAR・TEXTに作成し、SEARCH・ESEARCHを使用
分析用BITMAPインデックスサポート条件内で使用型・エンコーディング・値の分布を確認
TEXT自体のORDER BY・GROUP BY未サポートコード・重要度・時刻を別カラムに格納

症状別の診断

症状最初の確認事項対処
指定した到着時刻と保存時刻が異なる直前の時刻とTIME_INVERSION_MODE補正の有無を確認し、発生時刻は別に保持
SEARCHでインデックス関連エラー対象カラムのKEYWORDインデックス型・テーブル・インデックス名を確認
単語があるのに検索されないSEARCHのトークンとLIKEの部分文字列の違い元の1行で両方の結果を比較
インデックス作成後も検索が遅い実行計画・構築状態・時間範囲反映状態を確認後、代表的な負荷を測定
カラム長の変更に失敗既存の型と新しい長さVARCHARの拡張のみ使用し、最大長を確認
MINMAXの変更に失敗可変長型かどうかLOGで対応する固定長カラムのみを対象にする
NOT NULLへの変更に失敗既存のNULL行既存データの検査とNOCHECKの意味を区別
同じイベントが複数表示される元のID・再試行・ファイル再処理再送ポリシーを確認し、任意行の削除で解決しない
DDL実行中にリソース使用中エラー入力・検索とDDLの競合実行時刻を調整して再確認

サーバー設定とインデックス一覧は次のように確認できます。

SELECT NAME, VALUE FROM V$PROPERTY
 WHERE NAME IN ('DISK_COLUMNAR_TABLE_TIME_INVERSION_MODE', 'TABLE_SCAN_DIRECTION');
SHOW INDEXES;

設定の確認と変更は別の操作です。 原因を特定する前に、本番サーバーのグローバル設定を変更しないでください。

エラーの再現と解決

CREATE LOG TABLE ch7_error (event_id INTEGER, message TEXT);
INSERT INTO ch7_error VALUES (1, 'connection timeout');
SELECT event_id, message FROM ch7_error;

1行が返されます。以下のSQLはそれぞれ意図的に失敗します。 通常の実習とまとめて実行せず、確認したい文だけを個別に実行してください。

-- KEYWORDインデックスがない状態です。
SELECT event_id FROM ch7_error WHERE message SEARCH 'timeout';

-- TEXT自体のソート・グループ化はサポートしていません。
SELECT message FROM ch7_error ORDER BY message;
SELECT message, COUNT(*) FROM ch7_error GROUP BY message;

-- LOGは一般的なUPDATE・条件付きDELETEをサポートしていません。
UPDATE ch7_error SET message = 'fixed' WHERE event_id = 1;
DELETE FROM ch7_error WHERE event_id = 1;

-- TEXTをVARCHARに変換するコマンドではありません。
ALTER TABLE ch7_error MODIFY COLUMN (message VARCHAR(4096));

インデックスを作成し、サポートされる検索方法で確認します。

CREATE INDEX ch7_error_msg ON ch7_error(message) INDEX_TYPE KEYWORD;
EXEC TABLE_FLUSH(ch7_error);
EXEC INDEX_FLUSH(ch7_error);

SELECT event_id, message FROM ch7_error
 WHERE message SEARCH 'timeout'
 ORDER BY event_id;

DROP TABLE ch7_error;

行1が返されることを確認してください。インデックスを追加しても、TEXTのソートやLOGのUPDATEは使用できません。

保持ポリシーの診断

期限切れの行が残る場合は、適用ポリシー、実行周期、LAST_DELETED_TIME、実際の_arrival_timeを合わせて確認してください。 event_timeだけを見て削除失敗と判断しないでください。 関連する実習は運用とデータライフサイクルにあります。

問題が続く場合は、サーバーバージョンとEdition、テーブルDDL、失敗したSQL、エラー全文、代表的な入力値を用意してください。 パスワードと機密ログを伏せて共有してください。 全データを送るより、同じ症状を再現する小さな例のほうが原因の特定に役立ちます。

最終更新日