sql >> Database >  >> RDS >> PostgreSQL

Verborgen functies van PostgreSQL

Aangezien postgres een stuk gezonder is dan MySQL, zijn er niet zoveel "trucs" om over te rapporteren;-)

De handleiding bevat enkele leuke prestatietips.

Een paar andere prestatiegerelateerde zaken om in gedachten te houden:

  • Zorg ervoor dat autovacuüm is ingeschakeld
  • Zorg ervoor dat je je postgres.conf hebt doorlopen (effectieve cachegrootte, gedeelde buffers, werkgeheugen ... veel opties om af te stemmen).
  • Gebruik pgpool of pgbouncer om uw "echte" databaseverbindingen tot een minimum te beperken
  • Leer hoe EXPLAIN en EXPLAIN ANALYZE werken. Leer de uitvoer lezen.
  • CLUSTER sorteert gegevens op schijf volgens een index. Kan de prestaties van grote (meestal) alleen-lezen tabellen drastisch verbeteren. Clustering is een eenmalige operatie:wanneer de tabel vervolgens wordt bijgewerkt, worden de wijzigingen niet geclusterd.

Hier zijn een paar dingen die ik nuttig heb gevonden en die niet per se configuratie- of prestatiegerelateerd zijn.

Om te zien wat er momenteel gebeurt:

select * from pg_stat_activity;

Diverse functies zoeken:

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

Vind grootte van database:

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

Vind de grootte van alle databases:

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

Vind grootte van tabellen en indexen:

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

Of, om alle tabellen en indexen op te sommen (waarschijnlijk makkelijker om hier een overzicht van te maken):

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, en je kunt transacties nesten, gedeeltelijke transacties terugdraaien++

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)


  1. Hoe GRADEN() werkt in MariaDB

  2. MySQL opgeslagen procedure met parameters

  3. Waarschuwing:mysqli_query() verwacht dat parameter 1 mysqli is, resource gegeven

  4. Transactielogboeken bekijken in SQL Server 2008