Как сопоставить запросы в pg_stat_statements с запросами в журнале из расширения auto_explain? - PullRequest
0 голосов
/ 06 марта 2020

Я использую 2 источника информации о производительности моих запросов: pg_stat_statements таблица и файл журнала с выводом с расширением auto_explain. Таблица pg_stat_statements имеет столбец queryid (некоторые га sh), который выглядит следующим образом:

postgres=# select queryid from pg_stat_statements;
       queryid        
----------------------
  1809546128015582813
  3296564334073921976
 -2249120274633451873
 -4210932522978766496
 -7924989344813642498
 -5969017373161620754
 -3085278641555168774
 -4062271456003967982
  5649680170374315937
...

И журнал содержит выходные данные из расширения auto_explain, которое выглядит следующим образом:

...
2020-02-21 13:57:17.132 UTC [postgres postgres 127.0.0.1(59706)] LOG:  duration: 0.744 ms  plan:
    Query Text: DECLARE temp1 NO SCROLL CURSOR FOR select * from city
    Seq Scan on public.city  (cost=0.00..72.79 rows=4079 width=31) (actual time=0.016..0.475 rows=4079 loops=1)
      Output: id, name, countrycode, district, population
2020-02-21 13:57:17.355 UTC [postgres postgres 127.0.0.1(59706)] LOG:  duration: 2.447 ms  plan:
    Query Text: select * from city
    Seq Scan on public.city  (cost=0.00..72.79 rows=4079 width=31) (actual time=0.008..0.380 rows=4079 loops=1)
      Output: id, name, countrycode, district, population
...

Теперь я хочу сопоставить запросы из pg_stat_statements с запросами в журнале. Очевидно, что критерии могут быть queryid - уникальным идентификатором (га sh) запроса, но в этом подходе есть 3 проблемы:

  1. Запросы в pg_stat_statements могут выглядеть как select * from city where name = $1 и в журнале, как select * from city where name = 'Béjaïa'
  2. В журнале нет никаких данных queryid.
  3. Нет никаких гарантий относительно пробелов, регистра и аналогичных форм ...

Можно ли как-то сопоставить их? Может быть, Postgres имеет такую ​​функцию, как pg_get_queryid_from_query_sql(the_sql)? Возможно ли это вообще?

Ответы [ 2 ]

1 голос
/ 08 марта 2020

Невозможно сделать это с помощью встроенных функций Postgres, но вы можете сделать это с помощью некоторых сценариев и последующей обработки данных.

Одним из способов достижения этого является использование pg_query библиотека, которая эффективно извлекает синтаксический анализатор Postgres, чтобы иметь возможность работать вне сервера. Затем вы можете использовать механизм отпечатков пальцев для сопоставления запросов. Отпечатки пальцев основаны на AST запроса и игнорируют пробелы / форматирование / параметризацию.

Пример:

require "pg_query"

# This would be the "query" field from pg_stat_statements
PgQuery.parse("select * from city where x = $1").fingerprint
=> "0271d348571e386f82a922b54a01e6ef9205a8f2fe"

# This would be the "Query Text" field from auto_explain
PgQuery.parse("SELECT * FROM city WHERE x = 123").fingerprint
=> "0271d348571e386f82a922b54a01e6ef9205a8f2fe"

Отказ от ответственности: я являюсь основным автором pg_query, и мы недавно создали аналогичная система в pganalyze .

1 голос
/ 06 марта 2020

Я не думаю, что сопоставление queryid pg_stat_statements с выводом auto_explain является в настоящее время возможным, потому что - насколько я понимаю - queryid вычисляется только в расширении pg_stat_statements. Однако другое расширение pg_sampletolog позволяет в некоторых случаях иметь queryid в журнале PG (но не как вывод auto_explain).

UPDATE 01-APR-2020 Я разработал расширение PostgreSQL для этого имени pg_logqueryid

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...