Ponieważ postgres jest o wiele bardziej rozsądny niż MySQL, nie ma zbyt wielu "sztuczek" do opisania;-)
Instrukcja zawiera kilka fajnych wskazówek dotyczących wydajności.
Kilka innych rzeczy związanych z wydajnością, o których należy pamiętać:
- Upewnij się, że automatyczne odkurzanie jest włączone
- Upewnij się, że przejrzałeś swój postgres.conf (efektywny rozmiar pamięci podręcznej, współdzielone bufory, pamięć robocza... wiele opcji do dostrojenia).
- Użyj pgpool lub pgbouncer, aby ograniczyć do minimum swoje „prawdziwe” połączenia z bazą danych
- Dowiedz się, jak działają WYJAŚNIJ i WYJAŚNIJ ANALIZĘ. Naucz się czytać wyniki.
- CLUSTER sortuje dane na dysku według indeksu. Może znacznie poprawić wydajność dużych (w większości) tabel tylko do odczytu. Klastrowanie jest operacją jednorazową:gdy tabela jest później aktualizowana, zmiany nie są grupowane.
Oto kilka przydatnych rzeczy, które nie są związane z konfiguracją ani wydajnością.
Aby zobaczyć, co się aktualnie dzieje:
select * from pg_stat_activity;
Wyszukaj różne funkcje:
select * from pg_proc WHERE proname ~* '^pg_.*'
Znajdź rozmiar bazy danych:
select pg_database_size('postgres');
select pg_size_pretty(pg_database_size('postgres'));
Znajdź rozmiar wszystkich baz danych:
select datname, pg_size_pretty(pg_database_size(datname)) as size
from pg_database;
Znajdź rozmiar tabel i indeksów:
select pg_size_pretty(pg_relation_size('public.customer'));
Lub, aby wyświetlić listę wszystkich tabel i indeksów (prawdopodobnie łatwiej jest to zobaczyć):
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;
Aha, i możesz zagnieździć transakcje, wycofać częściowe transakcje++
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)