|
медленный 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 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
fteDany305, Dany305для обычных таблиц эти значения близки и особой разницы нет, но для очередей это не так а эта таблица работает как очередь - интенсивно лопатиться, но живых записей мало после analyze в reltuples запишется маленькое число и планировщик будет выбирать быстрый seq scan после vacuum в reltuples запишется большое число и планировщик будет выбирать медленный index scan +1 ИМНО: индивидуальные(агрессивные) настройки autovacuum для таблицы должны помочь... вряд ли помогут в решение данной проблемы, кажется не существует настроек autovacuum, которые бы гарантировали порядок исполнения: vacuum, analyze в сходной проблеме мне помогло выключение autovacuum + ручной vacuum analyze ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2017, 20:30 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
Dany305, тут же всё расписано : //думается кост из инд-скана не берется, а берется из лимита (т.к. ре--сорта нет) если это не так -- они ещё тупее, чем я думайу kukurzik ... дело в селективности, при определенном пороге пж переключается с правильного индекса (клиент, ид) на "неправильный"(ид) Код: 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.
за счет чего так просела стоимость лимита по пк -- не ясно. неужели за счет одной лишь ширины инлекса ? на 50 записей доступов д.б. с гулькин нос (по спецу). а в пк же множитель 100/7 как минимум д.б. в костах ? с какого потолка он 51.22 высосал ? или кост этих 100/7 ещё где--то отдельно написан ? -- судя по всему -- там все херово даже с арифметикой. или пусть кто--то разъяснит, как стоимость лимита вдоль выборки (без ресорта) расписана в плане . не собирается же он сначала выфетчить унутре в себя те самые 1438, по цене 5557.34 Код: plaintext
(на кой хер там вообще эта цифра ?или стюдент 100 лет тому написал -- и хай буде ?) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2017, 20:32 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
qwwqили пусть кто--то разъяснит, как стоимость лимита вдоль выборки (без ресорта) расписана в плане . не собирается же он сначала выфетчить унутре в себя те самые 1438, по цене 5557.34 Код: plaintext
Ну вот потому и считается оценка как 2 числа: цена вывода первых записей в узле и цена на всю работу узла. Собственно, цена вывода первых записей (первая цена) и используется в случаях с LIMIT. Как оно оценивается для LIMIT 1 и/или LIMIT 50 я точно не скажу, надо в исходники лезть. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2017, 20:51 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
вдогонку: из 2-х индексов not unique (id) , unique (id,indexed) при линковке по id и без выборки поля "индексед" планер выбирает составной уникъю. (при неуникальности ид в десятые процента) Вангую -- он может прикинуть ограничение количество ид по нему. и насчитать плану меньший кост. а что это количество ограничено для всей таблы (может быть разнесено на прочие оценки) -- то пусть лошадь думает. И пусть сама связывает факт с более компактным не уникъю. забавно. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2018, 14:53 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
qwwqвдогонку: из 2-х индексов not unique (id) , unique (id,indexed) при линковке по id и без выборки поля "индексед" планер выбирает составной уникъю. (при неуникальности ид в десятые процента) Вангую -- он может прикинуть ограничение количество ид по нему. и насчитать плану меньший кост. а что это количество ограничено для всей таблы (может быть разнесено на прочие оценки) -- то пусть лошадь думает. И пусть сама связывает факт с более компактным не уникъю. забавно. а индекс по id точно более компактный (если \di+ indexname cравнить) ? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2018, 16:56 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
Alexiusа индекс по id точно более компактный (если \di+ indexname cравнить) ? их у меня 90 штук. т.ч. какие-то точно компактнее. вернее на паре кейсов отреиндексил (ещё тогда) оба -- поведение не изменилось. отпишусь позже -- сейчас дисковую нагрузил замером. и да, пж умеет извлекать из уникальности поправки к планам и костам (по лейтералам из пк видно -- планирует по 1). но кажется не умеет обобществлять общезначимые следствия из. (так же как выше по теме получая лучший план из недостаточной модели (равновероятности неизвестного)-- пренебрегает "худшим" из точного индекса-- отбросить дурной оптимистический план, который де-факто д.б. зарезан планом по верному индексу он не умеет) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2018, 17:27 |
|
медленный index scan + limit
|
|||
---|---|---|---|
#18+
Alexius, сделал Код: sql 1.
переиндексировал (чтобы без дырок) и аналайзнул. появились сканы по узкому инд-у. но остались и по широкому (если записей в плане мало). Код: sql 1. 2. 3. 4. 5.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
--тут по уникъю планируется drop UNIQUE: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
и , при массовом плане от 2--5% ожидаемо падаем в хеш Код: sql 1. 2. 3. 4. 5. 6.
при таргете в 500 все было либо хешем, либо по уникъю. откачусь. там интереснее. если поймаю разницу в планах по ожиданиям -- отпишусь. пока же резюме -- при равных костах предпочитается уникъю, даже если шире. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2018, 10:41 |
|
|
start [/forum/topic.php?all=1&fid=53&tid=1995875]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
others: | 301ms |
total: | 455ms |
0 / 0 |