F.40. pg_stat_statements
ÐодÑÐ»Ñ pg_stat_statements пÑедоÑÑавлÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¾ÑÑлеживаÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑеÑвеÑом вÑеÑ
опеÑаÑоÑов SQL.
ÐÑÐ¾Ñ Ð¼Ð¾Ð´ÑÐ»Ñ Ð½Ñжно загÑÑжаÑÑ, добавив pg_stat_statements в shared_preload_libraries в Ñайле postgresql.conf, Ñак как ÐµÐ¼Ñ ÑÑебÑеÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑÐ½Ð°Ñ ÑазделÑÐµÐ¼Ð°Ñ Ð¿Ð°Ð¼ÑÑÑ. ÐÑо знаÑиÑ, ÑÑо Ð´Ð»Ñ Ð·Ð°Ð³ÑÑзки или вÑгÑÑзки модÑÐ»Ñ Ð½ÐµÐ¾Ð±Ñ
одимо пеÑезапÑÑÑиÑÑ ÑеÑвеÑ.
Ðогда модÑÐ»Ñ pg_stat_statements загÑÑжаеÑÑÑ, он оÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°ÐµÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ вÑем базам даннÑÑ
на ÑеÑвеÑе. ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¸ обÑабоÑки ÑÑой ÑÑаÑиÑÑики ÑÑÐ¾Ñ Ð¼Ð¾Ð´ÑÐ»Ñ Ð¿ÑедоÑÑавлÑÐµÑ Ð¿ÑедÑÑавление pg_stat_statements и вÑпомогаÑелÑнÑе ÑÑнкÑии pg_stat_statements_reset и pg_stat_statements. ÐÑи обÑекÑÑ Ð½Ðµ доÑÑÑÐ¿Ð½Ñ Ð³Ð»Ð¾Ð±Ð°Ð»Ñно, но иÑ
можно ÑÑÑановиÑÑ Ð² опÑеделÑнной базе даннÑÑ
, вÑполнив ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE EXTENSION pg_stat_statements.
F.40.1. ÐÑедÑÑавление pg_stat_statements
СÑаÑиÑÑика, ÑобиÑÐ°ÐµÐ¼Ð°Ñ Ð¼Ð¾Ð´Ñлем, вÑдаÑÑÑÑ ÑеÑез пÑедÑÑавление Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ pg_stat_statements. ÐÑо пÑедÑÑавление ÑодеÑÐ¶Ð¸Ñ Ð¾ÑделÑнÑе ÑÑÑоки Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ комбинаÑии иденÑиÑикаÑоÑа Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, иденÑиÑикаÑоÑа полÑзоваÑÐµÐ»Ñ Ð¸ иденÑиÑикаÑоÑа запÑоÑа (но в колиÑеÑÑве, не пÑевÑÑаÑÑем макÑималÑное ÑиÑло ÑазлиÑнÑÑ
опеÑаÑоÑов, коÑоÑÑе Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑÑлеживаÑÑ Ð¼Ð¾Ð´ÑлÑ). СÑолбÑÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð² ТаблиÑе F.23.
ТаблиÑа F.23. СÑолбÑÑ pg_stat_statements
| ÐÐ¼Ñ | Тип | СÑÑлки | ÐпиÑание |
|---|---|---|---|
userid | oid | | OID полÑзоваÑелÑ, вÑполнÑвÑего опеÑаÑÐ¾Ñ |
dbid | oid | | OID Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , в коÑоÑой вÑполнÑлÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ |
queryid | bigint |  | ÐнÑÑÑенний Ñ ÐµÑ-код, вÑÑиÑленнÑй по деÑÐµÐ²Ñ ÑазбоÑа опеÑаÑоÑа |
query | text |  | ТекÑÑ, пÑедÑÑавлÑÑÑий опеÑаÑÐ¾Ñ |
calls | bigint |  | ЧиÑло вÑполнений |
total_time | double precision |  | ÐбÑее вÑемÑ, заÑÑаÑенное на опеÑаÑоÑ, в миллиÑекÑÐ½Ð´Ð°Ñ |
min_time | double precision |  | ÐинималÑное вÑемÑ, заÑÑаÑенное на опеÑаÑоÑ, в миллиÑекÑÐ½Ð´Ð°Ñ |
max_time | double precision |  | ÐакÑималÑное вÑемÑ, заÑÑаÑенное на опеÑаÑоÑ, в миллиÑекÑÐ½Ð´Ð°Ñ |
mean_time | double precision |  | СÑеднее вÑемÑ, заÑÑаÑенное на опеÑаÑоÑ, в миллиÑекÑÐ½Ð´Ð°Ñ |
stddev_time | double precision |  | СÑандаÑÑное оÑклонение вÑемени, заÑÑаÑенного на опеÑаÑоÑ, в миллиÑекÑÐ½Ð´Ð°Ñ |
rows | bigint |  | ÐбÑее ÑиÑло ÑÑÑок, полÑÑеннÑÑ Ð¸Ð»Ð¸ заÑÑонÑÑÑÑ Ð¾Ð¿ÐµÑаÑоÑом |
shared_blks_hit | bigint |  | ÐбÑее ÑиÑло попаданий в ÑазделÑемÑй ÐºÐµÑ Ð±Ð»Ð¾ÐºÐ¾Ð² Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ опеÑаÑоÑа |
shared_blks_read | bigint |  | ÐбÑее ÑиÑло ÑÑений ÑазделÑемÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð² Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ опеÑаÑоÑа |
shared_blks_dirtied | bigint |  | ÐбÑее ÑиÑло ÑазделÑемÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð², «загÑÑзнÑннÑÑ Â» даннÑм опеÑаÑоÑом |
shared_blks_written | bigint |  | ÐбÑее ÑиÑло ÑазделÑемÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð², запиÑаннÑÑ Ð´Ð°Ð½Ð½Ñм опеÑаÑоÑом |
local_blks_hit | bigint |  | ÐбÑее ÑиÑло попаданий в локалÑнÑй ÐºÐµÑ Ð±Ð»Ð¾ÐºÐ¾Ð² Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ опеÑаÑоÑа |
local_blks_read | bigint |  | ÐбÑее ÑиÑло ÑÑений локалÑнÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð² Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ опеÑаÑоÑа |
local_blks_dirtied | bigint |  | ÐбÑее ÑиÑло локалÑнÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð², «загÑÑзнÑннÑÑ Â» даннÑм опеÑаÑоÑом |
local_blks_written | bigint |  | ÐбÑее ÑиÑло локалÑнÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð², запиÑаннÑÑ Ð´Ð°Ð½Ð½Ñм опеÑаÑоÑом |
temp_blks_read | bigint |  | ÐбÑее ÑиÑло ÑÑений вÑеменнÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð² Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ опеÑаÑоÑа |
temp_blks_written | bigint |  | ÐбÑее ÑиÑло запиÑей вÑеменнÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð² Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ опеÑаÑоÑа |
blk_read_time | double precision |  | ÐбÑее вÑемÑ, заÑÑаÑенное опеÑаÑоÑом на ÑÑение блоков, в миллиÑекÑÐ½Ð´Ð°Ñ (еÑли вклÑÑÑн track_io_timing, или Ð½Ð¾Ð»Ñ Ð² пÑоÑивном ÑлÑÑае) |
blk_write_time | double precision |  | ÐбÑее вÑемÑ, заÑÑаÑенное опеÑаÑоÑом на запиÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð², в миллиÑекÑÐ½Ð´Ð°Ñ (еÑли вклÑÑÑн track_io_timing, или Ð½Ð¾Ð»Ñ Ð² пÑоÑивном ÑлÑÑае) |
Ðо ÑообÑажениÑм безопаÑноÑÑи обÑÑнÑе полÑзоваÑели не видÑÑ ÑекÑÑ SQL и queryid Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов, вÑполненнÑÑ
дÑÑгими полÑзоваÑелÑми. Ðднако они могÑÑ Ð²Ð¸Ð´ÐµÑÑ ÑÑаÑиÑÑикÑ, еÑли в иÑ
Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
ÑÑÑановлено пÑедÑÑавление.
ÐланиÑÑемÑе запÑоÑÑ (Ñо еÑÑÑ, SELECT, INSERT, UPDATE и DELETE) обÑединÑÑÑÑÑ Ð² Ð¾Ð´Ð½Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð² pg_stat_statements, когда они имеÑÑ Ð¸Ð´ÐµÐ½ÑиÑнÑе ÑÑÑÑкÑÑÑÑ Ð·Ð°Ð¿ÑоÑов ÑоглаÑно внÑÑÑÐµÐ½Ð½ÐµÐ¼Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð½Ð¾Ð¼Ñ Ñ
еÑÑ. ÐбÑÑно два запÑоÑа бÑдÑÑ ÑÑиÑаÑÑÑÑ ÑавнÑми пÑи Ñаком ÑÑавнении, еÑли они ÑеманÑиÑеÑки ÑавнознаÑнÑ, не ÑÑиÑÐ°Ñ Ð·Ð½Ð°Ñений конÑÑанÑ, ÑигÑÑиÑÑÑÑиÑ
в запÑоÑе. Ðднако ÑлÑжебнÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ (Ñо еÑÑÑ Ð²Ñе дÑÑгие командÑ) ÑÑавниваÑÑÑÑ ÑÑÑого по ÑекÑÑовÑм ÑÑÑокам запÑоÑов.
Ðогда знаÑение конÑÑанÑÑ Ð¸Ð³Ð½Ð¾ÑиÑÑеÑÑÑ Ð² ÑелÑÑ
ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа Ñ Ð´ÑÑгими запÑоÑами, ÑÑа конÑÑанÑа заменÑеÑÑÑ Ð² вÑводе pg_stat_statements знаком ?. РоÑÑалÑном ÑÑÐ¾Ñ Ð²Ñвод ÑодеÑÐ¶Ð¸Ñ ÑекÑÑ Ð¿ÐµÑвого запÑоÑа, имеÑÑего опÑеделÑнное знаÑение Ñ
еÑа queryid, ÑвÑзанное Ñ Ð·Ð°Ð¿Ð¸ÑÑÑ Ð² pg_stat_statements.
РнекоÑоÑÑÑ
ÑлÑÑаÑÑ
запÑоÑÑ Ñ Ð²Ð¸Ð·ÑалÑно ÑазлиÑнÑми ÑекÑÑами могÑÑ Ð±ÑÑÑ Ð¾Ð±ÑÐµÐ´Ð¸Ð½ÐµÐ½Ñ Ð² Ð¾Ð´Ð½Ñ Ð·Ð°Ð¿Ð¸ÑÑ pg_stat_statements. ÐбÑÑно ÑÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ ÑолÑко Ð´Ð»Ñ ÑеманÑиÑеÑки ÑавнознаÑнÑÑ
запÑоÑов, но еÑÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑÐ°Ñ Ð²ÐµÑоÑÑноÑÑÑ, ÑÑо из-за наложений Ñ
еÑа неÑвÑзаннÑе запÑоÑÑ Ð¼Ð¾Ð³ÑÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð¾Ð±ÑединÑннÑми в одной запиÑи. (Ðднако ÑÑо невозможно Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов, пÑинадлежаÑиÑ
ÑазнÑм полÑзоваÑелÑм баз даннÑÑ
.)
Так как знаÑение Ñ
еÑа queryid вÑÑиÑлÑеÑÑÑ Ð¿Ð¾ пÑедÑÑавлениÑм запÑоÑа на ÑÑадии поÑле ÑазбоÑа, возможна и обÑаÑÐ½Ð°Ñ ÑиÑÑаÑиÑ: запÑоÑÑ Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñм ÑекÑÑом могÑÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð² ÑазнÑÑ
запиÑÑÑ
, еÑли они полÑÑили ÑазлиÑнÑе пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑазнÑм пÑиÑинам, напÑимеÑ, из-за Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ search_path.
ÐоÑÑебиÑели ÑÑаÑиÑÑики pg_stat_statements могÑÑ Ð¿Ð¾Ð¶ÐµÐ»Ð°ÑÑ Ð¸ÑполÑзоваÑÑ Ð² каÑеÑÑве более ÑÑабилÑного и надÑжного иденÑиÑикаÑоÑа Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ запиÑи не ÑекÑÑ Ð·Ð°Ð¿ÑоÑа, а queryid (возможно, в ÑоÑеÑании Ñ dbid и userid). Ðднако важно понимаÑÑ, ÑÑо ÑÑабилÑноÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ñ
еÑа queryid гаÑанÑиÑÑеÑÑÑ Ñ Ð¾Ð³ÑаниÑениÑми. Так как ÑÑÐ¾Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ð¿Ð¾Ð»ÑÑаеÑÑÑ Ð¸Ð· деÑева запÑоÑа поÑле анализа, его знаÑение бÑдеÑ, помимо пÑоÑего, завиÑеÑÑ Ð¾Ñ Ð²Ð½ÑÑÑенниÑ
иденÑиÑикаÑоÑов обÑекÑов, ÑигÑÑиÑÑÑÑиÑ
в ÑÑом пÑедÑÑавлении. С ÑÑим ÑвÑзано неÑколÑко неинÑÑиÑивнÑÑ
ÑледÑÑвий. ÐапÑимеÑ, pg_stat_statements бÑÐ´ÐµÑ ÑÑиÑаÑÑ Ð´Ð²Ð° одинаково вÑглÑдÑÑиÑ
запÑоÑа ÑазнÑми, еÑли они обÑаÑаÑÑÑÑ Ðº ÑаблиÑе, коÑоÑÐ°Ñ Ð±Ñла Ñдалена, а заÑем воÑÑоздана Ð¼ÐµÐ¶Ð´Ñ ÑÑими запÑоÑами. РезÑлÑÑÐ°Ñ Ñ
еÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñакже ÑÑвÑÑвиÑелен к ÑазлиÑиÑм в маÑинной аÑÑ
иÑекÑÑÑе и дÑÑгим оÑобенноÑÑÑм плаÑÑоÑмÑ. Ðолее Ñого, не ÑÑÐ¾Ð¸Ñ ÑаÑÑÑиÑÑваÑÑ Ð½Ð° Ñо, ÑÑо queryid бÑÐ´ÐµÑ Ð¾ÑÑаваÑÑÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ñм пÑи обновлении оÑновнÑÑ
веÑÑий Postgres Pro.
Ðак пÑавило, знаÑÐµÐ½Ð¸Ñ queryid можно ÑÑиÑаÑÑ Ð½Ð°Ð´ÑжнÑми и ÑÑавнимÑми, ÑолÑко Ñ ÑÑловием, ÑÑо веÑÑÐ¸Ñ ÑеÑвеÑа и деÑали меÑаданнÑÑ
каÑалога неизменнÑ. СледоваÑелÑно, можно ожидаÑÑ, ÑÑо два ÑеÑвеÑа, ÑÑаÑÑвÑÑÑие в ÑепликаÑии на оÑнове воÑпÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑизиÑеÑкого WAL, бÑдÑÑ Ð¸Ð¼ÐµÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñе queryid Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ запÑоÑа. Ðднако ÑÑ
ÐµÐ¼Ñ Ñ Ð»Ð¾Ð³Ð¸ÑеÑкой ÑепликаÑией не гаÑанÑиÑÑÑÑ ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð´ÐµÐ½ÑиÑноÑÑи Ñеплик во вÑеÑ
имеÑÑиÑ
знаÑение деÑалÑÑ
, Ñак ÑÑо queryid не бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñм иденÑиÑикаÑоÑом Ð´Ð»Ñ Ð½Ð°ÐºÐ¾Ð¿Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ñелей ÑÑоимоÑÑи по набоÑÑ Ð»Ð¾Ð³Ð¸ÑеÑкиÑ
Ñеплик. Ð ÑлÑÑае Ñомнений в Ñом или ином подÑ
оде, ÑекомендÑеÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно пÑоÑеÑÑиÑоваÑÑ ÐµÐ³Ð¾.
ТекÑÑ, пÑедÑÑавлÑÑÑий запÑоÑ, ÑоÑ
ÑанÑеÑÑÑ Ð²Ð¾ внеÑнем Ñайле на диÑке и не Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ ÑазделÑемÑÑ Ð¿Ð°Ð¼ÑÑÑ. ÐоÑÑÐ¾Ð¼Ñ Ð´Ð°Ð¶Ðµ оÑÐµÐ½Ñ Ð¾Ð±ÑÑмнÑй ÑекÑÑ Ð·Ð°Ð¿ÑоÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑоÑ
ÑанÑн ÑÑпеÑно. Ðднако еÑли в Ñайле накапливаеÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ длиннÑÑ
ÑекÑÑов запÑоÑов, он Ð¼Ð¾Ð¶ÐµÑ Ð²ÑÑаÑÑи до неÑдобоваÑимого ÑазмеÑа. РкаÑеÑÑве ÑеÑÐµÐ½Ð¸Ñ ÑÑой пÑоблемÑ, pg_stat_statements Ð¼Ð¾Ð¶ÐµÑ ÑеÑиÑÑ ÑÑеÑеÑÑ ÑекÑÑ Ð·Ð°Ð¿ÑоÑов, и в ÑезÑлÑÑаÑе во вÑеÑ
ÑÑÑеÑÑвÑÑÑиÑ
запиÑÑÑ
в пÑедÑÑавлении pg_stat_statements в поле query окажÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ NULL, Ñ
оÑÑ ÑÑаÑиÑÑика, ÑвÑÐ·Ð°Ð½Ð½Ð°Ñ Ñ ÐºÐ°Ð¶Ð´Ñм queryid бÑÐ´ÐµÑ ÑоÑ
Ñанена. ÐÑли ÑÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¸ меÑÐ°ÐµÑ Ð°Ð½Ð°Ð»Ð¸Ð·Ñ, возможно, ÑÑÐ¾Ð¸Ñ ÑменÑÑиÑÑ pg_stat_statements.max Ð´Ð»Ñ Ð¿ÑедоÑвÑаÑÐµÐ½Ð¸Ñ ÑакиÑ
ÑиÑÑаÑий.
F.40.2. ФÑнкÑии
-
pg_stat_statements_reset() returns void ФÑнкÑиÑ
pg_stat_statements_resetоÑиÑÐ°ÐµÑ Ð²ÑÑ ÑÑаÑиÑÑикÑ, ÑобÑаннÑÑ Ðº ÑÑÐ¾Ð¼Ñ Ð²Ñемени модÑлемpg_stat_statements. Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÑ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð³ÑÑ Ð²ÑполнÑÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели.-
pg_stat_statements(showtext boolean) returns setof record ÐÑедÑÑавление
pg_stat_statementsÑеализовано на базе ÑÑнкÑии, коÑоÑÐ°Ñ Ñоже назÑваеÑÑÑpg_stat_statements. ÐлиенÑÑ Ð¼Ð¾Ð³ÑÑ Ð²ÑзÑваÑÑ ÑÑнкÑиÑpg_stat_statementsнепоÑÑедÑÑвенно, и могÑÑ ÑказаÑÑshowtext := falseи полÑÑиÑÑ ÑезÑлÑÑÐ°Ñ Ð±ÐµÐ· ÑекÑÑа запÑоÑа (Ñо еÑÑÑ, вÑÑ Ð¾Ð´Ð½Ð¾Ð¹ аÑгÑÐ¼ÐµÐ½Ñ (OUT), ÑооÑвеÑÑÑвÑÑÑий ÑÑолбÑÑ Ð¿ÑедÑÑавлениÑquery, бÑÐ´ÐµÑ ÑодеÑжаÑÑ NULL). ÐÑа возможноÑÑÑ Ð¿ÑедназнаÑена Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки внеÑÐ½Ð¸Ñ Ð¸Ð½ÑÑÑÑменÑов, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð¶ÐµÐ»Ð°ÑелÑно избежаÑÑ Ð¸Ð·Ð´ÐµÑжек, ÑвÑзаннÑÑ Ñ Ð¿Ð¾Ð»ÑÑением ÑекÑÑов запÑоÑов неопÑеделÑнной длинÑ. Такие инÑÑÑÑменÑÑ Ð¼Ð¾Ð³ÑÑ ÐºÐµÑиÑоваÑÑ ÑекÑÑ Ð¿ÐµÑвого запÑоÑа, коÑоÑÑй они полÑÑÐ°Ñ ÑамоÑÑоÑÑелÑно, как ÑÑо и делаеÑpg_stat_statements, а заÑем запÑаÑиваÑÑ ÑекÑÑÑ Ð·Ð°Ð¿ÑоÑов ÑолÑко пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи. Так как ÑеÑÐ²ÐµÑ ÑÐ¾Ñ ÑанÑÐµÑ ÑекÑÑÑ Ð·Ð°Ð¿ÑоÑов в Ñайле, ÑÑÐ¾Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´ ÑокÑаÑÐ°ÐµÑ Ð¾Ð±ÑÑм ÑизиÑеÑкого ввода/вÑвода, поÑождаемого пÑи поÑÑоÑнном обÑаÑении к даннÑмpg_stat_statements.
F.40.3. ÐаÑамеÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии
pg_stat_statements.max(integer)ÐаÑамеÑÑ
pg_stat_statements.maxзадаÑÑ Ð¼Ð°ÐºÑималÑное ÑиÑло опеÑаÑоÑов, оÑÑлеживаемÑÑ Ð¼Ð¾Ð´Ñлем (Ñо еÑÑÑ, макÑималÑное ÑиÑло ÑÑÑок в пÑедÑÑавленииpg_stat_statements). Ðогда на обÑабоÑÐºÑ Ð¿Ð¾ÑÑÑÐ¿Ð°ÐµÑ Ð±Ð¾Ð»ÑÑе, Ñем заданное ÑиÑло ÑазлиÑнÑÑ Ð¾Ð¿ÐµÑаÑоÑов, инÑоÑмаÑÐ¸Ñ Ð¾ Ñедко вÑполнÑемÑÑ Ð¾Ð¿ÐµÑаÑоÑÐ°Ñ Ð¾ÑбÑаÑÑваеÑÑÑ. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â 5000. ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ задаÑÑ ÑолÑко пÑи запÑÑке ÑеÑвеÑа.pg_stat_statements.track(enum)ÐаÑамеÑÑ
pg_stat_statements.trackопÑеделÑеÑ, какие опеÑаÑоÑÑ Ð±ÑдÑÑ Ð¾ÑÑлеживаÑÑÑÑ Ð¼Ð¾Ð´Ñлем. Со знаÑениемtopоÑÑлеживаÑÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ Ð²ÐµÑÑ Ð½ÐµÐ³Ð¾ ÑÑÐ¾Ð²Ð½Ñ (Ñе, ÑÑо непоÑÑедÑÑвенно вÑполнÑÑÑÑÑ ÐºÐ»Ð¸ÐµÐ½Ñами), Ñо знаÑениемallÑакже оÑÑлеживаÑÑÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе опеÑаÑоÑÑ (напÑимеÑ, опеÑаÑоÑÑ, вÑзÑваемÑе внÑÑÑи ÑÑнкÑий), а знаÑениеnoneполноÑÑÑÑ Ð¾ÑклÑÑÐ°ÐµÑ ÑÐ±Ð¾Ñ ÑÑаÑиÑÑики по опеÑаÑоÑам. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ âtop. ÐзменÑÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð³ÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели.pg_stat_statements.track_utility(boolean)ÐаÑамеÑÑ
pg_stat_statements.track_utilityопÑеделÑеÑ, бÑÐ´ÐµÑ Ð»Ð¸ ÑÑÐ¾Ñ Ð¼Ð¾Ð´ÑÐ»Ñ Ð¾ÑÑлеживаÑÑ ÑлÑжебнÑе командÑ. СлÑжебнÑми командами ÑÑиÑаÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ, оÑлиÑнÑе оÑSELECT,INSERT,UPDATEиDELETE. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ âon(вкл.). ÐзмениÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð³ÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели.pg_stat_statements.save(boolean)ÐаÑамеÑÑ
pg_stat_statements.saveопÑеделÑеÑ, должна ли ÑÑаÑиÑÑика опеÑаÑоÑов ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð¿Ð¾Ñле пеÑезагÑÑзки ÑеÑвеÑа. ÐÑли он оÑклÑÑÑн (Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñениеoff), ÑÑаÑиÑÑика не ÑÐ¾Ñ ÑанÑеÑÑÑ Ð¿Ñи оÑÑановке ÑеÑвеÑа и не пеÑезагÑÑжаеÑÑÑ Ð¿Ñи запÑÑке. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ âon(вкл.). ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ задаÑÑ ÑолÑко вpostgresql.confили в командной ÑÑÑоке ÑеÑвеÑа.
ÐÑÐ¾Ð¼Ñ Ð¼Ð¾Ð´ÑÐ»Ñ ÑÑебÑеÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑÐ½Ð°Ñ ÑазделÑÐµÐ¼Ð°Ñ Ð¿Ð°Ð¼ÑÑÑ Ð² обÑÑме, пÑопоÑÑионалÑном pg_stat_statements.max. ÐамеÑÑÑе, ÑÑо ÑÑа памÑÑÑ Ð±ÑÐ´ÐµÑ Ð·Ð°Ð½ÑÑа пÑи загÑÑзке модÑлÑ, даже еÑли pg_stat_statements.track Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение none.
ÐÑи паÑамеÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð² postgresql.conf. ÐбÑÑное иÑполÑзование вÑглÑÐ´Ð¸Ñ Ñак:
# postgresql.conf shared_preload_libraries = 'pg_stat_statements' pg_stat_statements.max = 10000 pg_stat_statements.track = all
F.40.4. ÐÑÐ¸Ð¼ÐµÑ Ð²Ñвода
bench=# SELECT pg_stat_statements_reset();
$ pgbench -i bench
$ pgbench -c10 -t300 bench
bench=# \x
bench=# SELECT query, calls, total_time, rows, 100.0 * shared_blks_hit /
nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
FROM pg_stat_statements ORDER BY total_time DESC LIMIT 5;
-[ RECORD 1 ]---------------------------------------------------------------------
query | UPDATE pgbench_branches SET bbalance = bbalance + ? WHERE bid = ?;
calls | 3000
total_time | 9609.00100000002
rows | 2836
hit_percent | 99.9778970000200936
-[ RECORD 2 ]---------------------------------------------------------------------
query | UPDATE pgbench_tellers SET tbalance = tbalance + ? WHERE tid = ?;
calls | 3000
total_time | 8015.156
rows | 2990
hit_percent | 99.9731126579631345
-[ RECORD 3 ]---------------------------------------------------------------------
query | copy pgbench_accounts from stdin
calls | 1
total_time | 310.624
rows | 100000
hit_percent | 0.30395136778115501520
-[ RECORD 4 ]---------------------------------------------------------------------
query | UPDATE pgbench_accounts SET abalance = abalance + ? WHERE aid = ?;
calls | 3000
total_time | 271.741999999997
rows | 3000
hit_percent | 93.7968855088209426
-[ RECORD 5 ]---------------------------------------------------------------------
query | alter table pgbench_accounts add primary key (aid)
calls | 1
total_time | 81.42
rows | 0
hit_percent | 34.4947735191637631F.40.5. ÐвÑоÑÑ
ТакаÑ
иÑо ÐÑагаки <itagaki.takahiro@oss.ntt.co.jp>. ÐоÑмализаÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑов добавил ÐиÑÐµÑ Ðейган <peter@2ndquadrant.com>.