AnalyticDB for PostgreSQLは、クエリ実行中に統計を収集および記録するためのクエリプロファイリング統計機能を提供します。 システムビューを使用して、スロークエリステートメントを確認できます。
AnalyticDB for PostgreSQLでは、クエリは順番に実行される複数の演算子で構成されます。 特定のケースでは、クエリ例外を識別および分析するためにクエリ統計が必要です。 クエリ統計には、オペレータが消費した時間、入力行の数、出力行の数、メモリおよびI/Oリソースの使用量が含まれます。 AnalyticDB for PostgreSQLは、オペレーターの実行情報から問題を特定し、システム障害のトラブルシューティングに役立つクエリプロファイリング統計を提供します。
この機能は、V6.3.8.2以降のAnalyticDB for PostgreSQLインスタンスに使用できます。 インスタンスのマイナーエンジンバージョンを更新する方法については、「インスタンスのマイナーバージョンの更新」をご参照ください。
クエリプロファイリング統計機能の有効化
デフォルトでは、クエリプロファイリング統計機能は無効になっています。 queryprofile.enableパラメーターを使用して、この機能を有効または無効にできます。
クエリプロファイリング統計機能のステータスを照会します。
SHOW queryprofile.enable;セッションのクエリプロファイリング統計機能を有効にします。
SET queryprofile.enable = ON;セッションのクエリプロファイリング統計機能を無効にします。
SET queryprofile.enable = OFF;データベースのクエリプロファイリング統計機能を有効にします。
ALTER DATABASE <dbname> SET queryprofile.enable = ON;
インスタンスのクエリプロファイリング統計機能を有効または無効にするには、 チケットを起票し、テクニカルサポート担当者にお問い合わせください。
クエリプロファイルの照会
クエリプロファイリング統計機能を有効にすると、実行中のクエリの基本情報と実行プロセス情報、およびクエリプロファイルビューから過去のクエリを照会できます。
プロフィールビューの照会
queryprofile.query_exec_history: 履歴クエリの基本情報を表示します。
queryprofile.query_exec_status: 実行中のクエリの基本情報を表示します。
queryprofile.node_exec_history: 履歴クエリの実行プロセス情報を表示します。
queryprofile.node_exec_status: 実行中のクエリの実行プロセス情報を表示します。
queryprofile.query_exec_historyビューとqueryprofile.query_exec_statusビューは同じスキーマを共有します。 次の表に、これらのビューに含まれるフィールドを示します。
項目 | データ型 | 説明 |
queryid | int8 | クエリのID。 クエリの一意の識別子です。 |
sessid | integer | クエリを含むセッションのID。 |
commandid | integer | セッション内のクエリのコマンドID。 |
starttime | timestamptz | クエリの開始時刻。 |
runtime | float8 | クエリの実行時間。 単位は秒です。 |
stmt_text | text | クエリのSQL文のテキスト。 |
queryprofile.node_exec_historyビューとqueryprofile.node_exec_statusビューは同じスキーマを共有します。 次の表に、これらのビューに含まれるフィールドを示します。
項目 | データ型 | 説明 |
queryid | int8 | 演算子を含むクエリのID。 クエリの一意の識別子です。 |
stmtid | int8 | 演算子を含むクエリのIDに対応するSQL文のID。 |
sessid | integer | 演算子を含むセッションのID。 |
commandid | integer | セッション内の演算子を含むクエリのコマンドID。 |
nodeid | integer | クエリ実行プラン内の演算子のID。 |
sliceid | integer | クエリ実行プラン内の演算子のスライスID。 |
nodetypid | integer | オペレータのタイプID。 |
nodename | text | 演算子の名前。 |
tuplesout | int8 | クエリ実行中に演算子によって出力された行数。 |
tuplesin | int8 | クエリ実行中に演算子によって入力された行数。 |
tuplesplan | int8 | クエリ実行プランの演算子によって入力された行数。 |
execmem | float8 | エグゼキュータによってオペレータに割り当てられたメモリの量。 |
workmem | float8 | オペレータが使用するメモリの量。 |
starttime | timestamptz | オペレータの実行開始時刻。 |
endtime | timestamptz | オペレータの実行終了時刻。 |
期間 | float8 | 演算子の実行時間。 単位は秒です。 説明 このフィールドは、オペレータの実行開始時間と終了時間の間隔ではなく、オペレータが実行されているときに消費された時間です。 先行する間隔には、基になる演算子の実行期間が含まれます。 |
diskreadsize | int8 | オペレータがディスクから読み取るデータの量。 |
diskreadtime | float8 | オペレータがディスクからデータを読み取るのにかかる時間。 単位は秒です。 |
netiosize | int8 | ノード間で送信されるデータの量。 |
netiotime | float8 | ノード間でデータを送信するのにかかる時間。 単位は秒です。 |
queryprofile.node_exec_historyおよびqueryprofile.node_exec_statusビューでは、各行にクエリ実行中の演算子の基本的な実行情報とリソース消費量が表示されます。 ビューの情報を分析して、例外を特定し、クエリ実行プロセスを最適化できます。
実行中のクエリのプロファイルを照会する
例 1
実行中のクエリの基本情報を照会します。
SELECT * FROM queryprofile.query_exec_status;例 2
実行中のクエリの実行プロセス情報を照会します。
SELECT * FROM queryprofile.node_exec_status;履歴クエリのプロファイルを照会する
例 1
履歴クエリの基本情報を照会します。
SELECT * FROM queryprofile.query_exec_history;例 2
履歴クエリの実行プロセス情報を照会します。
SELECT * FROM queryprofile.node_exec_history;実行中のクエリのプロファイルビューの更新頻度の変更
AnalyticDB for PostgreSQLは、queryprofile.query_exec_statusおよびqueryprofile.node_exec_statusの更新頻度を決定するためのqueryprofile.refresh_intervalパラメーターを提供します。 このパラメーターの値は、統計の2回の更新の間に演算子によって処理された行の数を示します。
queryprofile.refresh_intervalのデフォルト値は1000です。 デフォルトでは、統計は演算子によって読み取られるデータの1,000行ごとに更新されます。 値0は、クエリプロファイリング統計機能が無効であることを示します。
次のステートメントを実行して、クエリプロファイルビューの更新頻度を照会できます。
SHOW queryprofile.refresh_interval;サンプルクエリ結果:
queryprofile.refresh_interval
-------------------------------
1000
(1 row)クエリプロファイリング統計機能を無効にする、またはデータ更新頻度を変更するには、 チケットを起票し、テクニカルサポート担当者にお問い合わせください。
履歴クエリプロファイルのリサイクル
AnalyticDB for PostgreSQLには、queryprofile.max_query_numおよびqueryprofile.query_time_limitパラメーターがあり、過去のクエリプロファイルをリサイクルする方法を決定します。
queryprofile.max_query_num: 保持するクエリの最大数。 このパラメーターのデフォルト値は10000です。 次のステートメントを実行して、保持されるクエリの最大数を照会できます。
SHOW queryprofile.max_query_num;queryprofile.query_time_limit: クエリのリサイクルに使用される最小実行期間。 実行期間がこのパラメーターの値未満のクエリは、優先的にリサイクルされます。 単位は秒です。 このパラメーターは、実行時間の短いクエリをクリアするために使用します。 デフォルト値は 1 です。 次のステートメントを実行して、保持されているクエリの最小実行期間をクエリできます。
SHOW queryprofile.query_time_limit;
たとえば、queryprofile.max_query_numの値が10000、queryprofile.query_time_limitの値が1であるとします。 この場合、クエリの数が10,000を超え、実行時間が1秒未満のクエリが優先的にリサイクルされる場合、クエリをリサイクルできます。 実行時間が1秒未満のクエリが存在しない場合、最も早いクエリが優先的にリサイクルされます。
上記のパラメーターを変更するには、 チケットを起票し、テクニカルサポート担当者にお問い合わせください。
例
クエリプロファイルを使用して、実行例外を識別および分析できます。 クエリプロファイリング統計機能が有効になっている場合、すべてのクエリのプロファイルが収集されます。 クエリプロファイルから次の情報を取得できます。
遅いクエリまたは実行中のクエリ。
演算子の情報と、各演算子が入出力する行数。
実行に時間がかかる演算子。
メモリ、ディスクI/O、ネットワークI/Oなど、単一のオペレータによって占有されるリソースの量。
次の操作を実行します。
現在のセッションのクエリプロファイリング統計機能を有効にします。
SET queryprofile.enable = ON;最新の10件の履歴クエリの基本情報を照会します。
SELECT * FROM queryprofile.query_exec_history ORDER BY starttime DESC limit 10;次の図は、クエリ結果のサンプルを示しています。

前のクエリ結果から、分析するクエリプロファイルを見つけます。 queryprofile.query_exec_historyビューから取得したqueryidフィールドの値を使用して、queryprofile.node_exec_historyビューからクエリの実行プロセス情報を照会します。
SELECT * FROM queryprofile.node_exec_history WHERE queryid = 6902*********93;次の図は、クエリ結果のサンプルを示しています。

クエリ結果には、演算子名、実行時間、入力行数、出力行数、リソース使用量などの情報が表示されます。 各オペレータの実行情報を分析して、パフォーマンスの問題を特定し、トラブルシューティングできます。