はじめに
パフォーマンス問題に直面した時、以下のような情報を確認したい場合があります。
・そのSQLが実行中なのかどうか
・SQLがキューに入った時刻はいつか
・実行したSQLがどれくらいのメモリを使用したか
・処理の実行時間はどれくらいだったか
このような場合に、システムテーブルのRESOURCE_ACQUISITIONSが役立ちます。
以下に紹介します。
RESOURCE_ACQUISITIONSシステムテーブル
カラム名 | データ型 | 説明 |
|---|---|---|
NODE_NAME | VARCHAR | 情報がリストされているノード名。 |
TRANSACTION_ID | INTEGER | リクエストのトランザクション識別子 |
STATEMENT_ID | INTEGER | トランザクション内の各SQL文の一意のID(数値)。 |
REQUEST_TYPE | VARCHAR | リソースプールに発行したリクエストの種類。 |
POOL_ID/POOL_NAME | INTEGER/VARCHAR | リクエストをハンドリングする際に関連した各リソースプール |
THREAD_COUNT | INTEGER | このリクエストで使われたスレッド数 |
OPEN_FILE_HANDLE_COUNT | INTEGER | このリクエストで使われたオープンファイル数 |
MEMORY_INUSE_KB | INTEGER | このクエリによって獲得されたメモリの総量(キロバイト)。 |
QUEUE_ENTRY_TIMESTAMP | TIMESTAMPTZ | このリソースプールでリクエストがキューに入れられたときのタイムスタンプ。 |
ACQUISITION_TIMESTAMP | TIMESTAMPTZ | このリソースプールでリクエストが受け入れられたときのタイムスタンプ。 |
RELEASE_TIMESTAMP | TIMESTAMPTZ | Verticaがこのリソースの取得をリリースした時刻。 |
DURATION_MS | INTEGER | リクエストの実行時間(ミリ秒)。 |
IS_EXECUTING | BOOLEAN | リクエストが実行中の場合はTRUE、FALSEの場合は以下の場合に表示されます。 |
使用例1(vsql)
以下の例は、3ノードで構成されたVerticaクラスタで、トランザクションID(45035996273733290)のSQLの情報をRESOURCE_ACQUISITIONSシステムテーブルで確認する例です。
3ノードで分散された処理が、各ノードでどのようにSQL処理が行われたかが表示されています。
dbadmin=> SELECT * FROM resource_acquisitions where transaction_id='45035996273733290' ORDER BY 1;
-[ RECORD 1 ]----------+------------------------------
node_name | v_ssbm_node0001
transaction_id | 45035996273733290
statement_id | 1
request_type | Reserve
pool_id | 45035996273704996
pool_name | general
thread_count | 10
open_file_handle_count | 21
memory_inuse_kb | 30619
queue_entry_timestamp | 2019-05-20 19:07:38.306681+09
acquisition_timestamp | 2019-05-20 19:07:38.306693+09
release_timestamp | 2019-05-20 19:07:38.327938+09
duration_ms | 21
is_executing | f
-[ RECORD 2 ]----------+------------------------------
node_name | v_ssbm_node0002
transaction_id | 45035996273733290
statement_id | 1
request_type | Reserve
pool_id | 45035996273704996
pool_name | general
thread_count | 7
open_file_handle_count | 18
memory_inuse_kb | 25523
queue_entry_timestamp | 2019-05-20 19:07:38.30852+09
acquisition_timestamp | 2019-05-20 19:07:38.308539+09
release_timestamp | 2019-05-20 19:07:38.330082+09
duration_ms | 22
is_executing | f
-[ RECORD 3 ]----------+------------------------------
node_name | v_ssbm_node0003
transaction_id | 45035996273733290
statement_id | 1
request_type | Reserve
pool_id | 45035996273704996
pool_name | general
thread_count | 7
open_file_handle_count | 18
memory_inuse_kb | 25523
queue_entry_timestamp | 2019-05-20 19:07:38.307722+09
acquisition_timestamp | 2019-05-20 19:07:38.307741+09
release_timestamp | 2019-05-20 19:07:38.329228+09
duration_ms | 22
is_executing | f使用例2(Management Console)
Management Consoleでも同様の情報を確認することができます。
画面下部のActivity→画面上部のプルダウンから、Query Monitoringを選択すると、
以下のような画面が表示されます。

情報の保存期間
当システムテーブルの保存期間は、デフォルトでは期間ではなく情報量のサイズです。
メモリに1000KB、ディスク上に10000KBのサイズが上限です。
タイムベースの期間は無効化されています。
当システムテーブルのリテンションポリシーを確認する方法を以下に記載します。
dbadmin=> SELECT get_data_collector_policy('ResourceAcquisitions');
get_data_collector_policy
-----------------------------------------------------------------------------
1000KB kept in memory, 10000KB kept on disk. Time based retention disabled.
(1 row)※Management Consoleで参照できる情報は、RESOURCE_ACQUISITIONSシステムテーブルの他にも参照しています。そのため、上述のリテンションポリシーの変更だけでは反映されません。
検証バージョンについて
この記事の内容はVertica 9.2で確認しています。
更新履歴
2019/05/23 本記事を公開