|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
Есть 2 таблицы(material, materialdata)): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Выполняю такой запрос: Код: sql 1. 2. 3. 4.
По идее должен выполниться быстро, так как на tag_id и detection_datetime висят индексы. Но в реальности происходит следующее: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
16 секунд длится запрос. Меня смущает Bitmap Heap Scan on san_materialdata u0 (cost=4652.60..630118.97 rows=248779 width=4). Это нормально? Можно ли как нибудь оптимизировать? 16 секунд это еще не самый долгий запрос. Есть похожие запросы по несколько минут. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 15:03 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
а чего не join? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 15:50 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
SharuPoNemnoguа чего не join? джойны чуть побыстрее работают, но не всегда: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 15:54 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstorm, это вот с такого запроса explain ? Код: plsql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 16:15 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
SharuPoNemnogumaxxstorm, это вот с такого запроса explain ? Код: plsql 1. 2. 3. 4. 5. 6. 7.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 16:16 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
К тому же, если джойн делать, то надо distinct или group by, потому что material_id в materialdata могут повторяться. Поэтому эксплейн еще вырастет ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 16:20 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
а если составной индекс на material_id, tag_id? и еще попробовать вариант с exists, вместо join ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 16:27 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
автор(cost=0.00..4591.23 rows=248888 width=0) (actual time=233.170..233.170 rows=531850 loops=1) похоже статистика устарела. Сделайте analyze san_materialdata. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 16:36 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
1. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
2 куда--то вот сюдой можно подумать Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
к чему индекс типа (id,detection_datetime) на san_material. но, думается, т.к. таких тагов не менее 500 000 -- это будет плохо. (0.5 -- 2.5 ляма произвольных доступов) тот случай, когда можно посмотреть возможность tag_ids integer[] в самой san_material (если оно редко обновляется). с гистами бтри_гистами и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 17:47 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
qwwq, чото я не падумал, что ид==пк, поторопился. таки сколько записей в san_material" (без филтрации тагов) в оценке Код: sql 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 17:54 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
qwwqqwwq, чото я не падумал, что ид==пк, поторопился. таки сколько записей в san_material" (без филтрации тагов) в оценке Код: sql 1.
? 6.000.000 в таблице san_material всего 110.000.000 в таблице san_materialdata всего За эту конкретную дату примерно 500.000 в san_material 10.000.000 в san_materaildata ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 17:59 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstorm 6.000.000 в таблице san_material всего 110.000.000 в таблице san_materialdata всего За эту конкретную дату примерно 500.000 в san_material 10.000.000 в san_materaildataт.е в среднем 20 тагов на материал ? а сколько всего уникальных тагов ? т.е. какая вероятность того, что первый попавшийся материал имеет заданный таг ? м.б. просто бежать вдоль времени, и проверять (лейтералом и т.п.), что таг подходит ? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 18:09 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
qwwq, 100 тагов. То есть вероятность 1 к 5, если предположить, что они равномерно повешены. По поводу проверять лейтералом можно поподробнее? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 18:24 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstorm, `work_mem` покажите. И заодно попробуйте его поднять перед запуском запроса: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 19:00 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
Код: 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--ку не упираться. а лейтерал не нужен, вы из второй только фильтр дёргаете, его екзистс исполняет. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 22:55 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#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--ку не упираться. а лейтерал не нужен, вы из второй только фильтр дёргаете, его екзистс исполняет. --поправил ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 22:57 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
vyegorovmaxxstorm, `work_mem` покажите. И заодно попробуйте его поднять перед запуском запроса: Код: sql 1.
4mb ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 08:48 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
qwwqqwwq Код: 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--ку не упираться. а лейтерал не нужен, вы из второй только фильтр дёргаете, его екзистс исполняет. --поправил Те же 16 секунд. Причем первоначально запрос выполнялся 150 секунд, а повторно 16. И мои оригинальные столько же. Походу 16 секунд это кэш, а 150 реальное время выполнения ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 08:52 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 08:53 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstorm, попробуйте сделать индекс для таблицы san_material на поле detection_datetime ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 09:17 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
Legushkamaxxstorm, попробуйте сделать индекс для таблицы san_material на поле detection_datetime Индекс имеется ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 09:18 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstormИндекс имеется могли бы вы показать как создан индекс на detection_datetime? может попробовать делать не AND sm.detection_datetime<'2016-10-15 00:00:00+03:00' a по включительную дату: AND sm.detection_datetime<='2016-10-14 23:59:59+03:00' просто в плане не видно что бы индекс работал. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 10:15 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
LegushkamaxxstormИндекс имеется могли бы вы показать как создан индекс на detection_datetime? может попробовать делать не AND sm.detection_datetime<'2016-10-15 00:00:00+03:00' a по включительную дату: AND sm.detection_datetime<='2016-10-14 23:59:59+03:00' просто в плане не видно что бы индекс работал. А вот в первом посте я написал: Код: sql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 10:16 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
LegushkamaxxstormИндекс имеется могли бы вы показать как создан индекс на detection_datetime? может попробовать делать не AND sm.detection_datetime<'2016-10-15 00:00:00+03:00' a по включительную дату: AND sm.detection_datetime<='2016-10-14 23:59:59+03:00' просто в плане не видно что бы индекс работал. Так и не должен работать учитывая авторЗа эту конкретную дату примерно 500.000 в san_material полмиллиона строк под условие. Вопрос к автору... как вы ожидаете при то что у вас 500.000 строк на дату "По идее должен выполниться быстро"? Я бы сделал индекс вида san_material(id, detection_datetime) для начала. И очень сильно бы поднял work_mem (до 32 или 64MB пока у вас не станет lossy=0 вместо lossy=240927 в плане). Скорее всего станет лучше. Ну и увеличить shared_buffers чтобы данные нормально в памяти помещались. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 10:22 |
|
Тяжелый запрос к связанным таблицам
|
|||
---|---|---|---|
#18+
maxxstorm, В первом плане было: Код: sql 1. 2. 3. 4.
Потом стало: Код: sql 1. 2. 3.
Что за сервер? И что на нём кроме базы бегает? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2016, 11:30 |
|
|
start [/forum/topic.php?fid=53&msg=39327253&tid=1996781]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
68ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 196ms |
0 / 0 |