PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Fonctionnalités cachées de PostgreSQL

Étant donné que postgres est beaucoup plus sain que MySQL, il n'y a pas beaucoup de "trucs" à signaler ;-)

Le manuel contient de bons conseils de performance.

Quelques autres éléments liés aux performances à garder à l'esprit :

  • Assurez-vous que le vide automatique est activé
  • Assurez-vous d'avoir parcouru votre postgres.conf (taille effective du cache, tampons partagés, mémoire de travail... de nombreuses options à régler).
  • Utilisez pgpool ou pgbouncer pour réduire au minimum vos "vraies" connexions à la base de données
  • Découvrez comment EXPLAIN et EXPLAIN ANALYZE fonctionnent. Apprenez à lire la sortie.
  • CLUSTER trie les données sur le disque selon un index. Peut considérablement améliorer les performances des tables volumineuses (principalement) en lecture seule. La mise en cluster est une opération ponctuelle :lorsque la table est mise à jour par la suite, les modifications ne sont pas mises en cluster.

Voici quelques éléments que j'ai trouvés utiles qui ne sont pas liés à la configuration ou aux performances en soi.

Pour voir ce qui se passe actuellement :

select * from pg_stat_activity;

Fonctions diverses de recherche :

select * from pg_proc WHERE proname ~* '^pg_.*'

Trouver la taille de la base de données :

select pg_database_size('postgres');
select pg_size_pretty(pg_database_size('postgres'));

Trouver la taille de toutes les bases de données :

select datname, pg_size_pretty(pg_database_size(datname)) as size
  from pg_database;

Trouver la taille des tables et des index :

select pg_size_pretty(pg_relation_size('public.customer'));

Ou, pour lister toutes les tables et tous les index (probablement plus facile d'en faire une vue):

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;

Oh, et vous pouvez imbriquer des transactions, annuler des transactions partielles++

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)