SQL 診断は、スロークエリログを分析して、Hologres インスタンスに関する傾向と詳細を可視化します。デフォルトでは、100 ms を超えるすべてのデータ操作言語 (DML) クエリと、すべてのデータ定義言語 (DDL) クエリをキャプチャします。SQL 診断を使用すると、インスタンスの使用状況を理解し、失敗したクエリを特定し、パフォーマンスを最適化できます。
診断ツールの概要
Hologres は、クエリ分析のために相互に補完し合う 3 つのツールを提供します。ユースケースに応じて選択してください。
| ツール | データレイテンシー | 保持期間 | 最適な用途 |
|---|---|---|---|
| [SQL 診断ページ] ([HoloWeb]) | T+1 (前日) | 過去 1 か月 | 傾向分析、DML/DDL 比率、ユーザーおよびアプリケーション別の内訳 |
| Query Insight (SQL エディター) | リアルタイム (エディター内) | N/A | 個々のクエリ失敗の即時診断 |
| hg_query_log テーブル | 設定可能 | 過去 1 か月 | 直接 SQL アクセスが可能な生の SQL クエリログ |
デフォルトでは、hologres.hg_query_log は 1 秒を超える DML および DDL クエリのみを記録します。SQL 診断は、100 ms を超えるすべての DML および DDL クエリをキャプチャします。hologres.hg_query_log に SQL 診断よりも少ないレコードが表示される場合は、log_min_duration_statement を 100ms に設定して、両者を一致させてください。詳細については、「スロークエリログの表示と分析」をご参照ください。
仕組み
SQL 診断はクエリログデータを収集し、以下の 2 つの方法で表示します。
-
[SQL 診断ページ] ([HoloWeb]):集計された傾向とチャートです。T+1 ベースで更新されます。前日 (T-1) から過去 1 か月分のデータを表示します。
-
[SQL エディター] ([HoloWeb]):失敗したクエリのインライン診断です。Query Insight を利用し、自動的に失敗を説明し、修正を提案します。
SQL 診断では、システムが生成した SQL は除外されます。次のフィルターが適用されます。
WHERE
usename != 'system'
AND client_addr != '127.0.0.1'
AND (application_name IS NULL
OR application_name NOT IN ('AutoPartition', 'holoweb_system', 'HgGenInQuery'))
診断項目
SQL 診断ページには、選択した期間について以下の項目が表示されます。
| 診断項目 | 説明 |
|---|---|
| [クエリ総数] | 選択した期間内のクエリの総数です。 |
| [成功したクエリ] | 成功したクエリの総数です。 |
| [失敗したクエリ] | 失敗したクエリの総数です。 |
| [失敗したクエリの詳細] | エラーコードと対応する失敗数です。代表的なクエリとエラー詳細を含みます。「Query Insight の取得」に移動して詳細を表示するか、以下のエラーコード参照テーブルを使用して根本原因を特定できます。 |
| [成功および失敗したクエリの傾向] | 成功したクエリと失敗したクエリの比率です。時間経過に伴う全体的なクエリ実行の健全性を示します。 |
| [クエリ時間消費率の傾向] | DML 操作ごとの時間消費率です。デフォルトで SELECT、INSERT、UPDATE、DELETE をカバーします。 |
| [DML の傾向] | DML クエリの実行傾向です。SELECT、INSERT、UPDATE、DELETE が含まれます。 |
| [DDL の傾向] | DDL クエリの実行傾向です。CREATE TABLE、DROP TABLE、TRUNCATE TABLE、ALTER TABLE、CALL、CREATE EXTENSION、CREATE FOREIGN TABLE、ALTER FOREIGN TABLE、IMPORT FOREIGN SCHEMA、DROP FOREIGN TABLE、CREATE SCHEMA、CREATE VIEW、DROP VIEW、GRANT、CREATE ROLE、ALTER ROLE、COMMENT が含まれます。 |
| [クエリアプリケーションソースの比率または傾向] | application_name でグループ化されたクエリの比率または傾向です。異なるタスクタイプに個別の application_name 値を設定することで、このチャートを異常なタスクの監視に活用できます。 |
| [ユーザー別のクエリ比率または傾向] | usename でグループ化されたクエリの比率または傾向です。異なるタスクに個別のデータベースユーザーを使用することで、ユーザーごとのトラブルシューティングが簡単になります。 |
| [実行エンジン別のクエリ傾向] | Hologres 実行エンジン (HQE、PQE、SDK、FixedQE) 全体の実行傾向です。エンジンの詳細については、「サービスアーキテクチャ」をご参照ください。PQE クエリを HQE クエリとして書き直してパフォーマンスを向上させることで、PQE クエリを最小限に抑えることができます。 |
SQL 診断データの表示
前提条件
開始する前に、以下の点を確認してください。
-
HoloWeb コンソールへのアクセス
-
スロークエリログで要求される権限と同じ権限が必要です。表示権限を付与するには、「表示権限の付与」をご参照ください。
操作手順
-
HoloWeb コンソールにログインします。
-
上部メニューで、[Diagnostics and Optimization] をクリックします。
-
左側メニューで、インスタンス診断 > [SQL Diagnosis] を選択します。
-
[SQL Diagnosis] ページの上部で、次のパラメーターを設定します。
パラメーター 必須 説明 インスタンス名 はい 診断するインスタンスです。デフォルトは現在のインスタンスです。 期間 はい クエリデータの期間です。デフォルトは [Previous Day] です。最大で過去 1 か月のデータを表示できます。 -
コミット をクリックして結果を表示します。
インテリジェントな SQL エラー診断
HoloWeb SQL エディターでクエリが失敗すると、Query Insight が自動的に失敗を分析し、根本原因と推奨される修正をエディターに直接表示します。これにより、手動でエラーコードを相互参照する必要がなくなります。
注意事項
-
SQL 診断データは過去 1 か月分のみ利用可能です。
-
データは T+1 ベースで更新されます。デフォルトでは、前日のデータが表示されます。必要に応じて期間でフィルターしてください。
-
必要な権限はスロークエリログと同じです。「表示権限の付与」をご参照ください。
特定のクエリレコードが表示されない理由
クエリが SQL 診断に表示されない場合は、以下の一般的な原因を確認してください。
-
システムクエリの除外:
usename = 'system'、client_addr = '127.0.0.1'、または内部アプリケーション (AutoPartition、holoweb_system、HgGenInQuery) からのクエリは、仕様により除外されます。 -
クエリが新しすぎる:データは T+1 ベースで更新されます。今日のクエリは明日まで表示されません。
-
クエリが古すぎる:保持されるデータは過去 1 か月分のみです。
-
権限の不足:スロークエリログと同じ権限が必要です。「表示権限の付与」をご参照ください。
-
クエリ実行時間がしきい値未満:SQL 診断は、100 ms を超える DML クエリとすべての DDL クエリのみをキャプチャします。より速い DML クエリは記録されません。
エラーコードリファレンス
以下の表は、一般的なエラーコード、その説明、および解決策を一覧表示しています。この表を SQL 診断ページの 失敗したクエリの詳細 とあわせてご使用ください。
| エラーコード | 説明 | 一般的なエラーメッセージ | 解決策 |
|---|---|---|---|
| HG_ERRCODE_FDW_ERROR | MaxCompute の外部テーブルからメタデータをインポートする際のエラーです。通常、サポートされていないテーブルタイプが原因です。 | failed to import foreign schema from odps: Can't find file system factory |
「HG_ERRCODE_FDW_ERROR」をご参照ください。 |
| ERRCODE_FDW_ERROR | 外部テーブルのクエリ中にエラーが発生しました。 | failed to import foreign schema from odps: Authorization Failed: xxx / failed to import foreign schema from odps:Table not found -xxx |
特定のエラーメッセージに基づいて解決します。「ERRCODE_FDW_ERROR」をご参照ください。 |
| ERRCODE_UNIQUE_VIOLATION / pk violates | 重複した主キーが書き込まれ、一意性制約に違反しました。 | duplicate key value violates unique constraint DETAIL: xxx already exists. |
ソースデータから重複した主キーを削除してください。INSERT が失敗する場合は、INSERT ... ON CONFLICT として書き直してください。INSERT ... ON CONFLICT がまだ失敗する場合、ソースデータ自体に重複が含まれています。解決策については、「INSERT ON CONFLICT (UPSERT)」をご参照ください。 |
| ERRCODE_CHECK_VIOLATION / partition constraint | データがパーティション値と一致しないパーティションに書き込まれました (たとえば、パーティション 20240229 のデータがパーティション 20240301 に書き込まれた場合)。 |
new row for relation xx violates partition constraint DETAIL: Failing row contains (column1)=(xxxx). |
パーティションデータが定義されたパーティション値と一致することを確認し、不一致を修正してください。 |
| ERRCODE_NOT_NULL_VIOLATION / not-null constraint / UsageProblem | NOT NULL 制約のあるフィールドに NULL 値が書き込まれました。 | null value in column xxx violates not-null constraint DETAIL: Failing row contains (null). |
ダーティデータをクレンジングしてください。 |
| ERRCODE_UNDEFINED_TABLE | テーブルが存在しません。通常、テーブル作成後にメタデータが更新されていないか、クエリの実行中にテーブルが切り捨てられたり削除されたりしたことが原因です。 | Dispatch query failed: Table not found |
Query Insight を使用して、同時実行されている TRUNCATE または DROP タスクを確認してから、再試行してください。 |
| ERRCODE_INTERNAL_ERROR / ERPC_ERROR_CONNECTION_CLOSED | 予期しない内部エラーが発生しました。インスタンスがダウンしていたか、クエリが予期せず中断された可能性があります。 | Transaction xx is not found or it was expired and cancelled. / Query is cancelled / ERPC_ERROR_CONNECTION_CLOSED |
なし。 |
| ERRCODE_QUERY_CANCELED / User canceled / CANCELLED / Query Is Cancelled / InternalQueryIsClosed | クエリはキャンセルされました。通常、クライアントのタイムアウト、またはテーブルが切り捨てられたか削除されたことが原因です。 | ERROR: canceling statement due to statement timeout / canceling statement due to user request |
「クエリの管理」をご参照ください。 |
| ERRCODE_FEATURE_NOT_SUPPORTED / Unsupported Feature | 要求された機能はサポートされていません。 | Dynamic partition selector is not supported / ALTER TABLE CHANGE OWNER is not supported in SPM (Simple Permission Mode) / Feature not supported: insert into parent table |
「Hologres SQL ステートメントに関する FAQ」をご参照ください。 |
| ERRCODE_UNDEFINED_OBJECT | 参照されている列またはテーブルグループが存在しません。 | column xxx does not exist / Table group xxx does not exist. |
不足しているオブジェクトを作成するか、SQL ステートメントで正しいオブジェクト名が使用されていることを確認してください。 |
| ERRCODE_INSUFFICIENT_PRIVILEGE / permission denied | 現在のアカウントには十分な権限がありません。 | ERROR: permission denied for schema xxx / ERROR: permission denied for foreign table table_info |
「開発権限に関する FAQ」をご参照ください。 |
| ERRCODE_OUT_OF_MEMORY / OOM | クエリがメモリ不足 (OOM) エラーをトリガーしました。 | Total memory used by all existing queries exceeded memory limitation |
「OOM エラーのトラブルシューティングガイド」をご参照ください。 |
| ERRCODE_DATATYPE_MISMATCH / Unmatched Data Row Schema Number / Dataset Schema Not Match | フィールドの実際のデータ型が、式で要求される型と一致しません。 | unmatched data row schema number / Datasets has different schema |
SQL ステートメントの列の型がテーブル定義と一致することを確認してください。 |
| ERRCODE_DIVISION_BY_ZERO / division by zero | SQL ステートメントにゼロ除算が含まれています。 | division by zero |
ダーティデータをクレンジングするか、GUC パラメーターを使用してゼロ除算によるエラーを抑制してください。「関数の使用方法」をご参照ください。 |
| ERRCODE_STRING_DATA_RIGHT_TRUNCATION | VARCHAR フィールドの値が、テーブル作成時に定義された長さを超えています。 | value too long for type character varying(xx) |
より長い VARCHAR 長でテーブルを再作成するか、フィールドタイプを TEXT に変更してください。 |
| ERRCODE_PROGRAM_LIMIT_EXCEEDED / Exceed Odps Scan Limit | 外部テーブルのクエリが、パーティション、行、またはバイトのスキャン制限を超えました。 | number of read rows (xxxxx) exceeds limit (xxxxxxx) / number of partitions (xxx) scanned for "xxxx" exceeds the maximum allowed (xxx) / scan (xxx GB) for "xxxxx" exceeds the maximum allowed (xxx GB) |
「MaxCompute への接続に関する FAQ と診断」をご参照ください。 |
| ERRCODE_SYNTAX_ERROR | SQL ステートメントに構文エラーが含まれています。 | syntax error at or near "xxxxx" |
SQL 構文を確認してください。 |
| ERRCODE_UNDEFINED_FUNCTION | サポートされていない、または不正に呼び出された関数が使用されました。拡張機能が作成されていないか、構文が正しくない可能性があります。 | function xxxxx does not exist / 演算子が存在しません: xxxxxx |
関数の構文要件に従い、必要な拡張機能が作成されていることを確認してください。「Hologres の関数」をご参照ください。 |
| ERRCODE_E_R_E_READING_SQL_DATA_NOT_PERMITTED | アカウントに外部テーブルの読み取り権限がありません。 | check permission for foreign table scan failed: failed to check permission:MaxCompute error,Authorization Failed [4019], You have NO privilege 'odps:Select' on {xxxxxxxxxx} |
「MaxCompute の権限に関する問題」をご参照ください。 |
| ERRCODE_DUPLICATE_OBJECT / already exist | 重複する拡張機能、パブリケーション、またはロールがすでに存在します。 | publication "xxxxx" already exists / extension "xxxxx" already exists / role "xxxxxxxx" already exists |
オブジェクトがすでに存在する場合、それ以上のアクションは必要ありません。 |
| ERRCODE_INVALID_TEXT_REPRESENTATION / invalid input | 文字列から型への変換に失敗しました。文字列値が無効であるためです (たとえば、空の文字列を INT に変換するなど)。 | invalid input syntax for integer: xxx |
ダーティデータをクレンジングしてください。 |
| ERRCODE_BAD_COPY_FILE_FORMAT | COPY コマンドのデータ形式が正しくありません。通常、データに指定された区切り文字 (スペースなど) が含まれているため、列数の不一致が発生します。 | extra data after last expected column. failed to query next / missing data for column "xxx". failed to query next |
ダーティデータをクレンジングしてください。 |
| ERRCODE_UNDEFINED_COLUMN | クエリが、存在しない列を参照しています。 | column xxxxx does not exist |
SQL 構文を確認してください。 |
| ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE | 数値が定義された範囲を超えています。これには、10 進数型の整数部分をオーバーフローする値 (たとえば、decimal(4,2) は 100 を保持できません) や、INT または bigint の範囲外の値が含まれます。 |
value "xxxxx" is out of range for type bigint / numeric field overflow / bigint out of range / integer out of range |
ダーティデータや不正な型定義がないか確認し、必要に応じて列の型を更新してください。 |
| ERRCODE_DATETIME_FIELD_OVERFLOW | 時間関連のフィールド (timestamp、timestamptz、date、time、または timetz) に、許容範囲外の値が含まれています。 | date/time field value out of range: "xxxxxx" / date out of range: "xxxxxx" |
ダーティデータをクレンジングしてください。 |
| ERRCODE_INVALID_PARAMETER_VALUE | パラメーター値が要件を満たしていません。特定のエラーメッセージに基づいて解決してください。 | mismatched properties: table orientation is "column" but storage format is "sst" / resharding insert select table data failed : Dispatch query failed: internal error: Failed to get available shards for query / InsertOverwrite insert select table data failed : column a.unsign_type does not exist |
SQL 構文を確認してください。 |
| ERRCODE_INVALID_DATETIME_FORMAT | 日付データが形式要件を満たしていません。 | invalid input syntax for type timestamp: "" / invalid input syntax for type date: "" / invalid value "" for "yyyy", Value must be an integer. |
ダーティデータをクレンジングしてください。 |
| ERRCODE_CHARACTER_NOT_IN_REPERTOIRE | データに UTF-8 エンコーディングに含まれていない文字が含まれています。 | invalid byte sequence for encoding "UTF8": 0xe9 0x80 |
ダーティデータをクレンジングしてください。 |
| ERRCODE_DUPLICATE_TABLE | 同じ名前のテーブルがすでに存在します。 | relation "xxxx" already exists |
テーブルがすでに存在する場合、それ以上のアクションは必要ありません。 |
| ERRCODE_UNTRANSLATABLE_CHARACTER | 文字をターゲットエンコーディングに変換できません。 | character with byte sequence 0xe4 0x9e 0xab in encoding "UTF8" has no equivalent in encoding "GBK" |
ダーティデータをクレンジングしてください。 |
| ERRCODE_GROUPING_ERROR | GROUP BY 句のエラーが発生しました。SELECT リストに列が表示されていますが、GROUP BY または集約関数に含まれていません。 | column "xxx" must appear in the GROUP BY clause or be used in an aggregate function |
集約されていないすべての列を GROUP BY 句に含めてください。 |
| ERRCODE_INVALID_TRANSACTION_STATE / Usage Problem | 現在のトランザクション状態では操作が無効です。たとえば、CREATE TABLE と同じトランザクションの外部で CALL SET_TABLE_PROPERTY が実行されました。 |
SET_TABLE_PROPERTY and CREATE TABLE statement are not in the same transaction |
CREATE TABLE と CALL SET_TABLE_PROPERTY の両方を、BEGIN; と COMMIT; を使用して同じトランザクションでラップしてください。 |
| ERRCODE_AMBIGUOUS_COLUMN | 列名が複数のテーブルを参照している可能性があり、あいまいな参照が作成されています。 | column reference "xxx" is ambiguous |
列名をテーブル名で修飾してください (例:t1.id の代わりに id)。 |
| ERRCODE_DUPLICATE_COLUMN | テーブル作成中に同じ列名が複数回宣言されました。 | column "xxx" specified more than once |
SQL 構文を確認してください。 |
| ERRCODE_AMBIGUOUS_FUNCTION | 入力データ型が明示的に指定されていないため、関数呼び出しがあいまいです。たとえば、to_char('2024-02-22', 'YYYY-MM-DD') の呼び出しは、'2024-02-22' が必要な型 (timestamp、double precision、または int) のいずれでもないため失敗します。型を明示的にキャストします:to_char('2024-02-22'::timestamptz, 'YYYY-MM-DD')。 |
関数呼び出しがあいまいなエラーです。 | あいまいさを解決するために入力型を明示的にキャストしてください。 |
| ERRCODE_INVALID_COLUMN_DEFINITION | 無効な列定義が使用されました。Hologres では、これは多くの場合、精度を指定せずに Numeric または Decimal 型が定義されたときに発生します。 | invalid definition of a numeric type |
Numeric または Decimal 型に精度を指定してください。 |
| ERRCODE_INVALID_CATALOG_NAME / ERRCODE_UNDEFINED_DATABASE | 指定されたデータベースが存在しません。 | なし | データベースが存在するかどうかを確認してください。 |
| ERRCODE_CANNOT_COERCE | 2つの互換性のない型の間でデータを変換できません。 | cannot cast type date to integer |
SQL 構文を確認してください。 |
| ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST | 他のオブジェクトが依存しているため、オブジェクトを削除できません (たとえば、まだテーブルを含むスキーマなど)。 | なし | 最初に依存オブジェクトを削除または再割り当てしてください。「アカウントの削除」をご参照ください。 |
| ERRCODE_UNDEFINED_SCHEMA / ERRCODE_INVALID_SCHEMA_NAME | 指定されたスキーマが存在しません。 | schema "xxxx" does not exist |
スキーマが存在するかどうかを確認してください。存在しない場合は作成してください。 |
| ERRCODE_DUPLICATE_DATABASE | 同じ名前のデータベースがすでに存在します。 | なし | データベースがすでに存在する場合、それ以上のアクションは必要ありません。 |
| AutoAnalyze-Failed | 自動分析タスクが失敗しました。通常はバックエンドの問題が原因です。 | query row count from analyze table / query from analyze table |
チケットを起票して調査を依頼してください。 |
| Import Foreign Table Not Found | アクセスしようとしている外部テーブルが存在しません。 | failed to get foregin table split:Table not found / Failed to get odps table:Not enable acid table / failed to get foregin table split:% not found |
外部テーブルが存在するかどうかを確認してください。 |
| Cannot Acquire Lock In Time | 同じテーブルに対する同時クエリとドロップ操作によって引き起こされるロック取得の失敗で、バックエンドノードでデッドロックが発生します。 | internal error: Cannot acquire lock in time, current owners |
「ロックとロックのトラブルシューティング」をご参照ください。 |
| OTHER / QueryNextFTEFailed / QueryNextPQEFailed / ForeignSplitOrSchemaConnectionClosed / ConnectionRefused / ERPC_ERROR_TIMEOUT / ERPC_ERROR_CONNECTION_CLOSED | 予期しないエラーが発生しました。 | kConnectError: channel is empty / ERPC_ERROR_CONNECTION_CLOSED / internal error: Connect timeout, err: std_exception: Connection refused |
チケットを起票して調査を依頼してください。 |
次のステップ
-
Query Insight の取得 — 個々のクエリにドリルダウンし、SQL エディターでインテリジェントな診断を取得できます。
-
スロークエリログの表示と分析 — SQL 診断のしきい値よりも高速なクエリを含む、生のスロークエリデータにアクセスできます。
-
クエリの管理 — 実行中のクエリをキャンセルまたは管理できます。