2016-01-03 4 views
1

Согласно Postgres pg_stat_statements документации:Сбор больших статистических наборов с pg_stat_statements?

Модуль требует дополнительного разделяемой памяти, пропорциональный pg_stat_statements.max. Обратите внимание, что эта память потребляется всякий раз, когда загружается модуль , даже если для параметра pg_stat_statements.track установлено значение none.

, а также:

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

Из этого неясно, какова будет фактическая стоимость памяти высокого pg_stat_statements.max - скажем, 100 к или 500 к (по умолчанию 5 кБ). Безопасно ли устанавливать уровни, которые являются высокими, могут быть негативные последствия таких высоких уровней? Может ли агрегация статистики во внешнюю базу данных через logstash/fluentd быть предпочтительным подходом выше определенных размеров?

ответ

2

1.

от того, что я прочитал, что хэши запрос и сохраняет его в БД, сохраняя текст FS. Поэтому следующая озабоченность более ожидаемым, то перегружен общая память:

если много текстов долго запроса накапливаются, внешний файл может расти неуправляемо большой

хэш текста так много меньше, чем текст, что я думаю, вам не стоит беспокоиться о потреблении памяти расширения, сравнивая длинные запросы. Особенно зная, что расширение использует анализатор запросов (который будет работать для каждые запрос ИНАЧЕ):

значение хеш-функции queryid вычисляется на пост-синтаксического анализа-анализа представление запросов

Настройка pg_stat_statements.max В 10 раз больше нужно брать в 10 раз больше общей памяти, я полагаю. Рост должен быть linear. Это не сказано в документации, но логически должно быть так.

Нет ответа, если это безопасно или не устанавливать настройку на определенное значение, поскольку нет данных о других значениях конфигурации и HW, которые у вас есть. Но так как рост должен быть линейным, рассмотрите этот ответ: «если вы установите его на 5K, а время выполнения запросов почти ничего не изменится, тогда установка его на 50K продлит его почти ничего раз десять». Кстати, мой вопрос - кто гонг выкапывает 50000 медленных заявлений? :)

2.

Это расширение уже делает предварительную агрегацию для выражения «disvaled». Вы можете выбрать его прямо на БД, поэтому перемещение данных в другой бит и выбор его там даст вам только возможность разгрузить исходную БД и загрузить другую. Другими словами, вы сохраняете 50 МБ для запроса на оригинал, но тратите то же самое на другом. Имеет ли это смысл? Для меня - да. Это то, что я делаю сам. Но я также сохраняю планы выполнения для оператора (который не является частью расширения pg_stat_statements). Я считаю, что это зависит от того, что у вас есть и что у вас есть. Определенно, нет необходимости в этом только из-за ряда запросов. Опять же, если у вас нет такой большой файл, расширение может

В качестве способа восстановления, если это произойдет, pg_stat_statements может выбрать отбросить тексты запросов, после чего все существующие записи в pg_stat_statements будет выводить нулевые поля запроса

+0

Я бегу с большим количеством материализованных представлений, следовательно, высокий запрос 'pg_stat_statements.max' :) Не слишком беспокоит пространство на жестком диске, в основном использование памяти, умаляющее реальную производительность запросов. > Это то, что я делаю сам. Если возможно, вы могли бы поделиться немного больше о своей предпочтительной настройке и о том, как вы обрабатывали выгрузку первичной базы данных из коллекции статистики? – user3467349

+0

большая угроза файла не для пространства hdd, а для времени, которое требуется для его анализа. попробуйте запросить pg_stat_statements как суперпользователь (чтение файла формы заявления) и как не суперпользователь (без операторов). Если у вас большой файл, время значительно отличается. –

+0

то, что я делаю, это установка стиля исправления - не оптимальная, но вот она: я установил max до 1000 (вместо этого ниже 5 раз). У меня есть работа, которая реплицирует pg_stat_statements на другой db с помощью dblink (без запроса, но с его хэшем) и другое задание, которое отправляет хэш и запрос в другую таблицу (с FK). и другое задание, которое сохраняет текущий план выполнения и отправляет его в третью таблицу с хешем (FK). таким образом, я могу сравнить, изменилось ли время выполнения и план со временем ... (Oracle имеет нечто похожее в CBO) –

Смежные вопросы