Pull to refresh

Comments 16

Спасибо за утилиту, попробую! По плану запроса, в Oracle план реально выполняемого запроса и план через explain могли сильно разнится и вводить в заблуждение, тут и спасал sqlid с актуальным планом выполняемого запроса. В PG такие проблемы актуальны или он все же стабильней, плану через explain можно верить?
Тут надо определиться, что мы считаем «разными» планами.
Если мы говорим про такие поля, как COST и ROWS, то они конечно же будут отличаться, т.к. при EXPLAIN они формируются на основе статистики и некой абстрактной стоимости операций чтения и т.п.
А если мы говорим про план, как про непосредственно метод доступа к данным, то тут надо понимать, что если между моментом фактического выполнения запроса и моментом выполнения EXPLAIN случилось нечто, что влияет на план (например, удаление индекса), то результаты тоже могут не совпасть.
Однако, учитывая, что мы посылаем команду EXPLAIN в ту же секунду, что и сам запрос, то вероятность описанного выше события крайне низка.
Плану через explain можно верить?
Ответ: и да, и нет

Да — потому, что это всё же план, но действительный только на момент запроса самого плана

Нет — т.к. зависит от весьма конкретных вещей, к примеру от параметров запроса: у компании А 10 платежей, а у Б — 500000, и какой нить индексскан спокойно превращается в битмапу с речеками и дополнительной сортировкой чтобы оффсетом (омг) отсечь ещё сотню другую записей. + explain отличается от explain (analyze, buffers)

И получается, что план раз в час, как предложено выше, в принципе так себе идея

Если нужен актуальный план реально ступившего запроса — посмотрите тут
В целом автор форка мог бы доработать приложение, дав пользователям возможность указывать файл с логами, для поиска актуального плана выполнения от автоэксплейна (по времени, иду транзакции, да как угодно)
Дописал приложение. Теперь можно поймать разные планы для запроса. Пример:image
Что для этого нужно, написано здесь: How to catch execution plans for queries.
Вашу статью про auto_explain прочитал — инструмент хороший, но я не вижу приличного способа как-то парсить в десктопном приложении текстовый лог, расположенный на сервере БД.
Выложил на github — github.com/dbacvetkov/PASH-Viewer.
Просто разобрался не сразу. Использую первый раз, поэтому не факт, что всё сделал правильно.
Не запускается :(
SQL Exception occured: ERROR: column «backend_type» does not exist
Позиция: 76
java.lang.NullPointerException
Полагаю, что у вас не PostgreSQL 10.
В 9-ой версии такого поля действительно нет. Я мог бы без него и обойтись в запросе, но там и ожиданий очень мало — вряд ли будет интересно наблюдать. Если я для вас скомпилирую версию под 9-ку — выложите мне в ответ её скриншоты под нагрузкой?
Прямо вот большую нагрузку не обещаю, но что будет — пришлю
версия 9.6.2
Было бы здорово общую версию иметь, где поля нет — просто ограниченный функицонал.
0.3 запустилась. Попробую снять скриншоты
image
Скриншот — планы не показывает для запросов, в остальном работает.
В нашем проекте исторические планы пока не так важны, нас устраивает :)
Еще какие-то нужны?
Sign up to leave a comment.

Articles

Change theme settings