2015-03-03 4 views
0

Я создал функцию SQL и поместил ее в предложение GROUP BY, HAVING, но обнаружил, что функция agg занимает слишком много времени. план запроса здесьКак профилировать agg в Postgresql?

http://explain.depesz.com/s/ooaM

Функция не должна быть настолько медленно, я хочу понять, почему это занимает так много времени. Может ли кто-нибудь предложить некоторые инструменты, которые я могу использовать для профиля postgresql? Я работаю над pg9.4, и когда я работаю над его исходным кодом, я бы хотел понять его внутреннее. Благодарю.

+1

Пожалуйста, пост код вашего 'calc_area' функции –

+1

отсутствие статистики. (или: orverly skew destributions. Или: bad datamodel) – wildplasser

+0

это действительно иностранный FOREIGN DATA WRAP с использованием стороннего API для вычисления областей. Ввод - это идентификатор лица, выход - область с двойной точностью. @a_horse_with_no_name – user3329081

ответ

0

Если вы хотите выполнить детальную аппаратную диагностику на постгреве, вы можете использовать valgrind.

В частности, вы можете использовать следующую команду.

valgrind --tool=callgrind --dump-instr=yes --trace-jump=yes ./postgres -D your_data_dir

Обратите внимание, что такие приборы требует Postgres быть скомпилирован с -g, то есть в вашей команде configure, что вам нужно сделать configure --enable-debug.

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

После завершения исполнения быть несколькими выходными файлами, произведенными valgrind, а именно callgrind.$pid.out, в котором $pid - это идентификатор процесса всех процессов postgres, включая бэкэнд, и тот, который отвечает за обработку клиентского сеанса, на котором вы выполнили запрос. Предположим, что pid для этого процесса - это 12345, что вам нужно сделать, чтобы преобразовать этот выходной файл необработанного профиля в удобочитаемое для человека представление. Вы будете использовать следующую команду.

callgrind_annotate --auto=yes callgrind.12345.out > profie.txt

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