Тъй като postgres е много по-разумен от MySQL, няма толкова много "трикове", за които да докладвате;-)
Ръководството съдържа някои хубави съвети за ефективност.
Няколко други неща, свързани с производителността, които трябва да имате предвид:
- Уверете се, че автоматичното вакуумиране е включено
- Уверете се, че сте преминали през вашия postgres.conf (ефективен размер на кеша, споделени буфери, работна памет ... много опции за настройка).
- Използвайте pgpool или pgbouncer, за да поддържате вашите „истински“ връзки с база данни до минимум
- Научете как работят EXPLAIN и EXPLAIN ANALYZE. Научете се да четете изхода.
- CLUSTER сортира данните на диска според индекс. Може драстично да подобри производителността на големи (предимно) таблици само за четене. Групирането е еднократна операция:когато таблицата се актуализира впоследствие, промените не се групират.
Ето няколко неща, които намерих за полезни, които сами по себе си не са свързани с конфигурацията или производителността.
За да видите какво се случва в момента:
select * from pg_stat_activity;
Търсене на различни функции:
select * from pg_proc WHERE proname ~* '^pg_.*'
Намерете размера на базата данни:
select pg_database_size('postgres');
select pg_size_pretty(pg_database_size('postgres'));
Намерете размера на всички бази данни:
select datname, pg_size_pretty(pg_database_size(datname)) as size
from pg_database;
Намерете размера на таблиците и индексите:
select pg_size_pretty(pg_relation_size('public.customer'));
Или, за да изброите всички таблици и индекси (вероятно по-лесно да направите изглед на това):
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;
О, и можете да вложите транзакции, да отмените частични транзакции++
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)