Статистика запросов

Документ описывает развертывание, структуру таблиц, использование, настройку и отключение функции статистики запросов YMatrix. При обнаружении медленных запросов к базе данных или при необходимости более эффективного планирования использования ресурсов базы данных вы можете использовать эту функцию для оптимизации.

Функция статистики запросов mxstat включает:

  • Детали выполнения SQL-запросов, такие как продолжительность запроса.
  • Статистику по потреблению вычислительных ресурсов.

Включение статистики запросов

После инициализации кластера YMatrix база данных matrixmgr и расширение matrixmgr создаются по умолчанию, и эта функция включена по умолчанию.

Для ручного включения функции выполните следующие команды:

=# createdb matrixmgr
=# psql -d matrixmgr
matrixmgr=# CREATE EXTENSION matrixmgr CASCADE;
NOTICE:  installing required extension "matrixts"
CREATE EXTENSION

Доступные представления

После успешного развертывания в базе данных matrixmgr в схеме matrixmgr_internal появляются следующие таблицы и представления:

Представление Описание
mxstat_execute Предоставляет детали выполнения SQL-запросов, такие как экземпляр сегмента, на котором выполнялся запрос, пользователь, текст запроса, минимальное и максимальное время выполнения, а также временные метки для каждой фазы самого медленного выполнения. Используйте это представление для анализа времени выполнения различных SQL-запросов и изучения самых медленных запросов.
mxstat_usage Предоставляет статистику по потреблению вычислительных ресурсов во время выполнения SQL-запросов.
mx_query_execute_history Исторические данные из представления mxstat_execute.
mx_query_usage_history Исторические данные из представления mxstat_usage.
mx_querytext Хранит сопоставление между queryid и query. Используйте это сопоставление для получения исходного текста SQL-запроса.
mx_query_execute_history_with_text Объединенное представление mx_query_execute_history и mx_querytext с использованием queryid.

Подробную информацию о каждом представлении см. в разделе Расширение matrixmgr.

Примеры

Следующие три примера демонстрируют поэтапный анализ выполнения SQL-запросов и связанного с ними потребления ресурсов.

Пример 1

  1. Выполните следующие три SQL-запроса, чтобы приостановить процесс сервера базы данных на 5, 10 и 15 секунд соответственно:
=# SELECT pg_sleep(5);
=# SELECT pg_sleep(10);
=# SELECT pg_sleep(15);
  1. Запросите статистику из представления mxstat_execute. Результаты показывают:
  • Записаны временные метки начала (sample_start) и окончания (sample_exec_end) запроса.
  • Запрос был вызван 3 раза.
  • Текст запроса нормализован: параметры времени заменены на $1.
  • На основе временных меток самого медленного выполнения наблюдается 15-секундный интервал между последовательными запросами, что соответствует значению pg_sleep.
matrixmgr=# SELECT * FROM matrixmgr_internal.mxstat_execute WHERE query LIKE '%pg_sleep%';
 seg | userid | dbid  |       queryid        | nestlevel |        query        | calls_begin | calls_alive | calls_end | total_time | min_time
| max_time  |     mean_time      |    stddev_time    |    sample_planid     |         sample_start          |       sample_parse_done       |
     sample_plan_done        |       sample_exec_start       |        sample_exec_end
-----+--------+-------+----------------------+-----------+---------------------+-------------+-------------+-----------+------------+----------
+-----------+--------------------+-------------------+----------------------+-------------------------------+-------------------------------+--
-----------------------------+-------------------------------+-------------------------------
  -1 |     10 | 16384 | -2007749946425010549 |         0 | select pg_sleep($1) |           3 |           0 |         3 |      30041 | 5009.054
| 15018.717 | 10013.666666666666 | 4086.427819588182 | -2693056513545111817 | 2022-03-25 13:58:58.503851-04 | 2022-03-25 13:58:58.503933-04 | 2
022-03-25 13:58:58.503994-04 | 2022-03-25 13:58:58.504008-04 | 2022-03-25 13:59:13.522725-04
(1 row)
  1. Выполните соединение с помощью queryid и запросите mxstat_usage, чтобы просмотреть использование ресурсов. Результат показывает только одну запись с seg = -1, что указывает на то, что запрос выполнился только на Master.
matrixmgr=# SELECT * FROM matrixmgr_internal.mxstat_usage WHERE queryid = -2007749946425010549;
 seg | userid | dbid  |       queryid        | nestlevel | rows | shared_blks_hit | shared_blks_read | shared_blks_dirtied | shared_blks_writte
n | local_blks_hit | local_blks_read | local_blks_dirtied | local_blks_written | temp_blks_read | temp_blks_written | blk_read_time | blk_write
_time | ru_utime | ru_stime | ru_maxrss | ru_ixrss | ru_idrss | ru_isrss | ru_minflt | ru_majflt | ru_nswap | ru_inblock | ru_oublock | ru_msgs
nd | ru_msgrcv | ru_nsignals | ru_nvcsw | ru_nivcsw
-----+--------+-------+----------------------+-----------+------+-----------------+------------------+---------------------+-------------------
--+----------------+-----------------+--------------------+--------------------+----------------+-------------------+---------------+----------
------+----------+----------+-----------+----------+----------+----------+-----------+-----------+----------+------------+------------+--------
---+-----------+-------------+----------+-----------
  -1 |     10 | 16384 | -2007749946425010549 |         0 |    3 |               0 |                0 |                   0 |
0 |              0 |               0 |                  0 |                  0 |              0 |                 0 |             0 |
    0 | 0.001297 | 0.000431 |     20568 |        0 |        0 |        0 |         6 |         0 |        0 |          0 |          0 |
 0 |         0 |           0 |      122 |         0
(1 row)

Пример 2

  1. Создайте таблицу с именем test1 с помощью следующей команды:
=# CREATE TABLE test1(
  c1 int,
  c2 int
  )
  USING MARS3
  DISTRIBUTED BY(c1)
  ORDER BY(c1);
  1. Запросите статистику из mxstat_execute:
matrixmgr=# SELECT * FROM matrixmgr_internal.mxstat_execute WHERE query LIKE '%create table test1%';
 seg | userid | dbid  |       queryid        | nestlevel |                         query                         | calls_begin | calls_alive |
calls_end | total_time | min_time | max_time | mean_time | stddev_time | sample_planid |         sample_start          | sample_parse_done | sa
mple_plan_done |       sample_exec_start       |        sample_exec_end
-----+--------+-------+----------------------+-----------+-------------------------------------------------------+-------------+-------------+-
----------+------------+----------+----------+-----------+-------------+---------------+-------------------------------+-------------------+---
---------------+-------------------------------+-------------------------------
  -1 |     10 | 16384 | -6276724884379903029 |         0 | create table test1(c1 int, c2 int) distributed by(c1) |           1 |           0 |
        1 |     46.221 |   46.221 |   46.221 |    46.221 |           0 |             0 | 2022-03-25 14:08:51.754458-04 |                   |
               | 2022-03-25 14:08:51.754735-04 | 2022-03-25 14:08:51.800956-04
(1 row)
  1. Выполните соединение с помощью queryid и запросите mxstat_usage, чтобы просмотреть использование ресурсов. Результаты показывают записи со всех сегментов, что указывает на то, что данные распределены между несколькими экземплярами MXSegment.
matrixmgr=# SELECT * FROM matrixmgr_internal.mxstat_usage WHERE queryid = -6276724884379903029;
 seg | userid | dbid  |       queryid        | nestlevel | rows | shared_blks_hit | shared_blks_read | shared_blks_dirtied | shared_blks_writte
n | local_blks_hit | local_blks_read | local_blks_dirtied | local_blks_written | temp_blks_read | temp_blks_written | blk_read_time | blk_write
_time | ru_utime | ru_stime | ru_maxrss | ru_ixrss | ru_idrss | ru_isrss | ru_minflt | ru_majflt | ru_nswap | ru_inblock | ru_oublock | ru_msgs
nd | ru_msgrcv | ru_nsignals | ru_nvcsw | ru_nivcsw
-----+--------+-------+----------------------+-----------+------+-----------------+------------------+---------------------+-------------------
--+----------------+-----------------+--------------------+--------------------+----------------+-------------------+---------------+----------
------+----------+----------+-----------+----------+----------+----------+-----------+-----------+----------+------------+------------+--------
---+-----------+-------------+----------+-----------
  -1 |     10 | 16384 | -6276724884379903029 |         0 |    0 |             295 |               59 |                  21 |
0 |              0 |               0 |                  0 |                  0 |              0 |                 0 |             0 |
    0 | 0.004053 |        0 |     22744 |        0 |        0 |        0 |       429 |         0 |        0 |          0 |          0 |
 0 |         0 |           0 |        6 |         0
   1 |     10 | 16384 | -6276724884379903029 |         0 |    0 |             261 |               82 |                  19 |
0 |              0 |               0 |                  0 |                  0 |              0 |                 0 |             0 |
    0 | 0.001691 | 0.001558 |     19284 |        0 |        0 |        0 |       510 |         0 |        0 |          0 |          0 |
 0 |         0 |           0 |        0 |         1
   0 |     10 | 16384 | -6276724884379903029 |         0 |    0 |             314 |               34 |                  19 |
0 |              0 |               0 |                  0 |                  0 |              0 |                 0 |             0 |
    0 | 0.002537 | 0.000193 |     18508 |        0 |        0 |        0 |       574 |         0 |        0 |          0 |          0 |
 0 |         0 |           0 |        1 |         1
   2 |     10 | 16384 | -6276724884379903029 |         0 |    0 |             261 |               82 |                  19 |
0 |              0 |               0 |                  0 |                  0 |              0 |                 0 |             0 |
    0 | 0.003043 |  2.9e-05 |     19292 |        0 |        0 |        0 |       514 |         0 |        0 |          0 |          0 |
 0 |         0 |           0 |        0 |         2
(4 rows)

Пример 3

В примерах 1 и 2 значение nestlevel в mxstat_execute равно 0, поскольку не было вложенного выполнения. Следующий пример демонстрирует вложенное выполнение, которое обычно достигается путем вызова пользовательской функции (UDF).

  1. Создайте UDF с именем nest_query, определяющую SQL-запрос SELECT 1;, а затем вызовите ее:
=# CREATE OR REPLACE FUNCTION nest_query() RETURNS SETOF RECORD
AS $$ SELECT 1;$$
LANGUAGE SQL;

Примечание!
По умолчанию mxstat не записывает информацию о вложенном выполнении. Необходимо установить параметр mxstat_statements.track в значение all.

  1. Запросите детали выполнения внутреннего запроса SELECT $1. Результаты показывают:
  • Нормализованный текст запроса — SELECT $1, поскольку константы, такие как 1, заменены на заполнители параметров.
  • Значение nestlevel равно 1, что указывает на один уровень вложенности. Более глубокая вложенность увеличивает это значение; matrixmgr записывает данные до уровня 31.
matrixmgr=# SELECT * FROM matrixmgr_internal.mxstat_execute WHERE query LIKE '%SELECT $1%';
 seg | userid | dbid  |       queryid        | nestlevel |   query   | calls_begin | calls_alive | calls_end | total_time | min_time | max_time
 | mean_time | stddev_time |    sample_planid    |         sample_start          |       sample_parse_done       |       sample_plan_done
  |       sample_exec_start       |        sample_exec_end
-----+--------+-------+----------------------+-----------+-----------+-------------+-------------+-----------+------------+----------+---------
-+-----------+-------------+---------------------+-------------------------------+-------------------------------+-----------------------------
--+-------------------------------+-------------------------------
  -1 |     10 | 16384 | -4554727679305370053 |         1 | SELECT $1 |           1 |           0 |         1 |      0.031 |    0.031 |    0.031
 |     0.031 |           0 | -382705668420232707 | 2022-03-25 14:35:30.668124-04 | 2022-03-25 14:35:30.668373-04 | 2022-03-25 14:35:30.668403-0
4 | 2022-03-25 14:35:30.668408-04 | 2022-03-25 14:35:30.668439-04
(1 row)

Отключение статистики запросов

Примечание!
Отключение статистики запросов не требует остановки или перезапуска базы данных.

  1. Остановите фоновый сборщик на Master:
$ psql -d matrixmgr -c "SELECT matrixmgr_internal.mxstat_stop_worker();"
  1. Глобально отключите сбор и примените изменения:
$ gpconfig -s mxstat_statements.track 
$ gpconfig -c mxstat_statements.track -v none
$ mxstop -u

Примечание!
Эти два шага временно отключают функцию. Она будет снова включена по умолчанию после перезапуска кластера. Чтобы отключить ее постоянно, выполните DROP EXTENSION после вышеуказанных шагов.

  1. Очистите уже собранные данные:
$ psql -d matrixmgr -c "SELECT matrixmgr_internal.mxstat_reset();"
  1. (Опционально) Перезапустите фоновый сборщик:
$ psql -d matrixmgr -c "SELECT matrixmgr_internal.mxstat_start_worker();"

Приложение

Классификация запросов

matrixmgr не записывает каждый отдельный запрос. Вместо этого он агрегирует похожие запросы и представляет статистику на основе проанализированных результатов.

Объединяются только запросы, отличающиеся параметрами. Например, следующие три INSERT запроса вставляют данные в таблицу test1 с разными значениями. Они объединяются в один класс и используют одинаковый queryid.

=# INSERT INTO test1 VALUES(1);
=# INSERT INTO test1 VALUES(2);
=# INSERT INTO test1 VALUES(3);

Следующие запросы отличаются только условными значениями и также объединяются:

=# SELECT * FROM test1 WHERE c1 = 1;
=# SELECT * FROM test1 WHERE c1 = 2;
=# SELECT * FROM test1 WHERE c1 = 3;

Следующие запросы, хотя и похожи, обращаются к разным таблицам и не объединяются:

=# SELECT * FROM test1 WHERE c1 = 1;
=# SELECT * FROM test2 WHERE c1 = 1;
=# SELECT * FROM test3 WHERE c1 = 1;

Настройка

Функция статистики запросов включает следующие параметры для управления поведением мониторинга.

Параметр Тип Описание
mxstat_statements.max Целое число Количество хеш-слотов для хранения данных о времени выполнения запросов. Представляет максимальное количество запросов, хранимых в памяти. По умолчанию 1000.
mxstat_statements.usage_multiple Целое число Множитель для хеш-слотов, используемых для хранения данных о потреблении ресурсов относительно слотов времени. По умолчанию 2.
mxstat_statements.track Строка top: Отслеживать только запросы верхнего уровня, без вложенности (по умолчанию);
all: Отслеживать все уровни вложенности;
none: Отключить отслеживание.
mxstat_statements.track_utility Логический Отслеживать ли выполнение служебных операторов. По умолчанию on.
mxstat_statements.save Логический Сохранять ли статистику из памяти на диск при перезапуске кластера. По умолчанию on.
mxstat_statements.harvest_interval Целое число Интервал (в минутах), через который статистика извлекается из разделяемой памяти в исторические таблицы. По умолчанию 5 минут.
mxstat_statements.harvest_usage Логический Собирать ли статистику по использованию ресурсов. По умолчанию on.
mxstat_statements.ignored_databases Строка Список баз данных, которые следует игнорировать, разделенный запятыми. По умолчанию template0,template1.
mxstat_statements.start_reaper_on_start Логический Запускать ли процесс reaper при запуске кластера. Этот процесс периодически записывает собранные данные в таблицы mx_query_execute_history, mx_query_usage_history, mx_querytext, mx_query_execute_history_with_text и связанные с ними таблицы.

См. также

Расширение matrixmgr