|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
Имеем часто обновляемую таблицу insert/delete, куда пишется контент для клиентов (~500 строк), при получении данных клиентом соответствующие кортежи удаляются. Однако порой клиент появившись не торопится забирать данные. Когда же он наконец, начинает радостно кормится, возникает у ПЖ крайняя степень натуги. Приближенная схема таблицы: id primary key, content text, client_number int index, creation_date timestamp. Данные развернуты из дампа. Postgres (9.6, 10). Таблица ~ 1.3GB Код: 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.
По мере разгребания время выполнения равномерно уменьшается. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
В штатном режиме все очень даже годно Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Хочется, чтобы ПЖ не слишком тужился при разгребании. Меняем поля сортировки...и... имеем дикую деградацию в обратном порядке. Код: 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. 44. 45. 46. 47.
в последнем случае ПЖ кормится ~ 38GB. Имеются ли способы лечения странного поведения? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2017, 13:16 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
kukurzik, Сделать подходящие под эти запросы индексы естественно. client_number, id, creation_date он покроет оба варианта запросов ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2017, 13:20 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
Maxim Boguk, лопух! слона и не приметил. благодарю премного. //и все же.. чтение 38 Gb при размере таблицы в 30 раз меньше, откуда здесь ноги растут? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2017, 13:42 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
kukurzikоткуда здесь ноги растут? для второго случая обратите внимание на то, какой индекс используется. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2017, 13:51 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
vyegorovkukurzikоткуда здесь ноги растут? для второго случая обратите внимание на то, какой индекс используется. при "нормальной" оценке и "нормальной" статистике (в неком гипотетическом смысле слова "нормальный") естественно ожидать секскана, задолго до. положим, индексы и табличка забиты дохлыми записями, а статистика сама по себе с низкими целями. или косты рендома вывернуты в 1. -- получим что--то вроде отказа перейти на секскан вовремя. нет ? а так -- да -- тс-у достаточно составного индекса. я бы дату выбросил совсем -- порядок и так полностью определяется парой ["что--то","ПК"]. далее уже перемешивание воздуха и тавтология. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2017, 14:25 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
[quot qwwq]vyegorovя бы дату выбросил совсем -- порядок и так полностью определяется парой ["что--то","ПК"]. далее уже перемешивание воздуха и тавтология. Это правда... надо дату из индекса убрать и из запроса убрать. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2017, 15:07 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
Подозреваю, что дату впихнули в сортировку, чтобы ускорить выдачу, ибо до нужного индекса не дожевали. Разумеется, дата ни к чему. Что касается статистики, то она свежа. никакого блоата и дохлых записей, ибо замеры на базе из бэкапа развернутой. Никаких экзотических правок в конфиги не вносилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2017, 15:28 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
kukurzik, сделайте order by id+0 , чтобы пж не сваливался на выборку по ид. пока/если составной индекс не сделали. пусть по клиенту шукает. //как показывает https://habrahabr.ru/post/343686/ -- составной не панацея. пж грязь найдёт. можно и тут индекс сделать сразу по (клиент,(ид+0)) , с таким же ордербаем в запросе -- чтобы избежать того, что по сцылке. (!)но свои енейблы и косты могли бы и процитировать. для подумать. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2017, 15:59 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
qwwq, все параметры кроме шаред буфферс (2GB) и ворк мем(16MB) по дефолту # - Planner Method Configuration - #enable_bitmapscan = on #enable_hashagg = on #enable_hashjoin = on #enable_indexscan = on #enable_indexonlyscan = on #enable_material = on #enable_mergejoin = on #enable_nestloop = on #enable_seqscan = on #enable_sort = on #enable_tidscan = on # - Planner Cost Constants - #seq_page_cost = 1.0 # measured on an arbitrary scale #random_page_cost = 4.0 # same scale as above #cpu_tuple_cost = 0.01 # same scale as above #cpu_index_tuple_cost = 0.005 # same scale as above #cpu_operator_cost = 0.0025 # same scale as above #parallel_tuple_cost = 0.1 # same scale as above #parallel_setup_cost = 1000.0 # same scale as above #min_parallel_table_scan_size = 8MB #min_parallel_index_scan_size = 512kB #effective_cache_size = 4GB ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2017, 16:31 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
qwwq, авторможно и тут индекс сделать сразу по (клиент,(ид+0)) , с таким же ордербаем в запросе да, добавил чуток грязи и пж снова стал первичный ключ терзать. индекс по (id+0) исправил это, пока противоправных действий не обнаружил. однако, так ли необходим ордербай по (клиент,(ид+0), кажется, что ордербай просто по (ид+0) справляется. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2017, 17:18 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
kukurzikqwwq, авторможно и тут индекс сделать сразу по (клиент,(ид+0)) , с таким же ордербаем в запросе да, добавил чуток грязи и пж снова стал первичный ключ терзать. печалька. хотя надо бы вдумчиво посмотреть на обстоятельства и на статистику -- тут Alexius её handjob--тюнинг асилил кажется, для больших табличек kukurzikиндекс по (id+0) исправил это, пока противоправных действий не обнаружил. грустно это. хотелось бы без оного. могабыть что--то не учли ? нет ? одербай конечно при фиксе по пре--фиксу не нужен. тут пж пока сам справляется. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2017, 17:34 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
qwwq, да, добавил чуток грязи и пж снова стал первичный ключ терзать. хотя надо бы вдумчиво посмотреть на обстоятельства и на статистику -- тут Alexius её handjob--тюнинг асилил кажется, для больших табличек ошибся с высказыванием, грязь тут на n-ом месте, ваккум не фулл справляется со статистикой. дело в селективности, при определенном пороге пж переключается с правильного индекса (клиент, ид) на "неправильный"(ид) Код: 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.
Так что, спасёт правильный строй либо хакнутый индекс (клент, ид+0), либо (клиен, ид, дата) с сортировкой по (ид, дате) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2017, 12:08 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
kukurzik, понял. болезнь 21025942 пренебрежения точным знанием при наличии неточной оценки снизу по "другому плану" (пробивающему точную оценку за счёт кладки болтов на ). нужно перелопачивать весь планировщик -- втемяшивая ему, что точное знание статистики для спец инд-а запрещает ему применять модель независимых распределений для приблудных помесей. и как оно служит в очистке ? (зачем в 10--ке возможность сбора статистики по корреляциям -- если оно так легко перепрыгивает на независимую модель закрывая глаза на наличие безусловного запрета к применению оной модели). есть подозрение ,что немеряно математики придётся изменить, чтобы оно так себя больше не вело. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2017, 12:38 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
kukurzik-- ~6.5% и праздник закончился "Limit (cost=0.43..51.22 rows=50 width=659) (actual time=450.099..450.271 rows=50 loops=1)" " Buffers: shared hit=692852" " -> Index Scan using transfers_pkey on transfers (cost=0.43..604537.41 rows=595121 width=659) (actual time=450.097..450.266 rows=50 loops=1)" " Filter: (client_number = 110)" " Rows Removed by Filter: 951480" " Buffers: shared hit=692852" "Planning time: 0.388 ms" "Execution time: 450.332 ms" Hm... интересные дела творятся... а если сделать вот что: show default_statistics_target; на всякий случай так же analyze transfers; а дальше select count(*) from transfers; select count(*) from transfers where client_number = 110; select max(id), min(id) from transfers; select max(id), min(id) from transfers where client_number = 110; explain analyze select * from transfers where client_number = 110; если не сложно приведите результаты всего этого... так же на 10тке сделайте create statistics trasfers_client_number_id_stat on client_number, id from transfers; analyze transfers; explain (analyze, buffers) SELECT id FROM transfers WHERE client_number = 110 ORDER BY id LIMIT 50; похожу у вас client_number и id сильно скоррелированы что очень странно. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2017, 14:00 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
Maxim Boguk, Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2017, 14:25 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
Maxim Boguk, Сделал на 10-ке взлетело, но надолго ли полета этого хватит? однако ж все равно еще долго иметь дело на проде с 9.4 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2017, 14:29 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
kukurzik, На 9.4 сделайте запрос с SELECT id, а не SELECT * Видите, на 10-ке уже INDEX ONLY SCAN подцепился, может и 9.4 планировщик посчитает это дешевле. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2017, 15:02 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
Радость за 10 была преждевременной. Не тот запрос подсунули: SELECT id FROM transfers WHERE client_number = 110 ORDER BY id LIMIT 50; вместо SELECT * FROM transfers WHERE client_number = 110 ORDER BY id LIMIT 50; а именно он и нужен, и наблюдаем прежнее соплежуйство. Код: sql 1. 2. 3. 4. 5. 6.
на 9.4 SELECT id FROM transfers WHERE client_number = 110 ORDER BY id LIMIT 50; тоже индекс онли скан хорошо прожевывает. оно, конечно, и со * легким вывертом встает на ноги, но как же хочется без акробатики прожить. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2017, 15:53 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
kukurzik, Hm а что реально дает запрос SELECT id FROM transfers WHERE client_number = 110 ORDER BY id LIMIT 50; какие 50 цифр? и нет ли ситуации что client_id крайне неравномерно распределены по пространству id ? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2017, 16:02 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
kukurzik, думается там глобальный кусок ссохшегося за века кода надо откалывать и выбрасывать вместе с идеологией сравнения независимых альтернативных планов. т.ч. копите хитрые отвертки с левым винтом -- они вам ещё пригодятся. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2017, 16:04 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
Maxim Boguk, 6388990746 6388991673 6388991982 6388992600 6388993218 6388993836 6388994454 6388995072 6388995674 6388995999 6388996926 6388997544 6388998162 6388998780 6388999398 6389000016 6389000634 6389001252 6389001870 6389002488 6389003106 6389003724 6389004033 6389005423 6389005578 6389006196 6389006814 6389007123 6389007432 6389008359 6389008668 6389009286 6389009904 6389010522 6389011449 6389012067 6389012799 6389013612 6389014230 6389015036 6389015635 6389015775 6389016084 6389016393 6389017011 6389017614 6389018247 и нет ли ситуации что client_id крайне неравномерно распределены по пространству id ? всё должно быть примерно равномерно размазано. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2017, 16:12 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
Maxim Boguk, там классическая логическая ошибка -- применение допущения в ситуации, когда она опровергается наличным планом по подходящему индексу см: https://habrahabr.ru/post/343686/#comment_10557452 т.ч. надрачивать на статистику бессмысленно надо пж математике начинать учить. -- когда левые допущения считаются протухшими, например. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2017, 16:13 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
kukurzikИмеем часто обновляемую таблицу insert/delete, куда пишется контент для клиентов (~500 строк), при получении данных клиентом соответствующие кортежи удаляются. Однако порой клиент появившись не торопится забирать данные. Когда же он наконец, начинает радостно кормится, возникает у ПЖ крайняя степень натуги. Хочется, чтобы ПЖ не слишком тужился при разгребании. ... Меняем поля сортировки...и... имеем дикую деградацию в обратном порядке. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
вот тут похоже на проблему (cost=0.44..624513.38 rows=761521 width=8) (actual time=1.198..1.740 rows=50 loops=1)" планировщик оценивает число записей в таблице по reltuples из pg_class, прикол в том, что vacuum пишет туда "Live Tuples" + "Dead Tuples", а analyze "Live Tuples" для обычных таблиц эти значения близки и особой разницы нет, но для очередей это не так а эта таблица работает как очередь - интенсивно лопатиться, но живых записей мало после analyze в reltuples запишется маленькое число и планировщик будет выбирать быстрый seq scan после vacuum в reltuples запишется большое число и планировщик будет выбирать медленный index scan ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2017, 19:09 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
Dany305, Это поведение из-за LIMIT 50. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2017, 19:25 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
Dany305, Dany305для обычных таблиц эти значения близки и особой разницы нет, но для очередей это не так а эта таблица работает как очередь - интенсивно лопатиться, но живых записей мало после analyze в reltuples запишется маленькое число и планировщик будет выбирать быстрый seq scan после vacuum в reltuples запишется большое число и планировщик будет выбирать медленный index scan +1 ИМНО: индивидуальные(агрессивные) настройки autovacuum для таблицы должны помочь... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2017, 20:14 |
|
|
start [/forum/topic.php?fid=53&fpage=57&tid=1995875]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
96ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 186ms |
0 / 0 |