|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstorm ... А какие еще варианты для пагинации? от достигнутого [WHERE {unique_index_list}>{last_index_row} ORDER BY {unique_index_list} LIMIT $Page ] или однопроходный -- "сразу всё" с сохранением нарезки границ у всех есть свои модельные ограничения, [как и у многократного оффсета в быстроменяющейся обстановке]. но затрат сильно меньше ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2016, 17:32 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstormА какие еще варианты для пагинации? http://www.slideshare.net/MarkusWinand/p2d2-pagination-done-the-postgresql-way ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2016, 19:49 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
qwwqmaxxstorm ... А какие еще варианты для пагинации? от достигнутого [WHERE {unique_index_list}>{last_index_row} ORDER BY {unique_index_list} LIMIT $Page ] или однопроходный -- "сразу всё" с сохранением нарезки границ у всех есть свои модельные ограничения, [как и у многократного оффсета в быстроменяющейся обстановке]. но затрат сильно меньше Добавил индекс по tag_id, material_id. Теперь backword план работает при лимите 1000. Осталось переписать пагинацию ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2016, 09:44 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
Вот план: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Еще вопрос, если я добавлю в exist еще одно поле(stop=false), мне надо будет сделать тройной индекс (tag_id, material_id, stop) или просто добавить к существующему (tag_id, material_id) одинарный индекс на поле stop? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2016, 10:25 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
После создания индекса (material_id, tag_id) выяснилось, что есть теги, которые редко встречаются и для них план запрос "вдоль индекса не подходит", зато старый(джойн) работает быстро. Для сравнения 2 разных плана для одного и того же запроса: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2016, 16:11 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstormПосле создания индекса (material_id, tag_id) выяснилось, что есть теги, которые редко встречаются и для них план запрос "вдоль индекса не подходит"... Код: sql 1. 2. 3. 4. 5. 6. 7.
получается по 1000 пустых поисков на запись, а не по 20, как ожидалось. т.е. в 50 раз дороже ожидаемого. можете в таблицах тагов вести колонку "статистики" частотности тега, и по ней выбирать запрос, который натравливать на ваш таг. (вот так , да, всё ручками). второй вариант -- вести массивы тагов (tags int[]) материала в той же таблице, где даты. в новом поле. пользоваться btree_gist смешанным индексом (data,tags) . Никаких джойнов -- все в одном. но при частых апдейтах это будет скорее головной болью, чем решением. хотя рискнуть можно. все удобства от Бортунова и К. они это всё в свое время понаписали. по поводу "стопа" -- надо смотреть , зачем он вам. есть много вариаций. условный индекс в т.ч. (WHERE NOT stop), а в составном оно д.б. первым номером. в конце оно бессмысленно. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2016, 18:01 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
qwwq получается по 1000 пустых поисков на запись, а не по 20, как ожидалось. т.е. в 50 раз дороже ожидаемого. можете в таблицах тагов вести колонку "статистики" частотности тега, и по ней выбирать запрос, который натравливать на ваш таг. (вот так , да, всё ручками). второй вариант -- вести массивы тагов (tags int[]) материала в той же таблице, где даты. в новом поле. пользоваться btree_gist смешанным индексом (data,tags) . Никаких джойнов -- все в одном. но при частых апдейтах это будет скорее головной болью, чем решением. хотя рискнуть можно. все удобства от Бортунова и К. они это всё в свое время понаписали. по поводу "стопа" -- надо смотреть , зачем он вам. есть много вариаций. условный индекс в т.ч. (WHERE NOT stop), а в составном оно д.б. первым номером. в конце оно бессмысленно. Спасибо за советы, вы очень помогли. Еще вопрос из той же области. Есть 2 БД одинаковой структуры, тест и бой. Один и тот же запрос идет по разным планам(таблицы те же): Код: sql 1. 2. 3.
Тест: Код: sql 1. 2. 3. 4. 5. 6.
Бой: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
В чем причина? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2016, 13:04 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstorm, по всему, у вас данные разные. в тест "actual time=0.049..0.053 rows=3 loops=1", в боевом"actual time=1321.956..1321.956 rows=0 loops=1". с разными данными, их количеством, или распределением по таблице, можно получить разные планы. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2016, 13:35 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
Lonepsychomaxxstorm, по всему, у вас данные разные. в тест "actual time=0.049..0.053 rows=3 loops=1", в боевом"actual time=1321.956..1321.956 rows=0 loops=1". с разными данными, их количеством, или распределением по таблице, можно получить разные планы. На боевом их больше в 1.5 раза. Я понимаю, что проблема решается составным индексом (tag_id, material_id), но все равно интересно знать почему так происходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2016, 13:39 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstormqwwqполучается по 1000 пустых поисков на запись, а не по 20, как ожидалось. т.е. в 50 раз дороже ожидаемого. можете в таблицах тагов вести колонку "статистики" частотности тега, и по ней выбирать запрос, который натравливать на ваш таг. (вот так , да, всё ручками). второй вариант -- вести массивы тагов (tags int[]) материала в той же таблице, где даты. в новом поле. пользоваться btree_gist смешанным индексом (data,tags) . Никаких джойнов -- все в одном. но при частых апдейтах это будет скорее головной болью, чем решением. хотя рискнуть можно. все удобства от Бортунова и К. они это всё в свое время понаписали. по поводу "стопа" -- надо смотреть , зачем он вам. есть много вариаций. условный индекс в т.ч. (WHERE NOT stop), а в составном оно д.б. первым номером. в конце оно бессмысленно. Спасибо за советы, вы очень помогли. Еще вопрос из той же области. Есть 2 БД одинаковой структуры, тест и бой. Один и тот же запрос идет по разным планам(таблицы те же): Код: sql 1. 2. 3.
Тест: Код: sql 1. 2. 3. 4. 5. 6.
Бой: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
В чем причина? причина в cost--based оптимизации и статистиках, на которые она опирается. например почему то для заданного материал_ид оно ожидает 1869 строк, а находит 6 -- разница более чем в 2 порядка. как вот оно так ? вы давно статистику собирали ? или индекс нажрался мертвых строк ? то же по тагам -- ожидания в 3 раза меньше реальности. ну это нщё сносно. сделайте енейбл битмап скан ту офф -- и посмотрите на оценку цены в плане для "хорошего" плана. в пж слишком мало костовых констант -- видимо оптимайзер модельно очень дубовый. костами спихнуть с одного индексного поиска на другой тип индексного же поиска не удастся, думаю, хотя можно попробовать. (а енейблы сосут при 10^9 строк, т.к. "большая" константа пропадает на фоне). ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2016, 15:00 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
qwwqпричина в cost--based оптимизации и статистиках, на которые она опирается. например почему то для заданного материал_ид оно ожидает 1869 строк, а находит 6 -- разница более чем в 2 порядка. как вот оно так ? вы давно статистику собирали ? или индекс нажрался мертвых строк ? то же по тагам -- ожидания в 3 раза меньше реальности. ну это нщё сносно. сделайте енейбл битмап скан ту офф -- и посмотрите на оценку цены в плане для "хорошего" плана. в пж слишком мало костовых констант -- видимо оптимайзер модельно очень дубовый. костами спихнуть с одного индексного поиска на другой тип индексного же поиска не удастся, думаю, хотя можно попробовать. (а енейблы сосут при 10^9 строк, т.к. "большая" константа пропадает на фоне). Статистику собирал непосредственно перед запросом. Насчет мертвых строк сомневаюсь. Когда они появляются? При делетах? Если выключить битмапскан, то план хороший: Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2016, 15:12 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstormЕсли выключить битмапскан, то план хороший: Код: sql 1. 2. 3. 4. 5. 6.
вот у вас оценка пессимистическая "6676.53" при ожидании 4 строк. она больше пессимистической оценки для битмапа (cost=5262.46..5278.50). а вот откуда она такая большая ? я бы с потолка насчитал 4 произвольных ценой (если не крутили) по 4 + найти нужную страничку индексов -- чтонть пессимистически странички 4 -- максимум 20--32 по произвольным набегает. откуда это вот угрёбище нагребает 6676.53 -- тайна великая есть. могабыть в статистике что ? и зачем сравнивает только писси-мяссиские велчичины. "и вот всё у них так."(сс) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2016, 16:24 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
qwwq, всё время путаюсь. диапазон костов -- это оценка затрат на вывод первой и последней строки соответственно. из 4. а не пессимистич/оптимистич. см https://habrahabr.ru/post/203320/ вот откуда оно 6000 набрало -- хз ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2016, 16:34 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
qwwq, Оценка строится на `%_cost` параметрах. Основная доля там — обращение к страницам, для индексов это `random_page_cost`. Учитвыая, что ожидается всего 4 записи и также то, что индекс читается не весь, а "по дереву", то оценка в 6600 довольна высока. Возможно (я не разбирался в оценке индексных доступов, только последовательных) сюда закладывается также и доступ к 4-м (в худшем случае) блокам из основной таблицы. Но всё равно — это очень много для 4-х записей. А что выведет `EXPLAIN (analyze, buffers)`? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2016, 16:46 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
vyegorovqwwq, Оценка строится на `%_cost` параметрах. Основная доля там — обращение к страницам, для индексов это `random_page_cost`. Учитвыая, что ожидается всего 4 записи и также то, что индекс читается не весь, а "по дереву", то оценка в 6600 довольна высока. Возможно (я не разбирался в оценке индексных доступов, только последовательных) сюда закладывается также и доступ к 4-м (в худшем случае) блокам из основной таблицы. Но всё равно — это очень много для 4-х записей. А что выведет `EXPLAIN (analyze, buffers)`? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2016, 16:50 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
Если без скана, то Код: sql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2016, 17:13 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
vyegorovqwwq, Оценка строится на `%_cost` параметрах. Основная доля там — обращение к страницам, для индексов это `random_page_cost`. Учитвыая, что ожидается всего 4 записи и также то, что индекс читается не весь, а "по дереву", то оценка в 6600 довольна высока. Возможно (я не разбирался в оценке индексных доступов, только последовательных) сюда закладывается также и доступ к 4-м (в худшем случае) блокам из основной таблицы. Но всё равно — это очень много для 4-х записей. А что выведет `EXPLAIN (analyze, buffers)`? я вот думаю, что ожидается 4 записи после фильтра. м.б. до фильтра ожидается какое--то безумное число ? надо бы пошаманить -- посмотреть что в pg_statistic валяется и как это м.б. связано с той цифирью, которую мы видим как результат накрутки костов для 4--х доступов. думаю -- все таки бага где--то. или мы какой--то инфы о модели не знаем (стотысячмиллионов апдейтов, например) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2016, 18:33 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2016, 18:42 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstormvyegorovqwwq, Оценка строится на `%_cost` параметрах. Основная доля там — обращение к страницам, для индексов это `random_page_cost`. Учитвыая, что ожидается всего 4 записи и также то, что индекс читается не весь, а "по дереву", то оценка в 6600 довольна высока. Возможно (я не разбирался в оценке индексных доступов, только последовательных) сюда закладывается также и доступ к 4-м (в худшем случае) блокам из основной таблицы. Но всё равно — это очень много для 4-х записей. А что выведет `EXPLAIN (analyze, buffers)`? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
А у вас случайно 1)default_statistics_target на тесте и в бою не отличается? 2)случайно не выставлен руками n_distinct на san_materialdata_eb4b9aaa.material_id в тесте или другое значение statistic? Что говорит Код: plsql 1.
в бою и в тесте? И меняется ли что то после ручного выполнения analyze san_materialdata_eb4b9aaa; в бою и в тесте в результатах explain analyze? Вероятнее всего не хватает статистки в бою адекватной и надо будет или statistics поднимать для поля (или по всей базе) или n_distinct ему руками прописывать. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2016, 03:31 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
Maxim BogukА у вас случайно 1)default_statistics_target на тесте и в бою не отличается? 2)случайно не выставлен руками n_distinct на san_materialdata_eb4b9aaa.material_id в тесте или другое значение statistic? Что говорит Код: plsql 1.
в бою и в тесте? И меняется ли что то после ручного выполнения analyze san_materialdata_eb4b9aaa; в бою и в тесте в результатах explain analyze? Вероятнее всего не хватает статистки в бою адекватной и надо будет или statistics поднимать для поля (или по всей базе) или n_distinct ему руками прописывать. -- Maxim Boguk www.postgresql-consulting.ru 1) default_statistics_target одинаковая, равна 100 2) n_distinct руками не ставился, но он различается, на бою 63880, на тесте 47247 3) Для explain analyze select * from san_materialdata_eb4b9aaa where material_id = 5858304 планы тоже различаются: Бой: Код: sql 1. 2. 3. 4. 5. 6. 7.
Тест: Код: sql 1. 2. 3. 4.
Однако, после сбора статистики, план на бою становится таким же как на тесте, что нельзя сказать о первоначальном запросе. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2016, 09:12 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
планировщик считает кост не для 4 строк, а для 1878, поэтому такая оценка большая. что выдает запрос Код: sql 1.
? скорей всего надо будет добавить статистики по этому полю, чтобы не было ошибки на 2 порядка: Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2016, 11:32 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
Alexius планировщик считает кост не для 4 строк, а для 1878, поэтому такая оценка большая. что выдает запрос Код: sql 1.
? скорей всего надо будет добавить статистики по этому полю, чтобы не было ошибки на 2 порядка: Код: sql 1. 2.
Вот что выдает: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2016, 11:37 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
Alexiusalter table san_materialdata alter column material_id set statistics 1000; analyze san_materialdata; [/src] Сделал, план запроса стал хорошим: Код: sql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2016, 11:43 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
Еще похожая проблема с запросом Код: sql 1. 2. 3.
Выдает план: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Однако, если взять другой тег Код: sql 1. 2. 3.
или меньший интервал Код: sql 1. 2. 3.
то план тот, что нужно: Код: sql 1. 2. 3. 4. 5. 6. 7.
Насколкьо страшно будет, если отключить enable_bitmapscan? Как решить без отключения? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2016, 14:23 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
А вот для другого тега план такой же, но ожидаемое количество записей на порядок меньше реального: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2016, 17:20 |
|
|
start [/forum/topic.php?fid=53&msg=39330088&tid=1996781]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 152ms |
0 / 0 |