F.5. auto_explain â пÑоÑоколиÑование планов вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½ÑÑ Ð·Ð°Ð¿ÑоÑов #
ÐодÑÐ»Ñ auto_explain пÑедоÑÑавлÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð°Ð²ÑомаÑиÑеÑкого пÑоÑоколиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð»Ð°Ð½Ð¾Ð² вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½ÑÑ
опеÑаÑоÑов, ÑÑо позволÑÐµÑ Ð¾Ð±Ð¾Ð¹ÑиÑÑ Ð±ÐµÐ· вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ EXPLAIN вÑÑÑнÑÑ. ÐÑо оÑобенно полезно Ð´Ð»Ñ Ð²ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð¿ÑимизиÑованнÑÑ
запÑоÑов в болÑÑиÑ
пÑиложениÑÑ
.
ÐÑÐ¾Ñ Ð¼Ð¾Ð´ÑÐ»Ñ Ð½Ðµ пÑедоÑÑавлÑÐµÑ ÑÑнкÑий, доÑÑÑпнÑÑ Ð¸Ð· SQL. ЧÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ ÐµÐ³Ð¾, пÑоÑÑо загÑÑзиÑе его в пÑоÑеÑÑ ÑеÑвеÑа. ÐÑо можно ÑделаÑÑ Ð² оÑделÑном ÑеанÑе:
LOAD 'auto_explain';
(ÐÐ»Ñ ÑÑого нÑжно бÑÑÑ ÑÑпеÑполÑзоваÑелем.) Ðолее ÑипиÑна конÑигÑÑаÑиÑ, когда он загÑÑжаеÑÑÑ Ð² некоÑоÑÑе или вÑе ÑеанÑÑ Ð² ÑезÑлÑÑаÑе вклÑÑÐµÐ½Ð¸Ñ auto_explain в пеÑеменнÑÑ session_preload_libraries или в shared_preload_libraries в Ñайле postgresql.conf. ÐагÑÑзив ÑÑÐ¾Ñ Ð¼Ð¾Ð´ÑлÑ, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе оÑÑлеживаÑÑ Ð¸ÑклÑÑиÑелÑно медленнÑе запÑоÑÑ, вне завиÑимоÑÑи Ð¾Ñ Ñого, когда они пÑоиÑÑ
одÑÑ. ÐонеÑно, ÑÑо Ð¸Ð¼ÐµÐµÑ ÑÐ²Ð¾Ñ ÑенÑ.
F.5.1. ÐаÑамеÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии #
ÐÑÑÑ Ð½ÐµÑколÑко паÑамеÑÑов конÑигÑÑаÑии, коÑоÑÑе ÑпÑавлÑÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸ÐµÐ¼ auto_explain. ÐамеÑÑÑе, ÑÑо поведение по ÑмолÑÐ°Ð½Ð¸Ñ ÑводиÑÑÑ Ðº бездейÑÑвиÑ, Ñак ÑÑо необÑ
одимо ÑÑÑановиÑÑ ÐºÐ°Ðº минимÑм пеÑеменнÑÑ auto_explain.log_min_duration, еÑли Ð²Ñ Ñ
оÑиÑе полÑÑиÑÑ ÐºÐ°ÐºÐ¸Ðµ-либо ÑезÑлÑÑаÑÑ.
auto_explain.log_min_duration(integer) #ÐеÑеменнаÑ
auto_explain.log_min_durationзадаÑÑ Ð²ÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑа, в миллиÑекÑÐ½Ð´Ð°Ñ , пÑи пÑевÑÑении коÑоÑого план опеÑаÑоÑа бÑÐ´ÐµÑ Ð¿ÑоÑоколиÑоваÑÑÑÑ. ÐÑи знаÑении, Ñавном0, пÑоÑоколиÑÑÑÑÑÑ Ð²Ñе планÑ, а пÑи-1(по ÑмолÑаниÑ) пÑоÑоколиÑование планов оÑклÑÑаеÑÑÑ. ÐапÑимеÑ, еÑли Ð²Ñ ÑÑÑановиÑе знаÑение250ms, пÑоÑоколиÑоваÑÑÑÑ Ð±ÑдÑÑ Ð²Ñе запÑоÑÑ, вÑполнÑÑÑиеÑÑ 250 Ð¼Ñ Ð¸ долÑÑе. ÐзмениÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð³ÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели.auto_explain.log_parameter_max_length(integer) #auto_explain.log_parameter_max_lengthÑпÑавлÑÐµÑ Ð¿ÑоÑоколиÑованием знаÑений паÑамеÑÑов запÑоÑа. ÐнаÑение-1(по ÑмолÑаниÑ) ознаÑÐ°ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð·Ð½Ð°Ñений паÑамеÑÑов полноÑÑÑÑ, а0оÑклÑÑÐ°ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ. ÐнаÑение болÑÑе нÑÐ»Ñ ÑÑÐµÐºÐ°ÐµÑ ÐºÐ°Ð¶Ð´Ð¾Ðµ знаÑение паÑамеÑÑа до Ñказанного колиÑеÑÑва байÑов. ÐзмениÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð³ÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели.auto_explain.log_analyze(boolean) #ÐÑи вклÑÑении паÑамеÑÑа
auto_explain.log_analyzeв пÑоÑокол бÑÐ´ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑваÑÑÑÑ Ð²Ñвод командÑEXPLAIN ANALYZE, а не пÑоÑÑойEXPLAIN. Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¾ÑклÑÑÑн. ÐзмениÑÑ ÐµÐ³Ð¾ могÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели.ÐÑимеÑание
Ðогда ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð²ÐºÐ»ÑÑÑн, Ð·Ð°Ð¼ÐµÑ Ð²Ñемени на ÑÑовне Ñзлов плана пÑоизводиÑÑÑ Ð´Ð»Ñ Ð²ÑÐµÑ Ð¾Ð¿ÐµÑаÑоÑов, даже еÑли они вÑполнÑÑÑÑÑ Ð½ÐµÐ´Ð¾ÑÑаÑоÑно долго Ð´Ð»Ñ Ð¿ÑоÑоколиÑованиÑ. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑ ÐºÑайне негаÑивное влиÑние на пÑоизводиÑелÑноÑÑÑ. ÐÑклÑÑение
auto_explain.log_timingиÑклÑÑÐ°ÐµÑ ÑÑо влиÑние, но пÑи ÑÑом ÑобиÑаеÑÑÑ Ð¼ÐµÐ½ÑÑе инÑоÑмаÑии.auto_explain.log_buffers(boolean) #ÐаÑамеÑÑ
auto_explain.log_buffersопÑеделÑеÑ, бÑÐ´ÐµÑ Ð»Ð¸ пÑи пÑоÑоколиÑовании плана вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²ÑводиÑÑÑÑ ÑÑаÑиÑÑика об иÑполÑзовании бÑÑеÑов; он ÑавноÑилен ÑказаниÑBUFFERSкомандÑEXPLAIN. ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð´ÐµÐ¹ÑÑвÑеÑ, ÑолÑко еÑли вклÑÑÑн паÑамеÑÑauto_explain.log_analyze. Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¾ÑклÑÑÑн. ÐзмениÑÑ ÐµÐ³Ð¾ могÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели.auto_explain.log_wal(boolean) #ÐаÑамеÑÑ
auto_explain.log_walопÑеделÑеÑ, бÑÐ´ÐµÑ Ð»Ð¸ пÑи пÑоÑоколиÑовании плана вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²ÑводиÑÑÑÑ ÑÑаÑиÑÑика об иÑполÑзовании WAL; он ÑавноÑилен ÑказаниÑWALкомандÑEXPLAIN. ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð´ÐµÐ¹ÑÑвÑеÑ, ÑолÑко еÑли вклÑÑÑн паÑамеÑÑauto_explain.log_analyze. Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¾ÑклÑÑÑн. ÐзмениÑÑ ÐµÐ³Ð¾ могÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели.auto_explain.log_timing(boolean) #ÐаÑамеÑÑ
auto_explain.log_timingопÑеделÑеÑ, бÑÐ´ÐµÑ Ð»Ð¸ пÑи пÑоÑоколиÑовании плана вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²ÑводиÑÑÑÑ Ð´Ð»Ð¸ÑелÑноÑÑÑ Ð½Ð° ÑÑовне Ñзлов: он ÑавнознаÑен ÑказаниÑTIMINGкомандÑEXPLAIN. ÐздеÑжки Ð¾Ñ Ð¿Ð¾ÑÑоÑнного ÑÑÐµÐ½Ð¸Ñ ÑиÑÑемнÑÑ ÑаÑов могÑÑ Ð·Ð½Ð°ÑиÑелÑно замедлиÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð² некоÑоÑÑÑ ÑиÑÑÐµÐ¼Ð°Ñ , Ñак ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ ÑмÑÑл оÑклÑÑаÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ, когда нÑжно знаÑÑ ÑолÑко знаÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑÑÑок, но не ÑоÑнÑÑ Ð´Ð»Ð¸ÑелÑноÑÑÑ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñзла. ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð´ÐµÐ¹ÑÑвÑеÑ, ÑолÑко еÑли вклÑÑÑнauto_explain.log_analyze. Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¾ÑклÑÑÑн. ÐзмениÑÑ ÐµÐ³Ð¾ могÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели.auto_explain.log_triggers(boolean) #ÐÑи вклÑÑении паÑамеÑÑа
auto_explain.log_triggersв пÑоÑокол бÑÐ´ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑваÑÑÑÑ ÑÑаÑиÑÑика вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑиггеÑов. ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð´ÐµÐ¹ÑÑвÑеÑ, ÑолÑко еÑли вклÑÑÑн паÑамеÑÑauto_explain.log_analyze. Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¾ÑклÑÑÑн. ÐзмениÑÑ ÐµÐ³Ð¾ могÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели.auto_explain.log_verbose(boolean) #ÐаÑамеÑÑ
auto_explain.log_verboseопÑеделÑеÑ, бÑдÑÑ Ð»Ð¸ пÑи пÑоÑоколиÑовании плана вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²ÑводиÑÑÑÑ Ð¿Ð¾Ð´ÑобнÑе ÑведениÑ; он ÑавнознаÑен ÑказаниÑVERBOSEкомандÑEXPLAIN. Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¾ÑклÑÑÑн. ÐзмениÑÑ ÐµÐ³Ð¾ могÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели.auto_explain.log_settings(boolean) #ÐаÑамеÑÑ
auto_explain.log_settingsопÑеделÑеÑ, бÑдÑÑ Ð»Ð¸ вмеÑÑе Ñ Ð¿Ð»Ð°Ð½Ð°Ð¼Ð¸ вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²ÑводиÑÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑннÑе паÑамеÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии. ÐÑи его вклÑÑении вÑводÑÑÑÑ ÑолÑко Ñе паÑамеÑÑÑ, коÑоÑÑе влиÑÑÑ Ð½Ð° планиÑование запÑоÑов и имеÑÑ Ð·Ð½Ð°ÑениÑ, оÑлиÑаÑÑиеÑÑ Ð¾Ñ Ð²ÑÑÑоеннÑÑ . Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¾ÑклÑÑÑн. ÐзмениÑÑ ÐµÐ³Ð¾ могÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели.auto_explain.log_format(enum) #ÐаÑамеÑÑ
auto_explain.log_formatвÑбиÑÐ°ÐµÑ ÑоÑÐ¼Ð°Ñ Ð²Ñвода длÑEXPLAIN. Ðн Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ Ð·Ð½Ð°Ñениеtext,xml,jsonиyaml. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â text. ÐзмениÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð³ÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели.auto_explain.log_level(enum) #ÐаÑамеÑÑ
auto_explain.log_levelвÑбиÑÐ°ÐµÑ ÑÑовенÑ, Ñ ÐºÐ¾ÑоÑÑм auto_explain бÑÐ´ÐµÑ Ð²ÑводиÑÑ Ð² пÑоÑокол Ð¿Ð»Ð°Ð½Ñ Ð·Ð°Ð¿ÑоÑов. ÐопÑÑÑимÑе знаÑениÑ:DEBUG5,DEBUG4,DEBUG3,DEBUG2,DEBUG1,INFO,NOTICE,WARNINGиLOG. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑLOG. ÐзмениÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð³ÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели.auto_explain.log_nested_statements(boolean) #ÐÑи вклÑÑении паÑамеÑÑа
auto_explain.log_nested_statementsпÑоÑоколиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¿Ð¾Ð´Ð»ÐµÐ¶Ð°ÑÑ Ð¸ вложеннÑе опеÑаÑоÑÑ (опеÑаÑоÑÑ, вÑполнÑемÑе внÑÑÑи ÑÑнкÑии). Ðогда он оÑклÑÑÑн, пÑоÑоколиÑÑÑÑÑÑ Ð¿Ð»Ð°Ð½Ñ Ð·Ð°Ð¿ÑоÑов ÑолÑко веÑÑ Ð½ÐµÐ³Ð¾ ÑÑовнÑ. ÐзмениÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð³ÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели.auto_explain.sample_rate(real) #ÐаÑамеÑÑ
auto_explain.sample_rateзадаÑÑ Ð´Ð»Ñ auto_explain пÑоÑÐµÐ½Ñ Ð¾Ð¿ÐµÑаÑоÑов, коÑоÑÑе бÑдÑÑ Ð¾ÑÑлеживаÑÑÑÑ Ð² каждом ÑеанÑе. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â 1, Ñо еÑÑÑ Ð¾ÑÑлеживаÑÑÑÑ Ð²Ñе запÑоÑÑ. ÐложеннÑе опеÑаÑоÑÑ Ð¾ÑÑлеживаÑÑÑÑ ÑовмеÑÑно â либо вÑе, либо никакой из Ð½Ð¸Ñ . ÐзмениÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð³ÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели.
РобÑÑной ÑиÑÑаÑии ÑÑи паÑамеÑÑÑ ÑÑÑанавливаÑÑÑÑ Ð² postgresql.conf, Ñ
оÑÑ ÑÑпеÑполÑзоваÑели могÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¸Ñ
«на леÑÑ» в ÑамкаÑ
ÑвоиÑ
ÑеанÑов. ТипиÑное иÑ
иÑполÑзование Ð¼Ð¾Ð¶ÐµÑ Ð²ÑглÑдеÑÑ Ñак:
# postgresql.conf session_preload_libraries = 'auto_explain' auto_explain.log_min_duration = '3s'
F.5.2. ÐÑÐ¸Ð¼ÐµÑ #
postgres=# LOAD 'auto_explain';
postgres=# SET auto_explain.log_min_duration = 0;
postgres=# SET auto_explain.log_analyze = true;
postgres=# SELECT count(*)
FROM pg_class, pg_index
WHERE oid = indrelid AND indisunique;Ð ÑезÑлÑÑаÑе ÑÑÐ¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÑÑен Ñакой вÑвод:
LOG: duration: 0.196 ms plan:
Query Text: SELECT count(*)
FROM pg_class, pg_index
WHERE oid = indrelid AND indisunique;
Aggregate (cost=16.79..16.80 rows=1 width=0) (actual time=3.626..3.627 rows=1 loops=1)
-> Hash Join (cost=4.17..16.55 rows=92 width=0) (actual time=3.349..3.594 rows=92 loops=1)
Hash Cond: (pg_class.oid = pg_index.indrelid)
-> Seq Scan on pg_class (cost=0.00..9.55 rows=255 width=4) (actual time=0.016..0.140 rows=255 loops=1)
-> Hash (cost=3.02..3.02 rows=92 width=4) (actual time=3.238..3.238 rows=92 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 4kB
-> Seq Scan on pg_index (cost=0.00..3.02 rows=92 width=4) (actual time=0.008..3.187 rows=92 loops=1)
Filter: indisunique
Planning Time: 0.548 ms
ÐамеÑÑÑе, ÑÑо в Postgres Pro бÑло добавлено новое поле Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ð¸ÑелÑноÑÑи планиÑованиÑ.
F.5.3. ÐвÑоÑÑ #
ТакаÑ
иÑо ÐÑагаки <[email protected]>
Postgres Professional, ÐоÑква, РоÑÑиÑ