Документ описывает развертывание, структуру таблиц, использование, настройку и отключение функции статистики запросов YMatrix. При обнаружении медленных запросов к базе данных или при необходимости более эффективного планирования использования ресурсов базы данных вы можете использовать эту функцию для оптимизации.
Функция статистики запросов mxstat включает:
После инициализации кластера 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-запросов и связанного с ними потребления ресурсов.
=# SELECT pg_sleep(5);
=# SELECT pg_sleep(10);
=# SELECT pg_sleep(15);
mxstat_execute. Результаты показывают:sample_start) и окончания (sample_exec_end) запроса.$1.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)
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)
test1 с помощью следующей команды:=# CREATE TABLE test1(
c1 int,
c2 int
)
USING MARS3
DISTRIBUTED BY(c1)
ORDER BY(c1);
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)
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)
В примерах 1 и 2 значение nestlevel в mxstat_execute равно 0, поскольку не было вложенного выполнения. Следующий пример демонстрирует вложенное выполнение, которое обычно достигается путем вызова пользовательской функции (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.
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)
Примечание!
Отключение статистики запросов не требует остановки или перезапуска базы данных.
$ psql -d matrixmgr -c "SELECT matrixmgr_internal.mxstat_stop_worker();"
$ gpconfig -s mxstat_statements.track
$ gpconfig -c mxstat_statements.track -v none
$ mxstop -u
Примечание!
Эти два шага временно отключают функцию. Она будет снова включена по умолчанию после перезапуска кластера. Чтобы отключить ее постоянно, выполните DROP EXTENSION после вышеуказанных шагов.
$ psql -d matrixmgr -c "SELECT matrixmgr_internal.mxstat_reset();"
$ 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 и связанные с ними таблицы. |