PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Конфигурационен параметър work_mem в PostgreSQL на Linux

Публикувах плана ви за заявка на objasni.depesz.com, вижте.

Прогнозите на инструмента за планиране на заявки са ужасно грешни на някои места. Изпълнили ли сте ANALYZE наскоро?

Прочетете главите в ръководството за статистически данни, използвани от планировщика и константи на разходите за плановик. Обърнете специално внимание на главите за random_page_cost и default_statistics_target .
Можете да опитате:

ALTER TABLE diplomas ALTER COLUMN number SET STATISTICS 1000;
ANALYZE diplomas;

Или отидете дори по-високо за таблица с 10 милиона реда. Зависи от разпределението на данните идействителните заявки . Експериментирайте. По подразбиране е 100, максимумът е 10000.

За база данни с такъв размер само 1 или 5 MB work_mem като цяло не са достатъчни. Прочетете страницата на Postgres Wiki в Tuning Postgres, към която има връзка @aleroot.

Тъй като вашата заявка се нуждае от 430104 kB памет на диск според EXPLAIN изход, трябва да зададете work_mem до нещо като 500MB или повече, за да позволите сортиране в паметта. Представянето на данни в паметта изисква малко повече пространство, отколкото представянето на диска. Може да се интересувате от това, което Том Лейн публикува наскоро по този въпрос.

Увеличаване на work_mem само с малко, както опитахте, няма да помогне много или дори може да се забави. Задаването му на високо глобално може дори да навреди, особено при едновременен достъп. Множество сесии могат да се нуждаят една друга от глад за ресурси. Разпределянето на повече за една цел отнема памет от друга, ако ресурсът е ограничен. Най-добрата настройка зависи от цялата ситуация.

За да избегнете странични ефекти, задайте го само достатъчно високо локално във вашата сесия и временно за заявката:

SET work_mem = '500MB';

След това го нулирайте до стандартните си стойности:

RESET work_mem;

Или използвайте SET LOCAL за да го зададете само за текущата транзакция за начало.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да закръглим до най-близките X минути с PL/pgSQL?

  2. Обединете множество редове с резултати от една колона в една, групирайте по друга колона

  3. Защо не мога да изключа зависими колони от „GROUP BY“, когато агрегирам по ключ?

  4. Rails автоматично присвояване на идентификатор, който вече съществува

  5. Най-добрият начин за избор на произволни редове PostgreSQL