今回は、前回のエントリで紹介した Postgres Toolkit に含まれるコマンドのうち、pt-table-usageコマンドとpt-index-usageコマンドを紹介します。
「Postgres Toolkitって何?」という方は前回のエントリからどうぞ。
pt-table-usageとpt-index-usageコマンドは、それぞれテーブルとインデックスの利用状況を確認するためのコマンドです。
PostgreSQLの統計情報についてご存じの方はお分かりの通り、通常、PostgreSQLでこれらの情報を取得するには、複数のシステムビューやシステムテーブルを組み合わせなければなりません。
そのため、DBAにとって、もっとも頻繁に行う作業のひとつであるにも関わらず、かなり面倒な部類に入る作業です。
pt-table-usageとpt-index-usageは、これらの作業をコマンドひとつで実行できるようにしたものです。
pt-table-usageコマンドを使うと、オブジェクトID、所有者、スキーマ名、テーブル名などの基本的な情報から、ブロック数やアクセス統計情報、配置されているテーブルスペースの名前などを確認することができます。
以下は、データベース postgres 内のテーブルの状況を表示した例です。
例えば、ブロック数(BLKS)はその数字に8kBを掛けることによって、オブジェクトのサイズを取得することができます。
また、テーブルスキャン(SCAN)、タプル読み込み(T_READ)、タプル挿入(T_INS)、更新(T_UPD)、削除(T_DEL)によって、テーブルの論理的なアクセス状況が分かります。
加えて、テーブルやタプルレベルではなく、ブロックI/Oレベルのアクセス統計情報を見ることもできます。ブロック読み込み(B_READ)はディスクからブロックを物理的に読み込んだ回数で、ブロックヒット(B_HIT)はバッファキャッシュにヒットした回数です。
このように、pt-table-usageコマンドを使うことによって、各テーブルのアクセス状況を一目で確認することができます。
また、メンテナンス状況の確認に必要な、直近のVACUUMやANALYZEの日時の情報もあります。
「VACUUMED」は直近に実施された手動VACUUMまたは自動VACUUMの日時で、「ANALYZED」も同様に直近の手動ANALYZEまたは自動ANALYZEの実施日時です。VACUUMについてもANALYZEについても、まだ一度も実施されていない場合には、この欄は空欄になります。
最後の「TABLESPACE」は、テーブルが配置されているテーブルスペース名で、データベースクラスタ内(デフォルト)に配置されている場合には、「pg_default」と表示されます。テーブルスペース名も、ツールやスクリプト無しで確認しようとすると取得するのが面倒な項目の一つです。
ひとつのデータベースの中にテーブルが大量にあるような場合には、所有者やスキーマ名などによって絞り込んで表示することもできますし、特定のテーブルだけ見たいという場合にはテーブル名を指定することもできますので、この辺りのオプションを状況に応じて使うといいでしょう。
pt-index-usageコマンドも、基本的にはpt-table-usageコマンドに似ており、オブジェクト名などの基本的な情報や、アクセス統計統計情報を表示できます。
pt-index-usageでは、インデックス名に加えてインデックスが作成されているテーブル名が表示され、またインデックスの状態(STATUS)を示す情報が追加されています。
インデックスの状態に合わせて、"INVALID"や "NOTREADY"というステータスが表示されます。これは、pg_indexビューのindisvalidカラムとindisreadyカラムの情報を使っています。インデックスのステータスの詳細はマニュアルを参照してください。
pt-index-usageコマンドも、スキーマ名や所有者、テーブル名などで絞り込んで表示することができますので、インデックスが大量にあるデータベース内で確認したい対象が決まっている場合には、そちらで絞り込んで表示すると良いでしょう。
テーブルやインデックスの状態を確認するというのは、DBAにとって基本中の基本となるタスクですが、ツールやスクリプトの支援無しで実施するのは結構しんどい作業です。
pt-table-usageやpt-index-usageのようなコマンドをうまく使って、タスクの生産性を上げていただければと思います。
「Postgres Toolkitって何?」という方は前回のエントリからどうぞ。
pt-table-usageとpt-index-usageコマンドは、それぞれテーブルとインデックスの利用状況を確認するためのコマンドです。
PostgreSQLの統計情報についてご存じの方はお分かりの通り、通常、PostgreSQLでこれらの情報を取得するには、複数のシステムビューやシステムテーブルを組み合わせなければなりません。
そのため、DBAにとって、もっとも頻繁に行う作業のひとつであるにも関わらず、かなり面倒な部類に入る作業です。
pt-table-usageとpt-index-usageは、これらの作業をコマンドひとつで実行できるようにしたものです。
■pt-table-usageコマンド
pt-table-usageコマンドを使うと、オブジェクトID、所有者、スキーマ名、テーブル名などの基本的な情報から、ブロック数やアクセス統計情報、配置されているテーブルスペースの名前などを確認することができます。
以下は、データベース postgres 内のテーブルの状況を表示した例です。
[snaga@devvm04 tmp]$ pt-table-usage -d postgres
+-------+-------+--------+------------------+-------+--------+----------+---------+--------+-------+--------+--------+---------------------+---------------------+------------+
| OID | OWNER | SCHEMA | TABLE | BLKS | SCAN | T_READ | T_INS | T_UPD | T_DEL | B_READ | B_HIT | VACUUMED | ANALYZED | TABLESPACE |
+-------+-------+--------+------------------+-------+--------+----------+---------+--------+-------+--------+--------+---------------------+---------------------+------------+
| 27457 | snaga | public | pgbench_accounts | 16690 | 22 | 22011215 | 1000000 | 140965 | 0 | 598949 | 514771 | 2015-05-02 18:00:53 | 2015-05-02 21:21:33 | pg_default |
| 27460 | snaga | public | pgbench_branches | 8 | 183611 | 1405430 | 10 | 140959 | 0 | 106 | 673490 | 2015-05-03 16:36:48 | 2015-05-03 16:36:48 | pg_default |
| 27451 | snaga | public | pgbench_history | 71 | 3 | 205759 | 140956 | 0 | 0 | 7259 | 143541 | 2015-05-02 18:00:47 | 2015-05-03 16:36:48 | spc1 |
| 27454 | snaga | public | pgbench_tellers | 12 | 118516 | 11296500 | 100 | 140961 | 0 | 122 | 381979 | 2015-05-03 16:36:48 | 2015-05-03 16:36:48 | pg_default |
+-------+-------+--------+------------------+-------+--------+----------+---------+--------+-------+--------+--------+---------------------+---------------------+------------+
[snaga@devvm04 tmp]$
例えば、ブロック数(BLKS)はその数字に8kBを掛けることによって、オブジェクトのサイズを取得することができます。
また、テーブルスキャン(SCAN)、タプル読み込み(T_READ)、タプル挿入(T_INS)、更新(T_UPD)、削除(T_DEL)によって、テーブルの論理的なアクセス状況が分かります。
加えて、テーブルやタプルレベルではなく、ブロックI/Oレベルのアクセス統計情報を見ることもできます。ブロック読み込み(B_READ)はディスクからブロックを物理的に読み込んだ回数で、ブロックヒット(B_HIT)はバッファキャッシュにヒットした回数です。
このように、pt-table-usageコマンドを使うことによって、各テーブルのアクセス状況を一目で確認することができます。
また、メンテナンス状況の確認に必要な、直近のVACUUMやANALYZEの日時の情報もあります。
「VACUUMED」は直近に実施された手動VACUUMまたは自動VACUUMの日時で、「ANALYZED」も同様に直近の手動ANALYZEまたは自動ANALYZEの実施日時です。VACUUMについてもANALYZEについても、まだ一度も実施されていない場合には、この欄は空欄になります。
最後の「TABLESPACE」は、テーブルが配置されているテーブルスペース名で、データベースクラスタ内(デフォルト)に配置されている場合には、「pg_default」と表示されます。テーブルスペース名も、ツールやスクリプト無しで確認しようとすると取得するのが面倒な項目の一つです。
ひとつのデータベースの中にテーブルが大量にあるような場合には、所有者やスキーマ名などによって絞り込んで表示することもできますし、特定のテーブルだけ見たいという場合にはテーブル名を指定することもできますので、この辺りのオプションを状況に応じて使うといいでしょう。
[snaga@devvm04 tmp]$ pt-table-usage --help
Usage: pt-table-usage [option...]
Options:
-h, --host=HOSTNAME Host name of the postgres server
-p, --port=PORT Port number of the postgres server
-U, --username=USERNAME User name to connect
-d, --dbname=DBNAME Database name to connect
-o, --owner=STRING Database owner
-n, --schema=STRING Database schema
-t, --table=STRING Table name
--help Print this help.
[snaga@devvm04 tmp]$
■pt-index-usageコマンド
pt-index-usageコマンドも、基本的にはpt-table-usageコマンドに似ており、オブジェクト名などの基本的な情報や、アクセス統計統計情報を表示できます。
[snaga@devvm04 tmp]$ pt-index-usage -d postgres
+-------+-------+--------+------------------+-----------------------+------+--------+--------+--------+--------+--------+--------+------------+
| OID | OWNER | SCHEMA | TABLE | INDEX | BLKS | SCAN | T_READ | T_FTCH | B_READ | B_HIT | STATUS | TABLESPACE |
+-------+-------+--------+------------------+-----------------------+------+--------+--------+--------+--------+--------+--------+------------+
| 27468 | snaga | public | pgbench_accounts | pgbench_accounts_pkey | 2745 | 281928 | 329225 | 281928 | 121564 | 867172 | | pg_default |
| 27464 | snaga | public | pgbench_branches | pgbench_branches_pkey | 2 | 441 | 1202 | 441 | 39 | 626 | | pg_default |
| 27466 | snaga | public | pgbench_tellers | pgbench_tellers_pkey | 2 | 28003 | 28802 | 28003 | 34 | 28489 | | pg_default |
+-------+-------+--------+------------------+-----------------------+------+--------+--------+--------+--------+--------+--------+------------+
[snaga@devvm04 tmp]$
pt-index-usageでは、インデックス名に加えてインデックスが作成されているテーブル名が表示され、またインデックスの状態(STATUS)を示す情報が追加されています。
インデックスの状態に合わせて、"INVALID"や "NOTREADY"というステータスが表示されます。これは、pg_indexビューのindisvalidカラムとindisreadyカラムの情報を使っています。インデックスのステータスの詳細はマニュアルを参照してください。
pt-index-usageコマンドも、スキーマ名や所有者、テーブル名などで絞り込んで表示することができますので、インデックスが大量にあるデータベース内で確認したい対象が決まっている場合には、そちらで絞り込んで表示すると良いでしょう。
[snaga@devvm04 tmp]$ pt-index-usage --help
Usage: pt-index-usage [option...]
Options:
-h, --host=HOSTNAME Host name of the postgres server
-p, --port=PORT Port number of the postgres server
-U, --username=USERNAME User name to connect
-d, --dbname=DBNAME Database name to connect
-o, --owner=STRING Database owner
-n, --schema=STRING Database schema
-t, --table=STRING Table name
-i, --index=STRING Index name
--help Print this help.
[snaga@devvm04 tmp]$
■まとめ
テーブルやインデックスの状態を確認するというのは、DBAにとって基本中の基本となるタスクですが、ツールやスクリプトの支援無しで実施するのは結構しんどい作業です。
pt-table-usageやpt-index-usageのようなコマンドをうまく使って、タスクの生産性を上げていただければと思います。