postgresはMySQLよりもはるかに正気なので、報告する「トリック」はそれほど多くありません;-)
マニュアルには、パフォーマンスに関する優れたヒントがいくつかあります。
覚えておくべき他のいくつかのパフォーマンス関連事項:
- 自動真空がオンになっていることを確認してください
- postgres.conf(有効なキャッシュサイズ、共有バッファ、作業メモリ...調整するための多くのオプション)を確認してください。
- pgpoolまたはpgbouncerを使用して、「実際の」データベース接続を最小限に抑えます
- EXPLAINおよびEXPLAINANALYZEがどのように機能するかを学びます。出力の読み方を学びます。
- CLUSTERは、ディスク上のデータをインデックスに従ってソートします。大きな(ほとんど)読み取り専用テーブルのパフォーマンスを劇的に向上させることができます。クラスタリングは1回限りの操作です。その後、テーブルが更新されても、変更はクラスタリングされません。
構成やパフォーマンス自体に関係のない、便利だと思ったことがいくつかあります。
現在何が起こっているかを確認するには:
select * from pg_stat_activity;
その他の機能の検索:
select * from pg_proc WHERE proname ~* '^pg_.*'
データベースのサイズを見つける:
select pg_database_size('postgres');
select pg_size_pretty(pg_database_size('postgres'));
すべてのデータベースのサイズを検索する:
select datname, pg_size_pretty(pg_database_size(datname)) as size
from pg_database;
テーブルとインデックスのサイズを見つける:
select pg_size_pretty(pg_relation_size('public.customer'));
または、すべてのテーブルとインデックスを一覧表示するには(おそらく、これを表示する方が簡単です):
select schemaname, relname,
pg_size_pretty(pg_relation_size(schemaname || '.' || relname)) as size
from (select schemaname, relname, 'table' as type
from pg_stat_user_tables
union all
select schemaname, relname, 'index' as type
from pg_stat_user_indexes) x;
ああ、トランザクションをネストしたり、部分的なトランザクションをロールバックしたりできます++
test=# begin;
BEGIN
test=# select count(*) from customer where name='test';
count
-------
0
(1 row)
test=# insert into customer (name) values ('test');
INSERT 0 1
test=# savepoint foo;
SAVEPOINT
test=# update customer set name='john';
UPDATE 3
test=# rollback to savepoint foo;
ROLLBACK
test=# commit;
COMMIT
test=# select count(*) from customer where name='test';
count
-------
1
(1 row)