Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
MBGНапример, такой запрос Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. с одной стороны у вас offline.attributes join offline.documents on document_id=id where phone_number='1234567890' с другой стороны document_id in (select id from offline.documents where phone_number='1234567890') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 22:29 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
eddieмасло масляное. с одной стороны у вас offline.attributes join offline.documents on document_id=id where phone_number='1234567890' с другой стороны document_id in (select id from offline.documents where phone_number='1234567890') О том и речь, что планировщик сам не может понять, что это условие нужно применить к обеим таблицам и приходится вручную расписывать. Если не расписать, то эквивалентный sql-запрос выполняется намного хуже: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Код: plaintext 1. 2. Как видим, полученное значение примерно равно времени выполнения исходного запроса (820 ms.) Код: 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. Тот же самый запрос, здесь все совсем печально: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Код: 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. Во всех случаях время выполнения абсолютно неприемлемое. Вот и приходится все условия указывать для каждой из таблиц, плюс заранее вычислять значения подзапросов. Иным способом не удается добиться времени выполнения запроса менее 100мс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 23:59 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
Да, не уточнил, все рабочие таблицы небольшие: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2008, 00:05 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
MBGТак будут предложения по решению указанной проблемы планировщика? У меня предложение только одно - необходимо выкинуть вероятностную модель и реализовать детерминированный планировщик. Но это явно не укладывается в рамки багрепорта.ну и что что проблема комплексная и сложная ? :) помимо pgsql-bugs есть ещё pgsql-performance pgsql-general если там не помогли есть pgsql-hackers А писать отчёты сюда и надеяться что те немногие из разработчиков что читают этот форум - решат с ней разобраться - ну это имхо очень маловероятно. Вы писали об этих проблемах сюда сколько месяцев назад ? год уже наверное прошёл ? я всёж таки советую Вам собраться с силами и обратиться напрямую к разработчикам в официальные списки рассылки. Если конечно Вы хотите что бы что-то изменилось. MBGА поскольку подобных и намного более сложных запросов у меня сотни, то и отношение к работе планировщика очень скептическое - везде нужны костыли.Ваш пример опять не полон. я допустим хочу у себя воспроизвести Вашу проблему, что мне нужно делать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2008, 04:40 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
Ёш Приведенные планы выполнения доказывают, что один и тот же запрос планировщик может выполнять разными способами, хотя с точки зрения стандарта sql это неправильно. Разумеется, если планов выполнения одного и того же запроса может быть много разных, то большинство из них сильно неоптимальны. Подобных вещей в форумах много опубликовано. Но никто и никогда не отдаст для проверки рабочую базу. А в форуме обсуждаются обходные пути - раз уж баги не правят, приходится как-то с ними жить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2008, 13:48 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
MBGПриведенные планы выполнения доказывают, что один и тот же запрос планировщик может выполнять разными способами, хотя с точки зрения стандарта sql это неправильно.позвольте с Вами не согласиться :) один и тот же запрос планировщик _должен_ выполнять разными способами, как минимум - в зависимости от количества данных в таблицах и их видимости. например если в запросе три таблицы с сотней записей - можно с закрытыми глазами выбирать seq scan, а если там сто тысяч, можно уже подумать. или Вы имеете ввиду что план меняется хотя сами данные - не изменялись ? MBGРазумеется, если планов выполнения одного и того же запроса может быть много разных, то большинство из них сильно неоптимальны. Подобных вещей в форумах много опубликовано. Но никто и никогда не отдаст для проверки рабочую базу. А в форуме обсуждаются обходные пути - раз уж баги не правят, приходится как-то с ними жить.ерунда, баги - правят, нужно просто о них сообщать, а не мучится ища обходные пути. и рабочую базу - не нужно. нужно такую, на которой проявится Ваша проблема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2008, 14:18 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
MBGПриведенные планы выполнения доказывают, что один и тот же запрос планировщик может выполнять разными способами, хотя с точки зрения стандарта sql это неправильно. ??? стандарт sql ничего не говорит об планах исполнения. Но никто и никогда не отдаст для проверки рабочую базу. хи-хи. какую ценность представляют ваши "секретные" данные для посторонних людей (особенно для разработчиков postgres'а)? в конце концов критичные данные можно удалить из базы (например заменить фио на белиберду). хотя лучший путь - найти test case, на котором будет проявляться проблема. А в форуме обсуждаются обходные пути - раз уж баги не правят, приходится как-то с ними жить. баг - это неверный результат запроса. тут же мы видим неоптимальность. и позиция разработчиков postgresql проста и понятна - вместо того, чтобы приделывать костыли к планировщику, лучше оптмизировать планировщик. и, по личному опыту, разработчики вполне идут на контакт. ps: инструмент должен нравиться. если postgres у вас вызывает столько негатива - используете что-то другое, благо альтернатив полно. pps: а что с проблемой у топикстартера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2008, 14:40 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
MBGздесь все совсем печально: строк извлечено: 9 "Sort (rows=40042)"можно обсудить возможности ускорения ваших запросов в отдельной теме ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2008, 01:33 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
Я сталкивался с выбором неоптимальных планов при большом количестве join. Не уверен, что это общий рецепт, но если задать geqo_effort = 10 и задрать кверху geqo_threshold = 64 from_collapse_limit = 48 то, в моем случае, планы выправились, или, по меньшей мере, все стало работать приемлемо. GEQO, по-моему, мало где оправдан. Кстати, как вычислить накладные расходы аналитического выбора плана? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2008, 14:20 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
eddieCane Cat Fishereddie, здесь показывает один план, а использует другой. ??? с чего вы сделали такой вывод? у вас тот план, где seqscan выполняется медленно. тот план, где nested loop - быстро. проблема в том, что планировщик считает наоборот, соответственно выбирает seqscan. "С высоты птичьего полета" проблема для меня выглядит так. Я запускаю запрос - он выполняется около секунды. Я хочу его ускорить, проверяю его EXPLAIN ANALYSE - он думает 13 секунд, и еще планом подтверждает, что иначе чем за 13 секунд не получится. Чем ставит меня в тупик в плане оптимизации запроса. Чтобы исключить влияние кеширования, запускал подряд несколько раз поперемено то сам запрос, то его EXPLAIN - результат повторяется - сам запрос быстро, EXPLAIN медленно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2008, 10:19 |
|
||
|
Пессимистично врущий EXPLAIN
|
|||
|---|---|---|---|
|
#18+
tadminЯ сталкивался с выбором неоптимальных планов при большом количестве join. Не уверен, что это общий рецепт, но если задать geqo_effort = 10 и задрать кверху geqo_threshold = 64 from_collapse_limit = 48 то, в моем случае, планы выправились, или, по меньшей мере, все стало работать приемлемо. Эти настройки пробовал менять, но существенных изменений не заметил. Работает с расписанными, как я указывал выше, запросами быстро, но сам подход не нравится, следовало бы получать одинаковый результат как при однократном указании условия, так и при многократном, т.к. с точки зрения стандарта sql эти запросы эквивалентны. Идея простая - сначала взять подмножества нужных таблиц и пересечь их будет эффективнее, чем выполнять пересечение всех таблиц и после того ограничивать результат, но, к сожалению, я не знаю способа заставить планировщик так работать (в общем случае это не оптимально, но если в выборке участвуют малые подмножества больших таблиц, приходится вручную реализовывать указанную тактику). Запрет seqscan иногда приводит к желаемому результату, но при увеличении количества объединяемых таблиц уже не помогает. В SQLite подобной проблемы нет, там планировщик совсем иначе сделан, но цена этого - неполная реализация стандарта sql, например, нет right join, зато left join работает эффективнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2008, 10:43 |
|
||
|
|

start [/forum/topic.php?fid=53&gotonew=1&tid=2003833]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
12ms |
get first new msg: |
7ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 376ms |

| 0 / 0 |
