|
|
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Sergei.AgalakovПопробуйте разбить индекс cause_idx_cause_db_id_in_date на два индекса - по дате и по ID."вы не поняли". селективность cause_db_id -- с гулькин чих. это ид "базы данных". Sergei.AgalakovС %asdf% вам обычные индексы не помогут. Смотрите текстовые индексы в Postgres."вы не поняли" автор уже понаделал необычных триграммов. ан -- оно не подхватывается. печаль. [ и не должны были, из общих соображений о межтабличной структуре его OR фильтра.] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 10:38 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
vyegorov, EXPLAIN (analyze, buffers): Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 11:57 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Sheriffua Код: 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. (Мысли вслух.) Ну, вы сидите на IO. Первый IS, возвращающий 1582 записи (вместо ожидаемых 6) работает аж 6 секунд. Для каждой возвращаемой записи (в среднем) нужна 1 страница, 80% из которых холодные. Диси отдают страницу за 6мс, что хорошо. Таблица с пометкой CLUSTER, но когда тот калстер был. Кажется, что данные очень фрагментированы. А приведите, пожалуйста, вывод: Код: sql 1. А можно сделать так (блокирующая операция!): Код: sql 1. 2. и попробовать ещё раз? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 12:38 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Sheriffua, Ну вот 99% времени уходит на работу с диском. Никакие индексы тут не помогут. Да и план запроса вполне нормальный. Или больше памяти базе выделять или ставить диски быстрее (читай ssd). (ну или база криво настроена что тоже реальный вариант). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 12:41 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk...Или больше памяти базе выделять... Кстати да! Шаренных буферов всего 32 метра — поднять бы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 12:45 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
vyegorov, Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 13:10 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
vyegorovMaxim Boguk...Или больше памяти базе выделять... Кстати да! Шаренных буферов всего 32 метра — поднять бы... Черт я был уверен что там 32GB shared_buffers. Автор топика - вы базу что на мобильном телефоне 5 летней давности пускаете????? И потом удивляетесь что все медленно? -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 13:29 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
vyegorovMaxim Boguk...Или больше памяти базе выделять... Кстати да! Шаренных буферов всего 32 метра — поднять бы... Откуда узнали что 32 метра? P.S. Я не админ Postgresql, а пробую решить проблему с оптимизацией запроса, НО админам сообщили по поводу замечания, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 15:40 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Sheriffuavyegorovпропущено... Кстати да! Шаренных буферов всего 32 метра — поднять бы...Откуда узнали что 32 метра? P.S. Я не админ Postgresql, а пробую решить проблему с оптимизацией запроса, НО админам сообщили по поводу замечания, спасибо Вы же Excel прикладывали с нестандартным конфигом (лучше текстом вставлять, через [src] и спойлер). У вас 4096 буфера по 8Кб, вроде 32 метра выходит :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 15:59 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
qwwqSergei.AgalakovПопробуйте разбить индекс cause_idx_cause_db_id_in_date на два индекса - по дате и по ID."вы не поняли". селективность cause_db_id -- с гулькин чих. это ид "базы данных". Sergei.AgalakovС %asdf% вам обычные индексы не помогут. Смотрите текстовые индексы в Postgres."вы не поняли" автор уже понаделал необычных триграммов. ан -- оно не подхватывается. печаль. [ и не должны были, из общих соображений о межтабличной структуре его OR фильтра.] Да понял я. С первым: ожидания оптимизатора расходятся с жизнью больше, чем на два порядка (6 против 1582). Это не есть хорошо, и я предложил путь борьбы с этим. Со вторым: Я не спорю, что здесь надо бы union all если цель заставить искать по фамилии в первую очередь, но это для скорости запроса по сравнению с поском по номеру документа не поможет скорее всено никак. Но триграммы-то зачем? Они по настоящему нужны только если про текст мало что известно. Ну кому нужен поиск по документам для фамилии %ова% ? Какая там избирательность получится? %Петрова% по обычному текстовому индексу еще куда ни шло... Оба моих замечания были больше концептуального порядка. Я согласен, что если б не приходилось читать с диска, то и при существующих индексах автор на скорость вряд ли стал бы жаловаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 17:17 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
я так понимаю, что увеличение параметра shared_buffers на план запроса не влияет? т.к. админы увеличили его до 512 Мб, но изменений в плане не увидел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2016, 10:06 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Sheriffua, план запроса и так нормальный. сколько памяти на сервере? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2016, 10:10 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Sheriffuaя так понимаю, что увеличение параметра shared_buffers на план запроса не влияет? т.к. админы увеличили его до 512 Мб, но изменений в плане не увидел. План у вас вполне нормальный и эффективный. Другой вопрос что он много данных с дисков поднимает и все время на это уходит, но сам план тут не причем. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2016, 10:18 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Alexius, Памяти на сервере 16Гб ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2016, 10:23 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Sheriffua, шаред увеличит скорость при том же плане при прогретых данных. Т.е. на первый запуск запроса не повлияет. тот как читал с диска , так и будет. откуда мораль -- если хотите ускорить и первый запуск -- надо таки переписывать запрос, а то и реорганизовывать данные. мелочь, которая почти не повлияет -- т.к. количество чтений останется тем же -- это уйти от дурных привычек, типа coalesce(field,value) = value -- т.к. этим вы лишаете оптимизатор возможности воспользоваться индексом, если тот есть. т.е. возможности усечь читаемое с диска множество. этой мелочевки можно ещё найти. но, до тех пор , пока вы не усечёте количество необходимых чтений -- она мало что даст. если вот эти условия -- сильно усекающие Код: sql 1. 2. я бы подумал о создании условного индекса с именно таким условием. Код: sql 1. 2. 3. 4. (закроем глаза на coalesce, и место приращения рук кодера). если нет -- искал бы в другом месте. может быть даже там, где октоген, но только с ручным разбиением (по OR) на UNION. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2016, 11:29 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
qwwq, Если бы условие Код: plsql 1. было селективным то в explain analyze было бы что то про: Rows Removed by Filter: N в блоке Код: plaintext 1. 2. 3. 4. 5. Поскольку в explain analyze ничего про это не сказано - то это условие тут на всякий случай/дырку в обоях закрыть и селективность у него нулевая. Так что или данные в памяти или (в худшем случае на ssd) если надо чтобы быстро, а сам план вполне вменяем для такого запроса. Автор топика явно не совсем понимает что один и тот же запрос по данным из памяти и по данным на дисках будет отличаться по скорости в 1000-100000 раз (пропорционально разницы в скорости доступа к), и в данном случае пытается искать под фонарем (план) вместо того чтобы искать там где потерял (криво настроенный/недостаточно производительный сервер). -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2016, 12:53 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, вы правы, но в исходном плане таки 4 записи из 2000 этим фильтром отсечено. если посмотреть исходный план -- основные потери на фильтрацию тут: Код: sql 1. 2. 3. т.е. нужно всё же попытаться развалить запрос на 3 (или 2) и запинать на предложенный восьмигеном триграм. А то, что по горячим оно и так будет в 1000 раз шустрее, при достаточном шареде -- это может автора не устраивать -- у него это может быть редкий запрос, выполняемый обычно по холодным данным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2016, 13:51 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Исходный == 18810155 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2016, 13:52 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Спасибо всем ответившим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2016, 14:44 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
eще есть варианты: из бест практис: 1. предрасчеты по месяцам. Регламентно иметь агрегаты по всем фамилиям по месяцам. сработает если выборки тоже по месяцам и мало изменений в прошедших периодах. 2. денормализации - втянуть в таблицу участников еще и имя судьи и с.number - тогда индекс по нему даст высокую селективность. минус - усложнит структуру и потенциально создаст неконсистентные данные. сомнительные варианты: 3. партицирование - только если по тем же месяцам. Тогда вместо рандомных чтений будет последовательный скан партиции минус - постгрес и партицирование - вместе "веселей". p.s. кстати можно заменить фильтр в участниках со '%свідок%' на список participant_type_id in (....) . тогда вообще можно не джоинить participant_type , а participant_type_id добавить в индекс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2016, 16:57 |
|
||
|
|

start [/forum/topic.php?fid=53&startmsg=39172030&tid=1997429]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
154ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 443ms |

| 0 / 0 |
