sql >> Databáze >  >> RDS >> Database

Úvod do auto_explain:Jak automaticky zaznamenávat pomalé plány dotazů Postgres

Chcete vědět, proč je dotaz PostgreSQL pomalý? Pak je EXPLAIN ANALYZE skvělým výchozím bodem. Ale plány dotazů mohou záviset na jiné aktivitě serveru, jejich spuštění může chvíli trvat a mohou se časem měnit, takže pokud chcete vidět skutečné plány provádění vašich nejpomalejších dotazů, auto_explain je nástroj, který potřebujete. V tomto příspěvku se podíváme na to, co dělá, jak jej nakonfigurovat a jak tyto protokoly používat k urychlení vašich dotazů.

Co je auto_explain?

auto_explain je rozšíření PostgreSQL, které vám umožňuje protokolovat plány dotazů pro dotazy pomalejší než (konfigurovatelný) práh. To je neuvěřitelně užitečné pro ladění pomalých dotazů, zejména těch, které jsou problematické jen někdy. Je to jeden z příspěvkových modulů, takže jej lze snadno nainstalovat a nakonfigurovat na běžném PostgreSQL a je tak užitečný, že jej máme na ScaleGrid standardně zapnutý.

Velké díky Takahiro Itagakimu, hlavnímu autorovi první verze auto_explain (commit, thread), Deanu Rasheedovi, na jehož původním patchi a návrhu bylo založeno, a mnoha přispěvatelé a recenzenti do něj od.

Jaké parametry auto_explain mám použít?

Níže probereme nejdůležitější parametry, ale projděte si prosím níže uvedenou tabulku nebo oficiální dokumentaci, kde najdete další informace o celé řadě věcí, které můžete sledovat.

Nejdůležitějším parametrem pro auto_explain je log_min_duration . Ve výchozím nastavení je toto nastaveno na -1 , což znamená, že se nic nebude protokolovat – takže pokud chceme nějaké protokoly, musíme to změnit! Výchozí jednotka je ms, takže nastavení 100 zaznamená plány dotazů pro všechny dotazy, které přesahují 100 ms. To je to, co jsme zvolili jako výchozí v ScaleGrid, ale lze to nakonfigurovat pod Admin -> Config. Pokud z nějakého důvodu chcete protokolovat plán dotazů pro každý dotaz, můžete toto nastavit na 0 – ale pozor, může to mít vážné dopady na výkon.

Protože se dotazy na serveru již provádějí, pravděpodobně budete chtít také povolit auto_explain.log_analyze . Díky tomu je výstup ekvivalentní spuštění EXPLAIN ANALYZE . Ve výchozím nastavení to také znamená, že se sledují časování jednotlivých operací. S tím jsou spojeny další režie, které lze minimalizovat vypnutím auto_explain.log_timing (ve výchozím nastavení zapnuto pomocí log_analyze ). Přirozeně je však časování pro jednotlivé operace velmi užitečné při ladění pomalých dotazů! Naše interní testování pro to ukázalo přijatelné režie, takže ve ScaleGrid je ve výchozím nastavení zapnuto, ale jako vždy otestujte svou pracovní zátěž, abyste zjistili, zda je režie ve vašem případě přijatelná. V současné době jsou k tomuto tématu veřejně dostupné informace omezené, ale nedávný příspěvek týmu pgMustard ukázal, že alespoň při malém transakčním zatížení může být režie až 2 %. Jak poznamenali, lze to snížit pomocí auto_explain.sample_rate parametr, za cenu sledování pouze podmnožiny vašich dotazů.

Konečným parametrem, který si probereme trochu podrobněji, je auto_explain.log_format . Výchozí výstup je TEXT, což je pravděpodobně to, co nejlépe znáte z používání EXPLAIN .

Zde je jednoduchý příklad toho, jak může vypadat výstup auto_explain ve formátu 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

Zde můžete vidět, že trvání dotazu dostanete na začátku, na což jste zvyklí vídat obvykle na konci plánů dotazů. Uvidíte také text dotazu včetně všech parametrů.

Oblíbené vizualizační nástroje explain.depesz a explain.dalibo přijímají plány dotazů ve formátu TEXT, ale oba také podporují formát JSON. Pokud někteří z vašeho týmu upřednostňují používání nástrojů jako PEV a pgMustard, které podporují pouze formát JSON, možná budete chtít nastavit tento formát jako formát. Pro zákazníky na ScaleGrid jsme se rozhodli pro formát JSON, částečně proto, že jsme jej chtěli snadněji analyzovat pro naši vlastní funkci pomalé analýzy dotazů.

Zde je úplný seznam parametrů auto_explain a jejich výchozí hodnoty:

Parametr Výchozí nastavení PostgreSQL Výchozí nastavení ScaleGrid
auto_explain.log_min_duration -1 100
auto_explain.log_analyze Vypnuto Zapnuto
auto_explain.log_timing Zapnuto (s log_analyze) Zapnuto
auto_explain.log_buffers Vypnuto Zapnuto
auto_explain.log_verbose Vypnuto Zapnuto
auto_explain.log_triggers Vypnuto Vypnuto
auto_explain.log_nested_statements Vypnuto Vypnuto
auto_explain.log_settings (v12) Vypnuto Vypnuto
auto_explain.log_wal (v13) Vypnuto Vypnuto
auto_explain.log_format TEXT JSON
auto_explain.log_level LOG LOG
auto_explain.sample_rate 1 1

Instalace auto_explain

Na ScaleGrid je auto_explain ve výchozím nastavení zapnuto s prahovou hodnotou 100 ms. Můžete to nakonfigurovat pod Admin -> Konfigurace.

Na vanilla PostgreSQL můžete nainstalovat auto_explain jednoduše přidáním do jedné z session_preload_libraries nebo shared_preload_libraries . První z nich má výhody a) nevyžaduje restart (ale bude načten pouze v nových relacích) ab) umožňuje jej povolit pouze pro některé uživatele (nastavením tohoto parametru pomocí ALTER ROLE SET ).

Základní nastavení konfigurace pro auto_explain by tedy mohlo vypadat takto:

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

Pokud používáte jiného poskytovatele hostingu, stojí za to zkontrolovat, zda podporuje auto_explain. Například RDS Postgres ano, ale na rozdíl od ScaleGrid je ve výchozím nastavení vypnuto, takže pro spuštění budete muset upravit konfiguraci.

Načítání auto_explain do jedné relace

Pokud nechcete, aby se auto_explain spouštělo v relacích automaticky, jako superuživatel máte také možnost jej načíst do jediné relace:

LOAD 'auto_explain';

To může být neuvěřitelně užitečné pro jednorázové relace ladění, ale přirozeně je to zbytečné, pokud to již můžete mít spuštěné.

automatické vysvětlení omezení a problémů

Některé z nich jsme již mimochodem zmínili, ale zdá se, že je rozumný čas připomenout si některé nevýhody a omezení auto_explain.

Za prvé, zejména při sledování časování jednotlivých operací, může použití funkce auto_explain představovat měřitelnou režii. Může být nízká, i když se měří časování, ale jako vždy se vyplatí provést vlastní testování.

Zadruhé, časování auto_explain nezahrnuje čas plánování dotazu. Čas plánování je u pomalých dotazů často krátký, ale ve výjimečných případech může být zodpovědný za většinu problému. Mějte proto na paměti, že tyto případy se nemusí zobrazit ve vašich protokolech, nebo pokud ano, nesoulad s tím, co vidíte v celkové latenci, může souviset s časem plánování. Ruční EXPLAIN ANALYZE vám to rychle pomůže zjistit.

Jak použít výstup vysvětlení k urychlení dotazů

Jakmile budete mít výstup vysvětlení pro své nejpomalejší dotazy, můžete nyní začít hledat možnosti jejich urychlení!

Budete muset získat plány dotazů z protokolů, k čemuž můžete použít pgBadger, pokud nepoužíváte spravovanou službu, která to dělá za vás.

P>

Kontrola plánů EXPLAIN je samo o sobě velké téma. Dokumentace PostgreSQL obsahuje dobrý, ale stručný úvod do používání EXPLAIN a Toughbotův článek o čtení EXPLAIN ANALYZE je dobrým dalším krokem. Pokud dáváte přednost hodinovému rozhovoru, EXPLAIN Explained od Joshe Berkuse bylo skvělé. Pro více informací má Depesz sérii příspěvků nazvanou Vysvětlování nevysvětlitelného a tým pgMustard má poměrně obsáhlý EXPLAIN Glossary.

Pokud potřebujete pomoc od odborníků na PostgreSQL se správou databází a zrychlením pomalých dotazů, vyzkoušejte ScaleGrid. Poskytujeme bezplatnou 24/7 podporu na podnikové úrovni, která vás provede těmito pomalými dotazy a pomůže vám je všechny optimalizovat. Naše bezplatná 30denní zkušební verze vám dává spoustu času na vyzkoušení mnoha funkcí pro PostgreSQL a naše další podporované databáze.

Doufáme, že vám to poskytne vše, co potřebujete, abyste mohli začít s auto_explain a urychlit všechny vaše pomalé dotazy. Pokud byste ještě něco chtěli vědět, ozvěte se.


  1. Kde hodnota ve sloupci obsahujícím hodnoty oddělené čárkou

  2. Dosáhněte hierarchie, vztahu rodič/dítě efektivním a snadným způsobem

  3. Jak vytvořit a používat dočasnou tabulku v uložené proceduře Oracle?

  4. Problém s porovnáním řetězců Oracle PL/SQL