Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
Удивительная вещь. Есть запрос, который сам по себе выполняется меньше секунды. Если же попросить EXPLAIN ANALYSE, он уверяет, что этот запрос выполняется за 25 секунд (столько фактически у него и выходит). План показывает нехороший. За день до того все работало как надо, и EXPLAIN ANALYSE показывал замечательный план на 44 мс. Признаюсь честно, что делал в промежутке: создал один индекс по соверешнно другой таблице (не участвующей в запросе, и один удалил). Создал по полям a,b,c, удалил прежний по a,b. После этого сделал VACUUM FULL ANALYSE. После того, как обнаружил бяку, предположил, что испортилась статистика. Попытался обновить статистику - увеличил default_statistics_target с 10 до 100, сделал postgresql reload, сделал ANALYSE. Ничего не изменилось. Еще сделал REINDEX всех таблиц, участвующих в запросе. Ничего не изменилось. Что можно сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 13:48 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
Cane Cat Fisher, Может всётаки покажете нам свой секретный EXPLAIN ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 13:51 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
нет нет ни в коем случае ! и версию сервера не говорите ! а уж версию операционной системы и параметры оборудования даже вскользь не упоминайте ! :) -- „Истина — это вовсе не то, что можно убедительно доказать, это то, что делает всё проще и понятнее“ — Антуан де Сент-Экзюпери ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 14:11 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
Прошу прощения, что заинтриговал - решил еще раз все перепроверить перед тем как писать продолжение. Все подтверждается. Есть три таблицы - относительно большой журнал документов jpm3 (1,5 млн записей), небольшой реестр пачек этих документов rpm3pack (1700 записей), и крохотный справочник юзеров ruser (70 записей). Документ ссылается на пачку, пачка - на юзера. Запрос показывает итоги по журналу в разрезе юзеров - кол-во документов, пачек, и некую сумму. Запрос: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Он возвращает 8 строк. План, который был хороший: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. План, который стал плохой: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Видно, что во втором случае перестал использоваться индекс idx_jmp3_pointid_pm3packid, и переиначилась структура запроса. Но индекс этот жив и здоров. Структура не менялась, данные в таблицах существенно не менялись (может, 3-4 записи поковырял - это тестовый экземпляр). Напрашивающийся индекс на rpm3pack по pointid, pcurrid существует, но не используется. В первом случае - результаты были и так хороши. Во втором - непонятно. Сервер старючий, 7.4.8. Пока жареный петух не клевал. Если пообещаете, что дело именно в этом - будем переходить на 7.4.23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 14:44 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
Cane Cat Fisher, А чего не проапгрейдите ... про петуха знаю , но кусается он иногда очень больно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 17:05 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
я не думаю, что переход на другой релиз из ветки 7.4 что-то решит. если уж переходить, то на 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 18:24 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
попробуйте set enable_seqscan to off. покажите получившийся explain analyze. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 10:53 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
eddieя не думаю, что переход на другой релиз из ветки 7.4 что-то решит. если уж переходить, то на 8.не-а. 7.4. - есть величина исключительная. Предопределенная. искать по <че-то-там>...ВС ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 12:04 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
в "хорошем" плане эта строчка вызывает подозрения: Код: plaintext может быть более опытные товарищи расшифруют? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 12:37 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
LeXa NalBatпопробуйте set enable_seqscan to off. покажите получившийся explain analyze. Поигрался, результат интересный. Прежде всего скажу, что обновился до 7.4.23, и эти тесты уже на другом железе, поэтому реальное время несколько отличается от прежнего. Поднял резервную копию, с которой все начиналось. Сделал VACUUM FULL ANALYSE при default_statistics_target = 1000. По поводу "Хорошего" плана - результат в 44 мс, конечно, фантастический, и повторить его не получилось. Я теперь не могу с уверенностью утверждать, с какими параметрами был сделан тот запрос, но подозреваю, что запрос был сделан за период, в котором было мало данных. Теперь тестирую на нормальном периоде, но явление сохранилось, хотя и с величинами иного порядка. Исходный запрос выполняется 1.7 сек. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Выключаем seqscan, выполняется быстрее, 0.6 сек: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. А теперь планы: со включенным seqscan - 13 сек. Это тот же самый "Плохой план". Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. с выключенным seqscan - 1,3 сек. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Почему такое большое различие между длительностями планов и реальными запросами, особенно в первом случае? Похоже, EXPLAIN выдает не тот план, который используется при запросах? Что это за эвристика? Я же отлаживать ничего не смогу :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 15:12 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
есть у вас возможность перейти на более новую или даже последнюю 8.3.5 версию сервера? это может решить проблему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 15:45 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
LeXa NalBatесть у вас возможность перейти на более новую или даже последнюю 8.3.5 версию сервера? это может решить проблему. В версии 8.1 подобные проблемы так же присутствуют, в 8.3 я свои дампы грузил, там те же самые грабли. Хотя на тестовой машине загрузить дамп в 8.1 и 8.3 имеет смысл, почему бы и не попробовать. P.S. Для моих задач один обходной путь удалось найти - выполнять подзапросы, возвращающие десятки или сотни записей, отдельными запросами и результат подставлять в конструкции "in (...,...,...)". Временами это дает выигрыш на несколько порядков. Это усложняет клиентский код, но другого выхода я не вижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 16:45 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat, А вообще в восьмерках была ли описана где-то эта ситуация как исправленный баг? Или оставется надеяться, что исправление спрятано за туманным выражением в HISTORY "мы в каждой версии улучшаем оптимизатор, хотя в баглистах этого не пишем, потому что это выражается просто в том, что запросы работают быстрее"? Мне кажется, если бы это был найденный серьезный баг, его бы пофиксили и в седьмой ветке. Но в любом случае постараюсь попробовать после выходных восьмерку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 16:46 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
вот нашёл что-то похожее: estimates for nested loop very wrong? из полезного имхо только: Tom LaneHow much RAM do you have on this machine? If the system is caching a goodly fraction of the tables, it'd be appropriate to lower random_page_cost (or increase effective_cache_size). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 16:52 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
MBG, Я тоже часто упрощал сложные запросы подобным образом, хотя и ничего не зная об этой проблеме. Может быть, поэтому и не сталкивался с ней до сих пор. Только результаты промежуточных запросов я сохранял не в IN(), а во временные таблицы, и по ним создавал индексы. Тоже быстродействие в сотни раз улучшалось. Но в таком запросе, похоже, подобный метод применить не удастся. Я пробовал выкинуть ruser, группировать по rpm3pack.userid, чтобы потом результат связать с ruser. Тоже чудит с планами, хотя реально выполняет быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 16:53 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
eddie, Мне кажется, здесь немного не тот случай. Там у человека просто выбирало невыгодный план, не тот, что ему хотелось. А здесь показывает один план, а использует другой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 17:00 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
Cane Cat FisherА вообще в восьмерках была ли описана где-то эта ситуация как исправленный баг? Или оставется надеяться, что исправление спрятано за туманным выражением в HISTORY "мы в каждой версии улучшаем оптимизаторда, именно из-за того что постоянно улучшают оптимизатор. Cane Cat FisherМне кажется, если бы это был найденный серьезный баг, его бы пофиксили и в седьмой ветке.к сожалению, случаи выбора постгресом неоптимального плана бывают. Cane Cat FisherА здесь показывает один план, а использует другой.это было бы багом, но верится с трудом. может все-таки селект вы выполнили в одном окружении, а эксплейн в другом, или кэширование сыграло роль, или статистика изменилась. вы привели два плана выполнения. для каждой строки rows должно быть примерно равно actual rows - это выполняется, то есть постгрес не ошибается в оценке кол-ва строк. также должно быть для всех строк примерно одинаковым отношение cost к actual time - это не выполняется, очень медленно по сравнении с другими этапами постгрес оценивает сканирование индекса idx_jmp3_pointid_pm3packid: 3214.36/3.458=929. думаю, что в этом корень проблемы. попробуйте пересоздать этот индекс, а потом пересобрать статистику по таблице? попробуйте вместо индекса по (pointid,pm3packid) индекс по (pm3packid,pointid) - все таки селективность по pm3packid гораздо лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 17:30 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
Cane Cat FisherMBG, Я тоже часто упрощал сложные запросы подобным образом, хотя и ничего не зная об этой проблеме. Может быть, поэтому и не сталкивался с ней до сих пор. Только результаты промежуточных запросов я сохранял не в IN(), а во временные таблицы, и по ним создавал индексы. Тоже быстродействие в сотни раз улучшалось. Но в таком запросе, похоже, подобный метод применить не удастся. Я пробовал выкинуть ruser, группировать по rpm3pack.userid, чтобы потом результат связать с ruser. Тоже чудит с планами, хотя реально выполняет быстро. В определенных случаях оказывается выгодно создавать отдельную схему в базе для каждого пользователя и в ней динамически создавать виды и таблицы с параметрами, хранимыми в сессии пользователя (конечно, сессии лучше хранить в этой же базе). Тогда и планировщику хорошо - мы можем разбить сложные запросы на цепочку простых и в итоге получить вид или таблицу (или их набор). И приложение работает просто - вызывает функцию на встроенном в базу языке, которая генерит соответствующие таблицы/виды и после этого приложение отрисовывает содержимое созданных таблиц/видов. Но плохо то, что получается, СУБД становится вторым сервером приложений, это усложняет поддержку. Это я вот к чему - попробуйте сделать вот так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 17:56 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
нижеуказанные предложения MBG считаю бесполезными или ошибочными авторвыполнять подзапросы, возвращающие десятки или сотни записей, отдельными запросами и результат подставлять в конструкции "in (...,...,...)"авторсоздавать отдельную схему в базе для каждого пользователя и в ней динамически создавать виды и таблицы с параметрами, хранимыми в сессии пользователяавтормы можем разбить сложные запросы на цепочку простыхавторвызывает функцию на встроенном в базу языке, которая генерит соответствующие таблицы/виды и после этого приложение отрисовывает содержимое созданных таблиц/видовавторcreate view user_155.jpm3 as select * from jpm3 where pointid = 1; create view user_155.rpm3pack as select * from rpm3pack where pcurrid = 155; create view user_155.ruser as select * from ruser where userid = 155;авторвы можете использовать и временные таблицыавторЕсли какая-то из промежуточных операций требует много ресурсов и притом результат содержит немного записей, лучше их в таблицу сохранить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 18:11 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
LeXa NalBatнижеуказанные предложения MBG считаю бесполезными или ошибочными Ждем от вас патчи, исправляющие работу планировщика. А пока без костылей он сам не ходит. Считать бесполезными техники, ускоряющие запрос на несколько порядков это ваше дело, видимо, "железо" у вас позволяет об этом не беспокоиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 18:24 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
MBGЖдем от вас патчи, исправляющие работу планировщика.только после того как Вы напишите отчёт об ошибке в официальный список рассылки, со скриптом или подробным описанием позволяющим воспроизвести ошибку на серверах разработчиков :) те ошибки про которые я туда писал исправлялись в течении нескольких _дней_ что лично меня поразило наповал :) хотя я конечно допускаю что они были просты для локализации и исправления... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 18:49 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
Cane Cat Fishereddie, Мне кажется, здесь немного не тот случай. Там у человека просто выбирало невыгодный план, не тот, что ему хотелось. А здесь показывает один план, а использует другой. ??? с чего вы сделали такой вывод? у вас тот план, где seqscan выполняется медленно. тот план, где nested loop - быстро. проблема в том, что планировщик считает наоборот, соответственно выбирает seqscan. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 19:17 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
ЁшMBGЖдем от вас патчи, исправляющие работу планировщика.только после того как Вы напишите отчёт об ошибке в официальный список рассылки, со скриптом или подробным описанием позволяющим воспроизвести ошибку на серверах разработчиков :) те ошибки про которые я туда писал исправлялись в течении нескольких _дней_ что лично меня поразило наповал :) хотя я конечно допускаю что они были просты для локализации и исправления... Я уже публиковал примеры простых запросов, когда планировщик ведет себя непредсказуемо. Могу пополнить эту коллекцию. Например, такой запрос Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. на "холодной" базе работает так Код: plaintext 1. на "горячей" базе (после нескольких запусков) Код: plaintext 1. план в обоих случаях такой Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. Переписываем запрос согласно приведенным мною выше рекомендациям. Подзапрос: Код: plaintext 1. Время выполнения мало даже при первом запуске: Код: plaintext 1. 2. План: Код: plaintext 1. 2. 3. 4. Основной запрос: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Время выполнения на холодной базе: Код: plaintext 1. 2. На горячей: Код: plaintext 1. 2. План: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. Ясно видно, что планировщик не отрабатывает корректно план выполнения запроса с подзапросами, сваливаясь на Seq Scan по таблице attributes. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 19:27 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
MBG Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. хотя и так неоднократно сталкивался с тем, как оптимизатор разворачивает view, но всё-таки не поленился проверить: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 19:34 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
Так будут предложения по решению указанной проблемы планировщика? У меня предложение только одно - необходимо выкинуть вероятностную модель и реализовать детерминированный планировщик. Но это явно не укладывается в рамки багрепорта. А поскольку подобных и намного более сложных запросов у меня сотни, то и отношение к работе планировщика очень скептическое - везде нужны костыли. Можно с различными настройками поиграться, например, seqscan отключать на какие-то таблицы, но это повлияет на сотни других запросов, часть из которых начинают работать совершенно неадекватно. Как я понимаю, те, кто не занимается системами анализа больших массивов данных, с этими проблемами могут не сталкиваться, но утверждение о том, что постгрес мощнейшая из открытых СУБД уже несколько лет не соответствует реальности и разработчиков это положение вполне устраивает. А для простых запросов постгрес просто не нужен - что толку от возможности реализовать свои функции для анализа, если запросы с их использованием чрезвычайно медленны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 21:07 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=35682565&tid=2003833]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
64ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
83ms |
get tp. blocked users: |
2ms |
| others: | 266ms |
| total: | 461ms |

| 0 / 0 |
