PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Funzionalità nascoste di PostgreSQL

Dato che Postgres è molto più sano di MySQL, non ci sono molti "trucchi" su cui riferire;-)

Il manuale contiene alcuni bei suggerimenti sulle prestazioni.

Alcuni altri aspetti relativi alle prestazioni da tenere a mente:

  • Assicurati che l'autovacuum sia attivato
  • Assicurati di aver esaminato il tuo postgres.conf (dimensione effettiva della cache, buffer condivisi, memoria di lavoro ... molte opzioni da regolare).
  • Utilizza pgpool o pgbouncer per ridurre al minimo le connessioni "reali" al database
  • Scopri come funzionano EXPLAIN e EXPLAIN ANALYZE. Impara a leggere l'output.
  • CLUSTER ordina i dati su disco in base a un indice. Può migliorare notevolmente le prestazioni di grandi tabelle (per lo più) di sola lettura. Il clustering è un'operazione una tantum:quando la tabella viene successivamente aggiornata, le modifiche non vengono raggruppate.

Ecco alcune cose che ho trovato utili che non sono correlate alla configurazione o alle prestazioni di per sé.

Per vedere cosa sta succedendo attualmente:

select * from pg_stat_activity;

Cerca varie funzioni:

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

Trova la dimensione del database:

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

Trova la dimensione di tutti i database:

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

Trova la dimensione delle tabelle e degli indici:

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

Oppure, per elencare tutte le tabelle e gli indici (probabilmente più facile visualizzarli):

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, e puoi annidare le transazioni, ripristinare le transazioni parziali++

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)