|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
Добрый день! PostgreSQL 9.6 Есть три запроса к таблице xxx (в ней 22.000.000 строк): select * from xxx where yyy='1234567' limit 1; -- выполняется мгновенно select * from xxx where yyy='1234567' order by createdate desc ; -- выполняется мгновенно select * from xxx where yyy='1234567' order by createdate desc limit 1; -- выполняется за 5 минут ANALYZE сделал, REINDEX сделал... select count(yyy) from xxx; -- выполняется за 60 секунд Во время выполнения SELECT...limit скорость чтения с диска до 20 Мб/сек ; во время выполнения select count(yyy) from xxx скорость чтения с диска больше 100 Мб/сек ; Почему запрос с limit, который должен вернуть одну строку, выполняется дольше чем тот же запрос без limit, возвращающий 10.000 строк ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 00:12 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
Pilat01, а так? Код: sql 1.
нужен explain analyze всех запросов. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 00:31 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
[quot drsm] Код: sql 1.
/quot] ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 00:32 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
Код: sql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 01:18 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 01:51 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
Код: sql 1.
тоже долго. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 01:53 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
Pilat01, что-то не то со статистикой похоже... analyze xxx не помогает? Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 03:58 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
Pilat01, xxx_yyy, xxx_createdate идексы зачем созданы? чтобы этот запрос выполнялся быстро нужен индекс составной yyy, createdate desc ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 04:10 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
NALYZE xxx; выполнено. drsmPilat01, xxx_yyy, xxx_createdate идексы зачем созданы? чтобы этот запрос выполнялся быстро нужен индекс составной yyy, createdate desc Но почему тогда запрос Код: sql 1.
выполняется быстро, а Код: sql 1.
выполняется медленно? Второй запрос - это первый, от которого осталась одна строка. Составные индексы на каждый запрос не насоставляешься. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 10:03 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
Pilat01Но почему тогда запрос Код: sql 1.
выполняется быстро, а Код: sql 1.
выполняется медленно? Второй запрос - это первый, от которого осталась одна строка. Потому что план разный. В одном случае выбирают все строки с yyy='9735323' и сортируют. А во втором случае выбирают строки отсортированные по createdate и фильтруют по yyy='9735323' с надеждой что первая строка найдется быстро. А по факту у вас получается приходится перебрать Rows Removed by Filter: 22040609 - 22M строк. Сколько всего у вас строк в таблице xxx (select count(*) from xxx )? Скорее всего у вас значения yyy распределены очень не равномерно по createdate - это называется скрытая корреляция данных про которую база ничего не знает. Вам что хочется 1)максимально быстро выполнить запроса - тогда индекс добавить или 2)выполнить запрос не медленнее чем без LIMIT - тогда переделайте его на select * from xxx where yyy='9735323' order by createdate+'0 second'::interval desc limit 1; чтобы исключить неудачный план (но если вы в yyy= подставите значение которого там полтаблицы то вам будет очень больно по скорости) или 3)понять почему выбирается такой план а не другой (я вам описал это выше). -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 10:12 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
Maxim Boguk, спасибо. Я построил составной индекс и запрос выполняется быстро. Это конечно не к Вам претензия, но... почему постгрес так тупит??? Я описание проблемы и решений нашёл, ей минимум 10 лет уже и до сих пор люди задают этот же вопрос. Хинты что ли сделали бы. Так сделали , оказывается. Но отмазки принятия в ядро типа "вам будет потом сложно". В Оракле не сложно, а в постгресе сложно. Ну построю я индекс (yyy,createdate), а мне понадобится фильтровать по другому полю. Ещё индекс строить по всем полям? :( а другого решения и нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 11:02 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
Pilat01, Тоже раньше думал, что это Postgres тупит. Увы, это вопрос баланса между производительностью и отработкой узких мест. В 10-й версии можно создать расширенную статистику: https://www.postgresql.org/docs/current/static/sql-createstatistics.html ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 11:56 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
vyegorov, я в принципе согласен что хинты добавят проблем в будущем (а может и не добавят). Но сейчас придётся добавлять кучу индексов, что будет проблемой всегда. Как минимум скорость вставки и место на диске увеличатся. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 12:17 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
Pilat01Хинты что ли сделали бы.В данном случае достаточно запретить использовать индекс по дате. Это можно сделать и без хинтов. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 12:33 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
Pilat01, Хинты в ОРАКЛЕ — это псевдокоманды в комментариях. Хинты в PostgreSQL — это знание особенностей планировщика и исключение ненужных путей исполнения запроса. В вашем случае использование выражения в ORDER BY исключает использование индекса, что приводит к лучшему плану. И как уже упомянул Максим — это может дать и худший план для некоторых ситуаций. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 12:41 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
p2.Pilat01Хинты что ли сделали бы.В данном случае достаточно запретить использовать индекс по дате. Это можно сделать и без хинтов. Тогда я буду читать все 20 миллионов строк с диска. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 12:54 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
vyegorovВ вашем случае использование выражения в ORDER BY исключает использование индекса, что приводит к лучшему плану. И как уже упомянул Максим — это может дать и худший план для некоторых ситуаций. В некоторых случаях это замедлит выполнение запросов, так что не панацея. Индексы более предсказуемые. Вот только у меня есть таблицы с 255 столбцами. 255 дополнительных индексов по двум столбцам? Было бы лучше хинты. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 12:57 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
vyegorovPilat01, Тоже раньше думал, что это Postgres тупит. ... и правильно думали cost=36949.37..36975.15 для выборки всего мн-ва хуже тупой оптимистической (из соображений равномерного распределения) cost=0.44..4058.54 , а если применить к потолочной оценке пусть не знание корреляции а тупое оценивание последствий пессимистического распределения, и усреднить последствия (по мн-ву возможных распределений)-- могут сильно поплыть цифирьки ожиданий. (все в стартовой куче не дадут существенного выигрыша, а все в хвостовой дадут огромный вклад в пессим. веса) нет ? надо просто нанять комбинаторика -- он правильно посчитает перекос "матожидания коста" относительно "коста от матожидания" на мн-ве перестановок. а пж тупит всегда -- это константа ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 14:29 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
Pilat01vyegorovВ вашем случае использование выражения в ORDER BY исключает использование индекса, что приводит к лучшему плану. И как уже упомянул Максим — это может дать и худший план для некоторых ситуаций. В некоторых случаях это замедлит выполнение запросов, так что не панацея. Индексы более предсказуемые. Вот только у меня есть таблицы с 255 столбцами. 255 дополнительных индексов по двум столбцам? Было бы лучше хинты. зачем? вот каких хинтов не хватает? чем использование хинта отличается от order by col + '' и почти все можно заfenceить при помощи CTE 21687646 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 21:36 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
drsm, order by col + '' - это хакерство. А хинт точно указывает что от базы хотят. Хотя для меня выглядит диким то, что постгрес на простую просьбу выдать первую запись начинает делать какие-то предположения о частоте встречаемости конкретного значения, не имея абсолютно никаких возможностей сделать это объективно. Это нечеловеческая логика. А значит неправильная. Посмотрите на эту тему интернет, десять лет вопросы на эту тему возникают. Сколько человекочасов потеряно. Всё что надо было - рассмотреть это как особый случай, если уж невозможно нормальный планировщик написать. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 21:51 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
Pilat01order by col + '' - это хакерство. А хинт точно указывает что от базы хотят. Эм, поясните за “точно указывает”, пожалуйста. Pilat01… Посмотрите на эту тему интернет, десять лет вопросы на эту тему возникают. Сколько человекочасов потеряно. А поискать в интернете на тему проседания производительности из-за неверных хинтов, переставших подходить к данным — можно? Сколько долларов было потрачено из-за отказа систем. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 22:24 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
Pilat01drsm, order by col + '' - это хакерство. А хинт точно указывает что от базы хотят. Хотя для меня выглядит диким то, что постгрес на простую просьбу выдать первую запись... а это тоже хакерство? Код: sql 1. 2.
если не трудно, покажите как по вашему должен выглядеть запрос с хинтом в данном случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 22:41 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
Господа, ну что вы пытаетесь доказать? Что PostgreSQL, в ответ на просьбу выбрать все строки с конкретным столбцом, отсортировать и выдать первую строку, - сортирует всю базу, потом делает последовательный поиск нужного значения и возвращает строку, и это нормально? Почему он не делает именно то что просят? Вам жена говорит "пойди в магазин купи самый тяжёлый арбуз". Вы идёте в магазин, видите что арбузов много, покупаете весь магазин, сортируете по весу все товары, раскладываете аккуратно, а потом ищете арбуз? Почему от движка ожидается другое? Пусть в базе половина - арбузы. Ну и что, она выберет все арбузы и отсортирует. Это нормальное ожидаемое поведение, хотя и долго. Но это именно то что просит пользователь. Но она-то делает прямо противоположное логике и желанию. Я понимаю что у него такой планировщик, что делает не то что от него просят и ожидают. Но это не достоинство, это недостаток. Зачем это защищать? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2018, 23:14 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
Pilat01Господа, ну что вы пытаетесь доказать? Что PostgreSQL, в ответ на просьбу выбрать все строки с конкретным столбцом, отсортировать и выдать первую строку, - сортирует всю базу, потом делает последовательный поиск нужного значения и возвращает строку, и это нормально? Почему он не делает именно то что просят? Вам жена говорит "пойди в магазин купи самый тяжёлый арбуз". Вы идёте в магазин, видите что арбузов много, покупаете весь магазин, сортируете по весу все товары, раскладываете аккуратно, а потом ищете арбуз? Почему от движка ожидается другое? Пусть в базе половина - арбузы. Ну и что, она выберет все арбузы и отсортирует. Это нормальное ожидаемое поведение, хотя и долго. Но это именно то что просит пользователь. Но она-то делает прямо противоположное логике и желанию. Я понимаю что у него такой планировщик, что делает не то что от него просят и ожидают. Но это не достоинство, это недостаток. Зачем это защищать? пусть в магазине арбузы и дыни - если арбузы лежат отдельно, то выбираем из них самый тяжёлый. - если все свалено в кучу, то перебираем все и ищем самый тяжёлый арбуз, порядок не важен. - если все свалено в кучу, но отсортировано по массе, начинаем искать самый тяжёлый арбуз, со стороны где расположены самые тяжелые фрукты. проблема в том, что в вашем случае практически все дыни тяжелее арбузов. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 00:17 |
|
Запрос с limit выполняется дольше запроса без limit
|
|||
---|---|---|---|
#18+
drsm, проблема в том, что в магазине арбузы, дыни и ещё 100500 товаров. Примерно 20.000.000 экземпляров. А не только арбузы и дыни. Из них 100 арбузов. Это в реальности, и обычно так и в базах данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 01:04 |
|
|
start [/forum/topic.php?fid=53&msg=39709055&tid=1995569]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 173ms |
0 / 0 |