|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
vyegorovmaxxstorm, В первом плане было: Код: sql 1. 2. 3. 4.
Потом стало: Код: sql 1. 2. 3.
Что за сервер? И что на нём кроме базы бегает? Это от разных запросов планы. На сервере еще много сервисов, rabbitmq, например. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 11:35 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
Пробую выполнить другой запрос: Код: sql 1.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Выполняю запрос второй раз: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Кэш? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 12:27 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstorm, Скорее всего. `EXPLAIN (analyze, buffers)` покажет доступ к блокам. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 13:13 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstormПробую выполнить другой запрос: Код: sql 1.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Выполняю запрос второй раз: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Кэш? Не кеш. Ну точнее кеш не в том смысле что вы думаете. В первом случае куча данных читалась с диска (что не быстро). Во втором случае данные читались из shared buffers базы. Хотите чтобы было быстро - данные должны в shared buffers лежать (учитывая что сервер не выделенный и походу с очень медленными дисками). И про увеличение shared buffers я вам написал уже. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 13:27 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
Maxim Boguk Не кеш. Ну точнее кеш не в том смысле что вы думаете. В первом случае куча данных читалась с диска (что не быстро). Во втором случае данные читались из shared buffers базы. Хотите чтобы было быстро - данные должны в shared buffers лежать (учитывая что сервер не выделенный и походу с очень медленными дисками). И про увеличение shared buffers я вам написал уже. -- Maxim Boguk www.postgresql-consulting.ru Но база весит 50гб, а shared buffers у меня 16 гб. Как быть? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 13:46 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstorm Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
надо бороться за другой план : в ожидании,, что условие фильтра вдоль индекса "" Код: sql 1.
у вас выполняется довольно часто, и 50 наберется быстро. как загнать -- надо думать. я предлагал авториндекс (tag_id,material_id) (10--20 отыграть множитель) но попробуйте [без этого индекса] LIMIT 1 пока поставить в итоге, вместо 50 . потом костами (не помню, но каким то костом запинывалось) или енейблами хеш--агг/джойн ('enable_hashagg','enable_hashjoin' TO OFF) отключить -- посмотрим, как быстро вдоль индекса по detection_datetime условие фильтра срабатывает. не надо нам эти пол--ляма читать, а потом сортировать дикие выборки, думаю. (там на 50 умножить -- время оценить) но если фильтр не так часто -- то тогда пж всё правильно делает. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 14:26 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
vyegorovmaxxstorm, Скорее всего. `EXPLAIN (analyze, buffers)` покажет доступ к блокам. Показывает вот что: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Я так понимаю, что 271373 записи уже были в буфере? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 14:34 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
вспомнил, как запинывать без енейблов : qwwqqwwq Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
ожидаемые затраты - 50*5 произвольных доступов вдоль индекса + до ~20 [тагов в материале] -- вдоль проверяемого (полу--пессимистическая 50*5*20). если конечно вы оффсет потом не напишете. неплохо пойдет индекс (tag_id,material_id) или симметричный. чтобы вот в ту 20--ку не упираться. а лейтерал не нужен, вы из второй только фильтр дёргаете, его екзистс исполняет. --поправил и покажите план, даже если плохой . (если не дождетесь аналайза -- то просто план) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 14:43 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
qwwqвспомнил, как запинывать без енейблов : qwwqпропущено... --поправил и покажите план, даже если плохой . (если не дождетесь аналайза -- то просто план) С limit 1 очень быстро работает(и первоначальный запрос тоже): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
А если поставить limit 10, то уже идет по другому плану ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 14:53 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstorm, Ну вот -- 23 лупа на попадание в фильтр, как ожидалось. т.е. бороться за такой план стоит можно конечно угробище родить в стиле а-ля лузскан ( "with recursive " -- вот это вот всё), но лучше енейблами запинать. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 15:03 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
qwwqНу вот -- 23 лупа на попадание в фильтр что--то не то посмотрел : Код: sql 1.
--- а, кажется все правильно. 23 лупа вдоль времени, а в нутре еще фильтр по тагу сработал на 18--й раз. Был бы составной -- было бы в этот раз в 18 раз дешевле. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 15:08 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstormПоказывает вот что: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Я так понимаю, что 271373 записи уже были в буфере? Это не записи, это блоки, каждый по 8192 байта. Запрос поднимает слишком много холодных данных с дисков. Вам его следует переписать -- если для `LIMIT 1` запрос отрабатывает быстро, loose index scan может помочь. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 15:39 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
qwwqmaxxstorm, Ну вот -- 23 лупа на попадание в фильтр, как ожидалось. т.е. бороться за такой план стоит можно конечно угробище родить в стиле а-ля лузскан ( "with recursive " -- вот это вот всё), но лучше енейблами запинать. Я все равно не понимаю, почему планы разные для разных лимитов? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 16:03 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstormqwwqmaxxstorm, Ну вот -- 23 лупа на попадание в фильтр, как ожидалось. т.е. бороться за такой план стоит можно конечно угробище родить в стиле а-ля лузскан ( "with recursive " -- вот это вот всё), но лучше енейблами запинать. Я все равно не понимаю, почему планы разные для разных лимитов? патамушта "вдоль индекса" заканчивает чтение тогда, когда набирается LIMIT (такой унутре там луп с выходом по условию лимита) , и оценка цены (cost) растёт линейно с ограничением в лимите. а план для хеш-а вычитывает всё (что нужно соединять) всегда, и лимит берёт уже после соединения этого всего и сорта всего насоединенного (а вот "вдоль индекса" ресорт не нужен). т.е. его цена константна (для заданных статистик). вы можете подсобрать статистику наново, подкрутить косты (сделать цену рендом доступа не 4, а скажем 2), и напрямую залочить для вашего запроса енейблы хеш--траляля (см выше). но это грубо. тонко -- написать with recursive перебор, и добавить удешевляющий его индекс (тогда и хак с +0 убрать). есть ещё подозрение, что у вас табличка (одна из, или обе) может сильно апдейтиться -- тогда в цену войдет лишняя пробежка по дед-ровсам, например. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 17:19 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
qwwqmaxxstormпропущено... Я все равно не понимаю, почему планы разные для разных лимитов? патамушта "вдоль индекса" заканчивает чтение тогда, когда набирается LIMIT (такой унутре там луп с выходом по условию лимита) , и оценка цены (cost) растёт линейно с ограничением в лимите. а план для хеш-а вычитывает всё (что нужно соединять) всегда, и лимит берёт уже после соединения этого всего и сорта всего насоединенного (а вот "вдоль индекса" ресорт не нужен). т.е. его цена константна (для заданных статистик). вы можете подсобрать статистику наново, подкрутить косты (сделать цену рендом доступа не 4, а скажем 2), и напрямую залочить для вашего запроса енейблы хеш--траляля (см выше). но это грубо. тонко -- написать with recursive перебор, и добавить удешевляющий его индекс (тогда и хак с +0 убрать). есть ещё подозрение, что у вас табличка (одна из, или обе) может сильно апдейтиться -- тогда в цену войдет лишняя пробежка по дед-ровсам, например. Андейтится да, довольно часто ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 17:22 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
qwwqmaxxstormпропущено... Я все равно не понимаю, почему планы разные для разных лимитов? патамушта "вдоль индекса" заканчивает чтение тогда, когда набирается LIMIT (такой унутре там луп с выходом по условию лимита) , и оценка цены (cost) растёт линейно с ограничением в лимите. а план для хеш-а вычитывает всё (что нужно соединять) всегда, и лимит берёт уже после соединения этого всего и сорта всего насоединенного (а вот "вдоль индекса" ресорт не нужен). т.е. его цена константна (для заданных статистик). вы можете подсобрать статистику наново, подкрутить косты (сделать цену рендом доступа не 4, а скажем 2), и напрямую залочить для вашего запроса енейблы хеш--траляля (см выше). но это грубо. тонко -- написать with recursive перебор, и добавить удешевляющий его индекс (тогда и хак с +0 убрать). есть ещё подозрение, что у вас табличка (одна из, или обе) может сильно апдейтиться -- тогда в цену войдет лишняя пробежка по дед-ровсам, например. Помогите написать with recursive. Не могу понять как ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2016, 15:41 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstormqwwqпропущено... патамушта "вдоль индекса" заканчивает чтение тогда, когда набирается LIMIT (такой унутре там луп с выходом по условию лимита) , и оценка цены (cost) растёт линейно с ограничением в лимите. а план для хеш-а вычитывает всё (что нужно соединять) всегда, и лимит берёт уже после соединения этого всего и сорта всего насоединенного (а вот "вдоль индекса" ресорт не нужен). т.е. его цена константна (для заданных статистик). вы можете подсобрать статистику наново, подкрутить косты (сделать цену рендом доступа не 4, а скажем 2), и напрямую залочить для вашего запроса енейблы хеш--траляля (см выше). но это грубо. тонко -- написать with recursive перебор, и добавить удешевляющий его индекс (тогда и хак с +0 убрать). есть ещё подозрение, что у вас табличка (одна из, или обе) может сильно апдейтиться -- тогда в цену войдет лишняя пробежка по дед-ровсам, например. Помогите написать with recursive. Не могу понять как "по одной записи вдоль индекса" а с каким лимитом план ещё такой ? может быть запинаем пересбором статистики, не ? а то предвижу геморрой, так как индекс по неуникальному полю, надо писать в ордер бай уникализирующий постфикс, а это поделие передовых студентов камнедробилки(тм) сразу свалится в сорт по всей выборке, придётся писать ручной проход (внутри той же конструкции) только до следующего значения вдоль неуникального индекса с ручной же сортировкой частичной выборки. или , для простоты, построить индекс (дата, ид) -- уникальный за счет постфикса "ид", и бегать с гораздо меньшим хенджобом вдоль него. т.е. на страничку А4 будет запрос, с кучкой трюков -- оно вам надо ? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2016, 16:14 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
qwwqmaxxstormпропущено... Помогите написать with recursive. Не могу понять как "по одной записи вдоль индекса" а с каким лимитом план ещё такой ? может быть запинаем пересбором статистики, не ? а то предвижу геморрой, так как индекс по неуникальному полю, надо писать в ордер бай уникализирующий постфикс, а это поделие передовых студентов камнедробилки(тм) сразу свалится в сорт по всей выборке, придётся писать ручной проход (внутри той же конструкции) только до следующего значения вдоль неуникального индекса с ручной же сортировкой частичной выборки. или , для простоты, построить индекс (дата, ид) -- уникальный за счет постфикса "ид", и бегать с гораздо меньшим хенджобом вдоль него. т.е. на страничку А4 будет запрос, с кучкой трюков -- оно вам надо ? С limit 4 план такой же, а вот 5 уже тот старый. Что значит запинаем статистикой? Авто analyze? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2016, 16:18 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
[quot qwwq]maxxstormхак с +0 qwwq, мог бы поподробнее рассказать или кинуть ссылку про этот хак: когда в каких случаях помогает/использовать? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2016, 09:09 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
Legushka, Индексируются значения аттрибутов (колонки таблиц или результаты функций). Если в запросе использовать не сам аттрибут, а выражение с ним (включая явное/неявное приведение типов), то индекс неприменим. В данном случае, если к индексированной числовой колонке прибавить 0, то значение колонки не измениться, но вот индекс уже применить нельзя, т.к. выборка делается не по атрибуту, а по результату выражения над ним. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2016, 13:35 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
qwwqвспомнил, как запинывать без енейблов : qwwqпропущено... --поправил и покажите план, даже если плохой . (если не дождетесь аналайза -- то просто план) На другой бд(тестовой) выполняется дольше этот запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
С чем это может быть связано? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2016, 15:05 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
Причем даже если поставить limit 50, то план запроса не меняется: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2016, 15:39 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
qwwq Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
ожидаемые затраты - 50*5 произвольных доступов вдоль индекса + до ~20 [тагов в материале] -- вдоль проверяемого (полу--пессимистическая 50*5*20). если конечно вы оффсет потом не напишете. неплохо пойдет индекс (tag_id,material_id) или симметричный. чтобы вот в ту 20--ку не упираться. а лейтерал не нужен, вы из второй только фильтр дёргаете, его екзистс исполняет. не сразу прочитал про оффсет, а он будет нужен потом( Так что backword не подходит походу ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2016, 16:28 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstormне сразу прочитал про оффсет, а он будет нужен потом( Так что backword не подходит походу с этого бы и начинали любителей пагинации оффсетом не лечим совсем как и любителей отрезать хвост собакам тонкими слайсами или искать следующий (от текущего "n--го") элемент в связанном списке -- перебором всех n+1 от начала, а не прямым переходом к next т.е. принципиально неоперабельные клинические случаи тогда ПЖ вам все правильно делает -- соединяет всё со всем, всё до конца сортирует, и , старательно слюнявя пальчик, отсчитывает в этой бескрайней простынке с нужного места по нужное место. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2016, 17:16 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
qwwqmaxxstormне сразу прочитал про оффсет, а он будет нужен потом( Так что backword не подходит походу с этого бы и начинали любителей пагинации оффсетом не лечим совсем как и любителей отрезать хвост собакам тонкими слайсами или искать следующий (от текущего "n--го") элемент в связанном списке -- перебором всех n+1 от начала, а не прямым переходом к next т.е. принципиально неоперабельные клинические случаи тогда ПЖ вам все правильно делает -- соединяет всё со всем, всё до конца сортирует, и , старательно слюнявя пальчик, отсчитывает в этой бескрайней простынке с нужного места по нужное место. А какие еще варианты для пагинации? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2016, 17:21 |
|
|
start [/forum/topic.php?fid=53&msg=39329953&tid=1996781]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
96ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 375ms |
total: | 568ms |
0 / 0 |