sql >> Databasteknik >  >> RDS >> PostgreSQL

Dolda funktioner i PostgreSQL

Eftersom postgres är mycket mer sansad än MySQL så finns det inte så många "knep" att rapportera om;-)

Manualen har några bra prestandatips.

Några andra prestationsrelaterade saker att tänka på:

  • Se till att autovakuum är påslaget
  • Se till att du har gått igenom din postgres.conf (effektiv cachestorlek, delade buffertar, arbetsminne ... massor av alternativ för att ställa in).
  • Använd pgpool eller pgbouncer för att hålla dina "riktiga" databasanslutningar till ett minimum
  • Lär dig hur EXPLAIN och EXPLAIN ANALYZE fungerar. Lär dig att läsa utdata.
  • CLUSTER sorterar data på disken enligt ett index. Kan dramatiskt förbättra prestandan för stora (oftast) skrivskyddade tabeller. Klustring är en engångsoperation:när tabellen uppdateras senare, klustras inte ändringarna.

Här är några saker jag har funnit användbara som inte är konfigurations- eller prestandarelaterade i sig.

Så här ser du vad som händer just nu:

select * from pg_stat_activity;

Sök bland andra funktioner:

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

Hitta storleken på databasen:

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

Hitta storlek på alla databaser:

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

Hitta storlek på tabeller och index:

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

Eller, för att lista alla tabeller och index (förmodligen lättare att se detta):

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;

Åh, och du kan kapsla transaktioner, återställa partiella transaktioner++

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. SQL Server-filnamn kontra versioner

  2. Hur bestämmer du vilka SQL-tabeller som har en identitetskolumn programmatiskt

  3. Hur man använder den länkade tabellhanteraren i Access 2016

  4. Uppdatera poster i tabell från CTE