F.43. pg_query_state
- F.43.1. ÐбзоÑ
- F.43.2. СÑенаÑии иÑполÑзованиÑ
- F.43.3. УÑÑановка
- F.43.4. ФÑнкÑии
- F.43.5. ÐонÑигÑÑаÑионнÑе паÑамеÑÑÑ
- F.43.6. ÐÑимеÑÑ Ð¸ÑполÑзованиÑ
- F.43.7. ÐÑимеÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑа вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа
- F.43.2. СÑенаÑии иÑполÑзованиÑ
ÐодÑÐ»Ñ pg_query_state даÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑзнаваÑÑ ÑекÑÑее ÑоÑÑоÑние вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов в ÑабоÑаÑÑем обÑлÑживаÑÑем пÑоÑеÑÑе.
F.43.1. ÐбзоÑ
ÐаждÑй обÑÑнÑй (не ÑлÑжебнÑй) опеÑаÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑа (SELECT/INSERT/UPDATE/DELETE) поÑле ÑÑапа опÑимизаÑии/планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÐµÑеводиÑÑÑ Ð² деÑево плана, пÑедÑÑавлÑÑÑего Ñобой Ñвоего Ñода импеÑаÑивное пÑедÑÑавление SQL-запÑоÑа. Ðоманда EXPLAIN ANALYZE позволÑÐµÑ Ð¿ÑоÑмоÑÑеÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð²ÑполнениÑ, ÑобÑаннÑÑ Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñзла ÑÑого деÑева плана (обÑее вÑÐµÐ¼Ñ Ð²ÑполнениÑ, ÑиÑло ÑÑÑок, вÑданнÑÑ Ð²ÐµÑÑ Ð½Ð¸Ñ Ñзлам и Ñ. д.). Ðо ÑÑа ÑÑаÑиÑÑика ÑобиÑаеÑÑÑ ÑолÑко поÑле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа. ÐаннÑй модÑÐ»Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð¿ÑоÑмоÑÑеÑÑ Ð°ÐºÑÑалÑнÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð·Ð°Ð¿ÑоÑа, ÑабоÑаÑÑего во внеÑнем обÑлÑживаÑÑем пÑоÑеÑÑе. ÐÑи ÑÑом ÑоÑÐ¼Ð°Ñ ÑезÑлÑÑиÑÑÑÑего вÑвода пÑакÑиÑеÑки иденÑиÑен вÑÐ²Ð¾Ð´Ñ Ð¾Ð±ÑÑной ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ EXPLAIN ANALYZE. Таким обÑазом, полÑзоваÑели могÑÑ Ð¾ÑÑлеживаÑÑ ÑобÑÑвенно пÑоÑеÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов. РдейÑÑвиÑелÑноÑÑи, ÑÑÐ¾Ñ Ð¼Ð¾Ð´ÑÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑÑледоваÑÑ Ð²Ð½ÐµÑний обÑлÑживаÑÑий пÑоÑеÑÑ Ð¸ опÑеделÑÑÑ ÐµÐ³Ð¾ ÑакÑиÑеÑкое ÑоÑÑоÑние. Ð ÑаÑÑноÑÑи, ÑÑо полезно, когда обÑлÑживаÑÑий пÑоÑеÑÑ Ð²ÑполнÑÐµÑ Ð¾ÑÐµÐ½Ñ ÑложнÑй запÑÐ¾Ñ Ð¸Ð»Ð¸ «завиÑ».
F.43.2. СÑенаÑии иÑполÑзованиÑ
С помоÑÑÑ ÑÑого модÑÐ»Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾:
вÑÑвлÑÑÑ ÑложнÑе запÑоÑÑ (в ÑовокÑпноÑÑи Ñ Ð´ÑÑгими ÑÑедÑÑвами мониÑоÑинга);
наблÑдаÑÑ Ð·Ð° вÑполнением запÑоÑов.
F.43.3. УÑÑановка
ЧÑÐ¾Ð±Ñ ÑÑÑановиÑÑ pg_query_state, вÑполниÑе ÑледÑÑÑие дейÑÑвиÑ:
ÐобавÑÑе Ð¸Ð¼Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеки в паÑамеÑÑ
shared_preload_librariesв конÑигÑÑаÑионном Ñайлеpostgresql.conf:shared_preload_libraries = 'pg_query_state'
ÐеÑезагÑÑзиÑе ÑеÑÐ²ÐµÑ Ð±Ð°Ð· даннÑÑ , ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²ÑÑÑпили в ÑилÑ.
СоздайÑе ÑаÑÑиÑение pg_query_state, вÑполнив ÑледÑÑÑий запÑоÑ:
CREATE EXTENSION pg_query_state;
ЧÑÐ¾Ð±Ñ Ð¾Ð±Ð½Ð¾Ð²Ð¸ÑÑ ÑаÑÑиÑение pg_query_state, вÑполниÑе командÑ
ALTER EXTENSION UPDATE.
F.43.4. ФÑнкÑии
F.43.4.1. pg_query_state
pg_query_state (integer pid,
verbose boolean DEFAULT FALSE,
costs boolean DEFAULT FALSE,
timing boolean DEFAULT FALSE,
buffers boolean DEFAULT FALSE,
triggers boolean DEFAULT FALSE,
format text DEFAULT 'text')
returns TABLE (pid integer,
frame_number integer,
query_text text,
plan text,
leader_pid integer)ÐолÑÑÐ°ÐµÑ Ð¾Ñ Ð¾Ð±ÑлÑживаÑÑего пÑоÑеÑÑа Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм pid ÑоÑÑоÑние ÑекÑÑего запÑоÑа. ÐÑи вÑполнении паÑаллелÑного запÑоÑа Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑождаÑÑÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво паÑаллелÑнÑÑ
запÑоÑов, а пÑи вÑзоваÑ
ÑÑнкÑий обÑазÑÑÑÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе подзапÑоÑÑ, Ñак ÑÑо ÑоÑÑоÑние вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедÑÑавлÑÑÑÑÑ Ð² виде ÑÑека запÑоÑов, поÑÑÐ¾Ð¼Ñ Ð´Ð°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ ÑезÑлÑÑÐ°Ñ Ñипа TABLE (pid integer, frame_number integer, query_text text, plan text, leader_pid integer). Ðн пÑедÑÑавлÑÐµÑ ÑÑÑÑкÑÑÑÑ Ð´ÐµÑева, ÑоÑÑоÑÑего ведÑÑий пÑоÑеÑÑ Ð¸ поÑождÑннÑе им ÑабоÑие пÑоÑеÑÑÑ, иденÑиÑиÑиÑÑемÑе по pid. ÐаждÑй ÑабоÑий пÑоÑеÑÑ ÑÑÑлаеÑÑÑ Ð½Ð° Ñвой ведÑÑий по ÑÑолбÑÑ leader_pid. ÐÐ»Ñ Ð²ÐµÐ´ÑÑего пÑоÑеÑÑа знаÑение ÑÑого ÑÑолбÑа â NULL. СоÑÑоÑние каждого пÑоÑеÑÑа пÑедÑÑавлÑеÑÑÑ Ð² виде ÑÑека вÑзовов ÑÑнкÑий. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ кадÑа ÑÑого ÑÑека ÑÑÑанавливаеÑÑÑ ÑооÑвеÑÑÑвие по ÑÑолбÑам frame_number (Ð½Ð¾Ð¼ÐµÑ ÐºÐ°Ð´Ñа, наÑÐ¸Ð½Ð°Ñ Ñ Ð½ÑлÑ), query_text (ÑекÑÑ Ð·Ð°Ð¿ÑоÑа) и plan (план) Ñо ÑÑолбÑами ÑекÑÑей ÑÑаÑиÑÑики.
Таким обÑазом, полÑзоваÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¸Ð´ÐµÑÑ ÑоÑÑоÑние оÑновного запÑоÑа и запÑоÑов, поÑождÑннÑÑ Ð²Ñзовами ÑÑнкÑии, Ð´Ð»Ñ Ð²ÐµÐ´ÑÑего пÑоÑеÑÑа и вÑÐµÑ ÑабоÑÐ¸Ñ Ð¿ÑоÑеÑÑов, поÑождÑннÑÑ Ð¸Ð¼.
РпÑоÑеÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½ÐµÐºÐ¾ÑоÑÑе ÑÐ·Ð»Ñ Ð¿Ð»Ð°Ð½Ð° могÑÑ Ð¿ÑедÑÑавлÑÑÑ ÑиклÑ. ÐоÑÑÐ¾Ð¼Ñ ÑÑаÑиÑÑика по ÑÐ°ÐºÐ¾Ð¼Ñ ÑÐ·Ð»Ñ ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· двÑÑ ÑаÑÑей: ÑÑеднÑÑ ÑÑаÑиÑÑика по пÑедÑдÑÑим Ñиклам, как в вÑводе EXPLAIN ANALYZE, и ÑÑаÑиÑÑика Ð´Ð»Ñ ÑекÑÑего, еÑÑ Ð½Ðµ законÑенного Ñикла.
ÐеобÑзаÑелÑнÑе аÑгÑменÑÑ:
verbose â иÑполÑзоваÑÑ EXPLAIN VERBOSE Ð´Ð»Ñ Ð²Ñвода плана;
costs â ÑÑоимоÑÑи каждого Ñзла;
timing â вÑводиÑÑ Ð²ÑÐµÐ¼Ñ Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñзла; еÑли ÑÐ±Ð¾Ñ Ð²Ñеменной ÑÑаÑиÑÑики на вÑзÑваемой ÑÑоÑоне оÑклÑÑÑн, в ÑезÑлÑÑаÑе бÑÐ´ÐµÑ Ð²ÑдаваÑÑÑÑ ÐÐ ÐÐУÐÐ ÐÐÐÐÐÐÐ
timing statistics disabled;buffers â вÑводиÑÑ Ð¸ÑполÑзование бÑÑеÑов; еÑли ÑÐ±Ð¾Ñ ÑÑаÑиÑÑики бÑÑеÑов на вÑзÑваемой ÑÑоÑоне оÑклÑÑÑн, в ÑезÑлÑÑаÑе бÑÐ´ÐµÑ Ð²ÑдаваÑÑÑÑ ÐÐ ÐÐУÐÐ ÐÐÐÐÐÐÐ
buffers statistics disabled;triggers â вклÑÑаÑÑ Ð² деÑевÑÑ Ð¿Ð»Ð°Ð½Ð¾Ð² ÑÑаÑиÑÑÐ¸ÐºÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑиггеÑов;
format â задаÑÑ ÑоÑÐ¼Ð°Ñ EXPLAIN Ð´Ð»Ñ Ð²Ñвода планов; возможнÑе знаÑениÑ: text, xml, json и yaml.
ÐÑли вÑзÑваемÑй обÑлÑживаÑÑий пÑоÑеÑÑ Ð½Ðµ вÑполнÑÐµÑ Ð·Ð°Ð¿ÑоÑÑ, Ð´Ð°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð²ÑÐ²Ð¾Ð´Ð¸Ñ ÑообÑение о его ÑоÑÑоÑнии, полÑÑенном из пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ pg_stat_activity, еÑли Ñам еÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ нÑм.
ÐÑзÑваÑÑ ÑÑÑ ÑÑнкÑÐ¸Ñ ÑазÑеÑено ÑолÑко ÑÑпеÑполÑзоваÑелÑм или Ñленам Ñоли, коÑоÑой пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ Ð¾Ð±ÑлÑживаÑÑий пÑоÑеÑÑ. РпÑоÑивном ÑлÑÑае ÑÑнкÑÐ¸Ñ Ð¿ÐµÑаÑÐ°ÐµÑ ÑообÑение permission denied.
F.43.4.2. pg_progress_bar
pg_progress_bar (integer pid) returns FLOAT
ÐозвÑаÑÐ°ÐµÑ ÑекÑÑий пÑогÑеÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа. СнаÑала ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ Ð¾Ñ Ð¾Ð±ÑлÑживаÑÑего пÑоÑеÑÑа Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм pid ÑоÑÑоÑние ÑекÑÑего запÑоÑа. ÐаÑем на оÑновании инÑоÑмаÑии из вÑеÑ
Ñзлов плана она ÑобиÑÐ°ÐµÑ Ð¾Ð±Ñее ÑакÑиÑеÑкое и ожидаемое ÑиÑло ÑÑÑок и вÑÑиÑлÑÐµÑ Ð¸Ñ
ÑооÑноÑение Ð´Ð»Ñ Ð²Ñего деÑева вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа. Ð ÑезÑлÑÑаÑе ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ ÑиÑловое знаÑение в диапазоне Ð¾Ñ 0 до 1. Ðно обознаÑÐ°ÐµÑ Ð¿ÑогÑеÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа.
ФÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ Ð² гÑаÑиÑеÑком инÑеÑÑейÑе Postgres Pro, ÑÑÐ¾Ð±Ñ Ð¾ÑобÑазиÑÑ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑÐ¾Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа.
ÐÑли инÑоÑмаÑÐ¸Ñ Ð¾ ÑекÑÑем ÑоÑÑоÑнии запÑоÑа оÑÑÑÑÑÑвÑÐµÑ Ð¸Ð»Ð¸ вÑÑиÑлиÑÑ Ð¿ÑогÑеÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾, вÑводиÑÑÑ ÑооÑвеÑÑÑвÑÑÑее ÑообÑение.
ÐÑÑ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð³ÑÑ Ð²ÑзÑваÑÑ ÑолÑко ÑÐ»ÐµÐ½Ñ Ñоли, коÑоÑÐ°Ñ Ð²Ð»Ð°Ð´ÐµÐµÑ Ð¾Ð±ÑлÑживаÑÑим пÑоÑеÑÑом, или ÑÑпеÑполÑзоваÑели.
F.43.4.3. pg_progress_bar_visual
pg_progress_bar_visual (integer pid,
integer delay)
returns VOIDЦиклиÑеÑки вÑÑиÑлÑÐµÑ Ð¿ÑогÑеÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа и вÑÐ²Ð¾Ð´Ð¸Ñ ÐµÐ³Ð¾ в ÑекÑÑовом ÑоÑмаÑе. ФÑнкÑÐ¸Ñ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ Ð¾Ñ Ð¾Ð±ÑлÑживаÑÑего пÑоÑеÑÑа Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм pid ÑоÑÑоÑние ÑекÑÑего запÑоÑа ÑеÑез инÑеÑÐ²Ð°Ð»Ñ Ð²Ñемени, опÑеделÑннÑе в паÑамеÑÑе delay (в ÑекÑндаÑ
).
ÐÑа ÑÑнкÑÐ¸Ñ ÑвлÑеÑÑÑ ÑиклиÑеÑким ваÑианÑом ÑÑнкÑии pg_progress_bar, но возвÑаÑÐ°ÐµÑ void. РоÑлиÑие Ð¾Ñ pg_progress_bar, ÑÑнкÑÐ¸Ñ pg_progress_bar_visual можно иÑполÑзоваÑÑ, ÑÑÐ¾Ð±Ñ Ð¾ÑÑлеживаÑÑ Ð¿ÑогÑеÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа без гÑаÑиÑеÑкого инÑеÑÑейÑа.
ÐÑли инÑоÑмаÑÐ¸Ñ Ð¾ ÑекÑÑем ÑоÑÑоÑнии запÑоÑа оÑÑÑÑÑÑвÑÐµÑ Ð¸Ð»Ð¸ вÑÑиÑлиÑÑ Ð¿ÑогÑеÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾, вÑводиÑÑÑ ÑооÑвеÑÑÑвÑÑÑее ÑообÑение.
ÐÑÑ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð³ÑÑ Ð²ÑзÑваÑÑ ÑолÑко ÑÐ»ÐµÐ½Ñ Ñоли, коÑоÑÐ°Ñ Ð²Ð»Ð°Ð´ÐµÐµÑ Ð¾Ð±ÑлÑживаÑÑим пÑоÑеÑÑом, или ÑÑпеÑполÑзоваÑели.
F.43.5. ÐонÑигÑÑаÑионнÑе паÑамеÑÑÑ
ÐÐ»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñем модÑлем и ÑбоÑа опÑеделÑннÑÑ ÑÑаÑиÑÑиÑеÑÐºÐ¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ñелей в пÑоÑеÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа доÑÑÑпен Ñакже Ð½Ð°Ð±Ð¾Ñ Ð´Ð¾ÑÑÑпнÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¿ÐµÑеменнÑÑ GUC:
pg_query_state.enable â оÑклÑÑиÑÑ (или вклÑÑиÑÑ) pg_query_state полноÑÑÑÑ, знаÑение по ÑмолÑаниÑ:
truepg_query_state.enable_timing â ÑобиÑаÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð²Ñемени по ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ ÑзлÑ, знаÑение по ÑмолÑаниÑ:
falsepg_query_state.enable_buffers â ÑобиÑаÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±ÑÑеÑов; знаÑение по ÑмолÑаниÑ:
false
ÐÑи паÑамеÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑÑанавливаÑÑÑÑ Ð½Ð° вÑзÑваемой ÑÑоÑоне до вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов, ÑÑаÑиÑÑика коÑоÑÑÑ
пÑедÑÑавлÑÐµÑ Ð¸Ð½ÑеÑеÑ. ÐÑли паÑамеÑÑ pg_query_state.enable_timing оÑклÑÑÑн, вÑзÑваÑÑÐ°Ñ ÑÑоÑона не Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑаÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ вÑемени и вÑдаÑÑÑÑ ÐÐ ÐÐУÐÐ ÐÐÐÐÐÐÐ; аналогиÑно Ñ Ð¿Ð°ÑамеÑÑом pg_query_state.enable_buffers.
F.43.6. ÐÑимеÑÑ Ð¸ÑполÑзованиÑ
УÑÑановиÑÑ Ð¼Ð°ÐºÑималÑное ÑиÑло паÑаллелÑнÑÑ
иÑполниÑелей Ð´Ð»Ñ Ñзла Gather ÑавнÑм 2:
postgres=# set max_parallel_workers_per_gather = 2;
ÐÑедположим, ÑÑо один обÑлÑживаÑÑий пÑоÑеÑÑ Ñ pid = 49265 вÑполнÑÐµÑ Ð¿ÑоÑÑой запÑоÑ:
postgres=# select pg_backend_pid();
pg_backend_pid
----------------
49265
(1 row)
postgres=# select count(*) from foo join bar on foo.c1=bar.c1;
ÐÑÑгие обÑлÑживаÑÑие пÑоÑеÑÑÑ Ð¼Ð¾Ð³ÑÑ Ð¸Ð·Ð²Ð»ÐµÐºÐ°ÑÑ Ð¿ÑомежÑÑоÑное ÑоÑÑоÑние о вÑполнении ÑÑого запÑоÑа:
postgres=# \x
postgres=# select * from pg_query_state(49265);
-[ RECORD 1 ]+-------------------------------------------------------------------------------------------------------------------------
pid | 49265
frame_number | 0
query_text | select count(*) from foo join bar on foo.c1=bar.c1;
plan | Finalize Aggregate (Current loop: actual rows=0, loop number=1) +
| -> Gather (Current loop: actual rows=0, loop number=1) +
| Workers Planned: 2 +
| Workers Launched: 2 +
| -> Partial Aggregate (Current loop: actual rows=0, loop number=1) +
| -> Nested Loop (Current loop: actual rows=12, loop number=1) +
| Join Filter: (foo.c1 = bar.c1) +
| Rows Removed by Join Filter: 5673232 +
| -> Parallel Seq Scan on foo (Current loop: actual rows=12, loop number=1) +
| -> Seq Scan on bar (actual rows=500000 loops=11) (Current loop: actual rows=173244, loop number=12)
leader_pid | (null)
-[ RECORD 2 ]+-------------------------------------------------------------------------------------------------------------------------
pid | 49324
frame_number | 0
query_text | <parallel query>
plan | Partial Aggregate (Current loop: actual rows=0, loop number=1) +
| -> Nested Loop (Current loop: actual rows=10, loop number=1) +
| Join Filter: (foo.c1 = bar.c1) +
| Rows Removed by Join Filter: 4896779 +
| -> Parallel Seq Scan on foo (Current loop: actual rows=10, loop number=1) +
| -> Seq Scan on bar (actual rows=500000 loops=9) (Current loop: actual rows=396789, loop number=10)
leader_pid | 49265
-[ RECORD 3 ]+-------------------------------------------------------------------------------------------------------------------------
pid | 49323
frame_number | 0
query_text | <parallel query>
plan | Partial Aggregate (Current loop: actual rows=0, loop number=1) +
| -> Nested Loop (Current loop: actual rows=11, loop number=1) +
| Join Filter: (foo.c1 = bar.c1) +
| Rows Removed by Join Filter: 5268783 +
| -> Parallel Seq Scan on foo (Current loop: actual rows=11, loop number=1) +
| -> Seq Scan on bar (actual rows=500000 loops=10) (Current loop: actual rows=268794, loop number=11)
leader_pid | 49265
Рпоказанном вÑÑе пÑимеÑе обÑлÑживаÑÑий пÑоÑеÑÑ Ð¿Ð¾ÑÐ¾Ð¶Ð´Ð°ÐµÑ Ð´Ð²Ð° паÑаллелÑнÑÑ
ÑабоÑиÑ
пÑоÑеÑÑа Ñ PID 49324 и 49323. ÐÑ
знаÑÐµÐ½Ð¸Ñ ÑÑолбÑа leader_pid показÑваÑÑ, ÑÑо ÑÑи ÑабоÑие пÑоÑеÑÑÑ Ð¾ÑноÑÑÑÑÑ Ðº оÑновном ведÑÑемÑ. Узел Seq Scan показÑÐ²Ð°ÐµÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ вÑполненнÑм Ñиклам (показÑваеÑÑÑ ÑÑеднее ÑиÑло ÑÑÑок, пеÑеданное ÑÐ·Ð»Ñ Nested Loop, и ÑиÑло вÑполненнÑÑ
Ñиклов) и ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ ÑекÑÑÐµÐ¼Ñ ÑзлÑ. ÐÑÑгие ÑÐ·Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·ÑваÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ ÑолÑко по ÑекÑÑÐµÐ¼Ñ ÑиклÑ, Ñак как ÑÑо пеÑÐ²Ð°Ñ Ð¸ÑеÑаÑÐ¸Ñ (Ð½Ð¾Ð¼ÐµÑ Ñикла = 1).
ÐÑедположим, ÑÑо пеÑвÑй обÑлÑживаÑÑий пÑоÑеÑÑ Ð²ÑполнÑÐµÑ Ð½ÐµÐºÐ¾ÑоÑÑÑ ÑÑнкÑиÑ:
postgres=# select n_join_foo_bar();
ÐÑÑгой пÑоÑеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ ÑакÑÑ Ð¸Ð½ÑоÑмаÑиÑ:
postgres=# select * from pg_query_state(49265);
-[ RECORD 1 ]+------------------------------------------------------------------------------------------------------------------
pid | 49265
frame_number | 0
query_text | select n_join_foo_bar();
plan | Result (Current loop: actual rows=0, loop number=1)
leader_pid | (null)
-[ RECORD 2 ]+------------------------------------------------------------------------------------------------------------------
pid | 49265
frame_number | 1
query_text | SELECT (select count(*) from foo join bar on foo.c1=bar.c1)
plan | Result (Current loop: actual rows=0, loop number=1) +
| InitPlan 1 (returns $0) +
| -> Aggregate (Current loop: actual rows=0, loop number=1) +
| -> Nested Loop (Current loop: actual rows=51, loop number=1) +
| Join Filter: (foo.c1 = bar.c1) +
| Rows Removed by Join Filter: 51636304 +
| -> Seq Scan on bar (Current loop: actual rows=52, loop number=1) +
| -> Materialize (actual rows=1000000 loops=51) (Current loop: actual rows=636355, loop number=52)+
| -> Seq Scan on foo (Current loop: actual rows=1000000, loop number=1)
leader_pid | (null)
ÐеÑÐ²Ð°Ñ ÑÑÑока ÑооÑвеÑÑÑвÑÐµÑ Ð²ÑÐ·Ð¾Ð²Ñ ÑÑнкÑии, вÑоÑÐ°Ñ â запÑоÑÑ, ÑодеÑжаÑемÑÑÑ Ð² Ñеле ÑÑой ÑÑнкÑии.
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ полÑÑаÑÑ ÑезÑлÑÑиÑÑÑÑие Ð¿Ð»Ð°Ð½Ñ Ð² ÑазлиÑнÑÑ ÑоÑмаÑÐ°Ñ (напÑимеÑ, в json):
postgres=# select * from pg_query_state(pid := 49265, format := 'json');
-[ RECORD 1 ]+------------------------------------------------------------
pid | 49265
frame_number | 0
query_text | select * from n_join_foo_bar();
plan | { +
| "Plan": { +
| "Node Type": "Function Scan", +
| "Parallel Aware": false, +
| "Function Name": "n_join_foo_bar", +
| "Alias": "n_join_foo_bar", +
| "Current loop": { +
| "Actual Loop Number": 1, +
| "Actual Rows": 0 +
| } +
| } +
| }
leader_pid | (null)
-[ RECORD 2 ]+------------------------------------------------------------
pid | 49265
frame_number | 1
query_text | SELECT (select count(*) from foo join bar on foo.c1=bar.c1)
plan | { +
| "Plan": { +
| "Node Type": "Result", +
| "Parallel Aware": false, +
| "Current loop": { +
| "Actual Loop Number": 1, +
| "Actual Rows": 0 +
| }, +
| "Plans": [ +
| { +
| "Node Type": "Aggregate", +
| "Strategy": "Plain", +
| "Partial Mode": "Simple", +
| "Parent Relationship": "InitPlan", +
| "Subplan Name": "InitPlan 1 (returns $0)", +
| "Parallel Aware": false, +
| "Current loop": { +
| "Actual Loop Number": 1, +
| "Actual Rows": 0 +
| }, +
| "Plans": [ +
| { +
| "Node Type": "Nested Loop", +
| "Parent Relationship": "Outer", +
| "Parallel Aware": false, +
| "Join Type": "Inner", +
| "Current loop": { +
| "Actual Loop Number": 1, +
| "Actual Rows": 610 +
| }, +
| "Join Filter": "(foo.c1 = bar.c1)", +
| "Rows Removed by Join Filter": 610072944, +
| "Plans": [ +
| { +
| "Node Type": "Seq Scan", +
| "Parent Relationship": "Outer", +
| "Parallel Aware": false, +
| "Relation Name": "bar", +
| "Alias": "bar", +
| "Current loop": { +
| "Actual Loop Number": 1, +
| "Actual Rows": 611 +
| } +
| }, +
| { +
| "Node Type": "Materialize", +
| "Parent Relationship": "Inner", +
| "Parallel Aware": false, +
| "Actual Rows": 1000000, +
| "Actual Loops": 610, +
| "Current loop": { +
| "Actual Loop Number": 611, +
| "Actual Rows": 73554 +
| }, +
| "Plans": [ +
| { +
| "Node Type": "Seq Scan", +
| "Parent Relationship": "Outer", +
| "Parallel Aware": false, +
| "Relation Name": "foo", +
| "Alias": "foo", +
| "Current loop": { +
| "Actual Loop Number": 1, +
| "Actual Rows": 1000000 +
| } +
| } +
| ] +
| } +
| ] +
| } +
| ] +
| } +
| ] +
| } +
| }
leader_pid | (null)
F.43.7. ÐÑимеÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑа вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа
ÐеÑвÑй обÑлÑживаÑÑий пÑоÑеÑÑ Ð²ÑполнÑÐµÑ ÑледÑÑÑий запÑоÑ:
postgres=# INSERT INTO table_name SELECT generate_series(1,10000000);
С помоÑÑÑ Ð´ÑÑгого обÑлÑживаÑÑего пÑоÑеÑÑа можно пÑовеÑиÑÑ Ð¿ÑогÑеÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑого запÑоÑа:
postgres=# SELECT pid FROM pg_stat_activity WHERE query LIKE 'insert%';
pid
-------
23877
(1 row)
postgres=# SELECT pg_progress_bar(23877);
pg_progress_bar
-----------------
0.6087927
(1 row)ЧÑÐ¾Ð±Ñ Ð²Ð¸Ð·ÑалÑно оÑÑлеживаÑÑ Ð¿ÑогÑеÑÑ Ð²ÑполнениÑ, вÑполниÑе ÑледÑÑÑий запÑоÑ:
postgres=# SELECT pg_progress_bar_visual(23877, 1);
Progress = 0.043510
Progress = 0.085242
Progress = 0.124921
Progress = 0.168168
Progress = 0.213803
Progress = 0.250362
Progress = 0.292632
Progress = 0.331454
Progress = 0.367509
Progress = 0.407450
Progress = 0.448646
Progress = 0.488171
Progress = 0.530559
Progress = 0.565558
Progress = 0.608039
Progress = 0.645778
Progress = 0.654842
Progress = 0.699006
Progress = 0.735760
Progress = 0.787641
Progress = 0.832160
Progress = 0.871077
Progress = 0.911858
Progress = 0.956362
Progress = 0.995097
Progress = 1.000000
pg_progress_bar_visual
------------------------
1
(1 row)