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

Въведение в auto_explain:Как автоматично да регистрирате бавни планове за заявка на Postgres

Искате ли да знаете защо заявката на PostgreSQL е бавна? Тогава EXPLAIN ANALYZE е чудесна отправна точка. Но плановете за заявки могат да зависят от друга активност на сървъра, може да отнеме известно време за изпълнение и могат да се променят с течение на времето, така че ако искате да видите действителните планове за изпълнение на най-бавните си заявки, auto_explain е инструментът, от който се нуждаете. В тази публикация ще разгледаме какво прави, как да го конфигурираме и как да използваме тези регистрационни файлове, за да ускорим заявките си.

Какво е auto_explain?

auto_explain е разширение на PostgreSQL, което ви позволява да регистрирате плановете за заявки за заявки, по-бавни от (конфигурируем) праг. Това е невероятно полезно за отстраняване на грешки при бавни заявки, особено тези, които само понякога са проблематични. Това е един от модулите за принос, така че може да се инсталира и конфигурира лесно на обикновен PostgreSQL и е толкова полезен, че го включваме по подразбиране в ScaleGrid.

Огромни благодарности на Такахиро Итагаки, основният автор зад първата версия на auto_explain (commit, thread), Дийн Рашид, чиято първоначална корекция и предложение се базираше, и много сътрудници и рецензенти за него оттогава.

Кои параметри на auto_explain да използвам?

По-долу ще обсъдим най-важните параметри, но моля, прегледайте таблицата по-долу или официалната документация за повече информация относно пълния набор от неща, които можете да проследявате.

Най-важният параметър за auto_explain е log_min_duration . По подразбиране това е зададено на -1 , което означава, че нищо няма да бъде регистрирано – така че ако искаме някои регистрационни файлове, трябва да го променим! Единицата по подразбиране е ms, така че настройката е 100 ще регистрира плановете за заявки за всички заявки, които надвишават 100 ms. Това е, което избрахме като подразбиране в ScaleGrid, но може да се конфигурира под Admin -> Config. Ако по някаква причина искате да регистрирате плана на заявката за всяка заявка, можете да зададете това на 0 – но внимавайте, това може да има сериозни последици за производителността.

Тъй като заявките вече се изпълняват на сървъра, вероятно искате да активирате auto_explain.log_analyze . Това прави изхода еквивалентен на изпълнение на EXPLAIN ANALYZE . По подразбиране това също означава, че времето за всяка операция се проследява. Това идва с някои допълнителни разходи, които могат да бъдат сведени до минимум чрез изключване на auto_explain.log_timing (включено по подразбиране с log_analyze ). Естествено обаче, времето за всяка операция е много полезно при отстраняване на грешки в бавни заявки! Нашето вътрешно тестване показа приемливи режийни разходи за това, така че е включено по подразбиране в ScaleGrid, но както винаги, моля, тествайте работното си натоварване, за да видите дали режийните разходи са приемливи във вашия случай. Понастоящем има ограничена публично достъпна информация по тази тема, но неотдавнашна публикация на екипа на pgMustard показа, че поне при малко натоварване на транзакциите режийните разходи могат да бъдат до 2%. Както отбелязаха, това може да бъде намалено с auto_explain.sample_rate параметър, с цената на проследяване само на подмножество от вашите заявки.

Последният параметър, който ще обсъдим малко по-подробно, е auto_explain.log_format . Изходът по подразбиране е ТЕКСТ, което вероятно е това, с което най-добре сте запознати от използването на EXPLAIN .

Ето прост пример за това как може да изглежда изходът auto_explain във формат TEXT:

2021-09-10 15:32:04.606 BST [22770] LOG:  duration: 3184.383 ms  plan:
	Query Text: select * from table1 order by column1;
	Sort  (cost=12875.92..13125.92 rows=100000 width=37) (actual time=2703.799..3055.401 rows=100000 loops=1)
	  Sort Key: column1
	  Sort Method: external merge  Disk: 4696kB
	  Buffers: shared hit=837, temp read=587 written=589
	  ->  Seq Scan on table  (cost=0.00..1834.01 rows=100000 width=37) (actual time=0.033..27.795 rows=100000 loops=1)
	        Buffers: shared hit=834

Тук можете да видите, че получавате продължителността на заявката в началото, която обикновено може да сте свикнали да виждате в края на плановете за заявка. Ще видите също текста на заявката, включително всички параметри.

Популярните инструменти за визуализация objasni.depesz и objasni.dalibo приемат планове за заявки във формат TEXT, но и двата поддържат JSON формат. Ако някои от вашия екип предпочитат да използват инструменти като PEV и pgMustard, които поддържат само JSON формата, може да искате да го зададете като формат. За клиентите на ScaleGrid избрахме формата JSON, отчасти тъй като искахме да го анализираме по-лесно за нашата собствена функция за анализ на бавни заявки.

Ето пълен списък на параметрите auto_explain и техните настройки по подразбиране:

Параметър По подразбиране на PostgreSQL ScaleGrid по подразбиране
auto_explain.log_min_duration -1 100
auto_explain.log_analyze Изключено Включено
auto_explain.log_timing Включено (с log_analyze) Включено
auto_explain.log_buffers Изключено Включено
auto_explain.log_verbose Изключено Включено
auto_explain.log_triggers Изключено Изключено
auto_explain.log_nested_statements Изключено Изключено
auto_explain.log_settings (v12) Изключено Изключено
auto_explain.log_wal (v13) Изключено Изключено
auto_explain.log_format TEXT JSON
auto_explain.log_level LOG LOG
auto_explain.sample_rate 1 1

Инсталиране на auto_explain

В ScaleGrid, auto_explain е включен по подразбиране, с праг от 100ms. Можете да конфигурирате това под Администратор -> Конфигурация.

На vanilla PostgreSQL можете да инсталирате auto_explain просто като го добавите към една от session_preload_libraries или shared_preload_libraries . Първият има предимствата, че а) не изисква рестартиране (но ще се зарежда само при нови сесии) и б) прави възможно активирането му само за някои потребители (чрез задаването на този параметър с ALTER ROLE SET ).

Като такава, основната настройка на конфигурацията за auto_explain може да изглежда така:

session_preload_libraries = auto_explain
auto_explain.log_min_duration = 100
auto_explain.log_analyze = true
auto_explain.log_buffers = true
auto_explain.log_format = JSON

Ако използвате различен хостинг доставчик, струва си да проверите дали поддържа auto_explain. Например, RDS Postgres го прави, но за разлика от ScaleGrid, той е изключен по подразбиране, така че ще трябва да редактирате конфигурацията, за да я стартирате.

Зареждане на auto_explain в една сесия

Ако не искате auto_explain да се изпълнява автоматично в сесии, като суперпотребител също имате възможност да го заредите в една сесия:

LOAD 'auto_explain';

Това може да бъде невероятно полезно за еднократни сесии за отстраняване на грешки, но естествено е излишно, ако вече можете да го стартирате.

auto_explain ограничения и проблеми

Вече споменахме някои от тях мимоходом, но изглежда разумно време да си припомним някои от недостатъците и ограниченията на auto_explain.

Първо, особено при проследяване на времето за всяка операция, може да има измерими допълнителни разходи при използването на auto_explain. Тя може да е ниска, дори при измерване на времената, но както винаги си струва да направите собствено тестване.

На второ място, времето на auto_explain не включва времето за планиране на заявката. Времето за планиране често е малко при бавни заявки, но в изключителни случаи може да бъде отговорно за по-голямата част от проблема. Като такива, имайте предвид, че тези случаи може да не се показват във вашите регистрационни файлове или ако се показват, несъответствието с това, което виждате в общата латентност, може да е свързано с времето за планиране. Ръководство ОБЯСНИ АНАЛИЗ бързо ще ви помогне да забележите това.

Как да използвате изхода за обяснение за ускоряване на заявките

След като получите изхода за обяснение за най-бавните си заявки, вече можете да започнете да ги ускорявате!

Ще трябва да извадите плановете на заявката от регистрационните файлове, за които можете да използвате pgBadger, ако не използвате управлявана услуга, която прави това вместо вас.

P>

Прегледът на EXPLAIN планове е огромна тема сама по себе си. Документацията на PostgreSQL включва добро, но кратко въведение в използването на EXPLAIN, а статията на Thoughbot за четене на EXPLAIN ANALYZE е добра следваща стъпка. Ако предпочитате едночасов разговор, EXPLAIN Explained от Джош Беркус беше отличен. За повече информация Depesz има поредица от публикации, наречени Обяснение на необяснимото, а екипът на pgMustard разполага с доста изчерпателен речник на EXPLAIN.

Ако имате нужда от помощ от експертите на PostgreSQL за управление на вашите бази данни и ускоряване на бавните ви заявки, опитайте ScaleGrid. Ние предоставяме безплатна 24/7 поддръжка на корпоративно ниво, която може да ви преведе през тези бавни заявки и да ви помогне да ги оптимизирате. Нашата безплатна 30-дневна пробна версия ви дава достатъчно време да изпробвате многобройните ни функции за PostgreSQL и другите ни поддържани бази данни.

Надяваме се, че това ви дава всичко необходимо, за да започнете с auto_explain и да започнете да ускорявате всички бавни заявки, които имате. Ако има нещо друго, което искате да знаете, свържете се с нас.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешки при свързване с база данни или удостоверяване с подвижен тип

  2. Разбиране на съпоставянето на ниво база данни и въздействието от промяната му за база данни

  3. Основи на табличните изрази, част 11 – изгледи, съображения за модификация

  4. 4 готови метода за преобразуване на SQL данни и случаи на употреба

  5. Колко скъпи са имплицитните преобразувания отстрани на колона?