sql >> Databáze >  >> RDS >> PostgreSQL

Skryté vlastnosti PostgreSQL

Vzhledem k tomu, že postgres je mnohem rozumnější než MySQL, není tolik "triků", o kterých by se dalo hlásit;-)

Příručka obsahuje několik pěkných tipů pro výkon.

Několik dalších věcí souvisejících s výkonem, které je třeba mít na paměti:

  • Ujistěte se, že je zapnuté automatické vysávání
  • Ujistěte se, že jste si prošli svůj postgres.conf (efektivní velikost mezipaměti, sdílené vyrovnávací paměti, pracovní paměť ... spousta možností k vyladění).
  • Použijte pgpool nebo pgbouncer k minimalizaci vašich "skutečných" databázových připojení
  • Zjistěte, jak funguje EXPLAIN a EXPLAIN ANALYZE. Naučte se číst výstup.
  • CLUSTER třídí data na disku podle indexu. Může výrazně zlepšit výkon velkých (většinou) tabulek pouze pro čtení. Clusterování je jednorázová operace:při následné aktualizaci tabulky se změny neshlukují.

Zde je několik užitečných věcí, které samy o sobě nesouvisejí s konfigurací nebo výkonem.

Chcete-li zjistit, co se aktuálně děje:

select * from pg_stat_activity;

Hledat různé funkce:

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

Najít velikost databáze:

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

Najít velikost všech databází:

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

Najít velikost tabulek a indexů:

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

Nebo, chcete-li vypsat všechny tabulky a indexy (pravděpodobně snazší, abyste si to mohli prohlédnout):

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;

Jo, a můžete vnořit transakce, vrátit zpět částečné transakce++

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. Cheat Sheet s příkazy SQL – Jak se naučit SQL za 10 minut

  2. Jak hledat přesně odpovídající slovo pomocí MySql Query

  3. Oracle Odstraňte řádky odpovídající více hodnotám

  4. Android- Musím zkontrolovat, zda tabulka existuje v SqliteHelper.onCreate()?