sql >> Base de Datos >  >> RDS >> PostgreSQL

Características ocultas de PostgreSQL

Dado que postgres es mucho más sensato que MySQL, no hay tantos "trucos" para informar;-)

El manual tiene algunos buenos consejos de rendimiento.

Algunas otras cosas relacionadas con el rendimiento a tener en cuenta:

  • Asegúrese de que el vacío automático esté activado
  • Asegúrese de haber revisado su postgres.conf (tamaño de caché efectivo, búferes compartidos, memoria de trabajo... muchas opciones para ajustar).
  • Use pgpool o pgbouncer para mantener sus conexiones de base de datos "reales" al mínimo
  • Aprenda cómo funciona EXPLAIN y EXPLAIN ANALYZE. Aprenda a leer la salida.
  • CLUSTER ordena los datos en el disco según un índice. Puede mejorar drásticamente el rendimiento de tablas grandes (en su mayoría) de solo lectura. La agrupación en clústeres es una operación única:cuando la tabla se actualiza posteriormente, los cambios no se agrupan.

Aquí hay algunas cosas que he encontrado útiles que no están relacionadas con la configuración o el rendimiento per se.

Para ver lo que está sucediendo actualmente:

select * from pg_stat_activity;

Buscar funciones misceláneas:

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

Encuentra el tamaño de la base de datos:

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

Encuentra el tamaño de todas las bases de datos:

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

Encuentra el tamaño de tablas e índices:

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

O, para listar todas las tablas e índices (probablemente más fácil hacer una vista de esto):

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;

Ah, y puede anidar transacciones, revertir transacciones parciales++

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)