1. ホーム
  2. database

[解決済み] PostgreSQLの隠し味【終了しました

2023-08-29 17:56:23

質問

これがまだ投稿されていないことに驚いています。Postgresで知っている面白いトリックがあれば教えてください。不明な設定オプションやスケーリング/perfのトリックは特に歓迎されます。

対応する9件のコメントには勝てると思います。 MySQL スレッド :)

どのように解決するのですか?

Postgres は MySQL よりもずっとまともなので、報告するようなトリックはあまりありません;-)

その マニュアル には、いくつかの素晴らしい パフォーマンス のヒントがあります。

その他、パフォーマンスに関する注意点をいくつか紹介します。

  • autovacuum がオンになっていることを確認する
  • postgres.conf (有効キャッシュサイズ、共有バッファ、ワークメモ...調整するための多くのオプション) を調べ上げたことを確認してください。
  • pgpoolまたは pgbouncer を使って、データベースへの接続を最小限に抑えることができます。
  • どのように EXPLAIN と EXPLAIN ANALYZE がどのように機能するかを学びます。 出力の読み方を学ぶ。
  • クラスタ は、インデックスに従ってディスク上のデータをソートします。 大規模な (ほとんどの) 読み取り専用テーブルのパフォーマンスを劇的に向上させることができます。 クラスタリングは 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)