|
|
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Доброго дня! В целях быстродействия функции решил оптимизировать в ней запрос: сменить медленные подзапросы на LEFT JOIN. вот исходный запрос: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. перешел на LEFT JOIN: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. как и ожидалось, результат получаем одинаковый. Далее для сравнения запустил выполнение обоих запросов в цикле на 10000 повторений. Результат: 1-й запрос: QUERY PLAN Result (cost=0.00..0.26 rows=1 width=0) (actual time=752.993..834.105 rows=50000 loops=1) Total runtime: 894.151 ms 2-й запрос: QUERY PLAN Result (cost=0.00..0.26 rows=1 width=0) (actual time=875.821..957.876 rows=50000 loops=1) Total runtime: 1017.922 ms чем же запрос с использованием LEFT JOIN лучше запроса с использованием подзапросов, если он медленнее выполняется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2013, 18:18 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Viacheslav_mihalich, Потому что сильно напоминает анекдот: "Мне Рабинович в коридоре напел". Приведите нормальный план запроса, чтобы были видны какие индексы используются и используются ли вообще. "Как и ожидалось..." -- если Вы намекаете на то, что PostgreSQL не годится для оптимальных запросов, то специально для Вас ответ: "таки да". Вы в обеих запросах используете одно и то же условие: cl.s_id = 1 AND cl.expiration_time IS NULL. Только в первом запросе дополнительные данные вытягиваются только из отобранных данных (то есть после фильтра), а во втором фильтр применяется уже после того, как туева хуча дополнительных данных присоединена к результатам запроса. Вот почему второй вариант хуже. При этом совершенно не ясна судьба фильтрации: есть ли индекс по cl.s_id, применяется ли он (по соображениям селективности), может быть есть смысл применить условный фильтр. Приведите нормальный план запроса. Сразу можете привести долю записей с cl.s_id = 1 из общей массы, распределение по другим значениям. А так же в комбинации с cl.expitation_time. Это чтобы прикинуть возможности индекса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2013, 19:08 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
ну, спасибо! Сразу 2 удовольствия в одном: и ответ и анекдот для запроса: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. план: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. для запроса: Код: plsql 1. 2. 3. 4. 5. 6. 7. план: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2013, 19:47 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Viacheslav_mihalich, Так и есть! Seq Scan on ""CLINICS"" cl (cost=0.00..1.09 rows=1 width=20)" Filter: ((""EXPIRATION_TIME"" IS NULL) AND (""SETTLEMENT_ID"" = 1))" В обеих запросах это не вызывает совершенно никаких эмоций. С учетом предыдущих предложений обратить внимание на построение индекса. Вам на будущее: всегда приводите реальные запросы с которыми работаете. Потому что в 95% случаев выясняется, что запрос был другим, а вся беседа была зря. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2013, 19:57 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Viacheslav_mihalich, вы приводите а)результаты explain analyze а не explain б)На рабочих данных а не на пустой таблице (то что вы привели) планы запросов ЗАВИСЯТ от данных в таблице и смотреть планы на пустых таблицах смысла ровно 0. Если возращается 50000 строк в запросе то оба варианта будут небыстрыми... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 02:15 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Привожу с нагруженной таблицей в 100008 записей: 1. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. QUERY PLAN: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 2. Код: plsql 1. 2. 3. 4. 5. 6. 7. QUERY PLAN: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. сама таблица: Код: plsql 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. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 14:54 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Viacheslav_mihalich, Пожалуйста, приведите результат запросов: Код: sql 1. 2. 3. 4. 5. 6. Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 15:26 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
1. Код: plsql 1. 2. 3. 4. 5. результат: Код: sql 1. 2. 3. 4. 2. Код: plsql 1. 2. 3. 4. 5. результат: Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 16:44 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
с "EXPIRATION_TIME" IS NULL маловато конечно данных, по полю "SETTLEMENT_ID" данные отличаются. Возможно такие данные не показательны, могу по-разнообразней таблицу заполнить: с множеством различных "SETTLEMENT_ID" и чтобы "EXPIRATION_TIME" IS NULL было по-больше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 16:49 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Viacheslav_mihalich, пока у вас в присоединяемых таблицах по 1-2-5 записям план с subrequests вероятнее всего будет быстрее... я бы попробовал поиграть с cpu_tuple_cost/random_page_cost для получения другого плана но принципиально быстрее не будет... просто изза того что запрос на 50000 строк быстрым быть не может просто по своим свойствам... попробуйте выполнить set enable_material to 0; и заново выполнить explain analyze запроса с left join пришлите результаты они очень интересны будут... вторым этапом попробовать еще сделать set enable_nestloop to 0; и тоже сделать explain analyze если какая то из этих 2х версий будет заметно быстрее можно будет подумать о том в какую стороно крутить *_cost для получения более быстрого плана... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 16:50 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
выполнил set enable_material to 0; затем заново выполнил explain analyze запроса с left join: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Шайтан! время выполнения сократилось с 2604.619 ms до 745.953 ms! А что собственно произошло после выполнения set enable_material to 0; в двух словах? далее выполняю set enable_nestloop to 0; затем заново explain analyze запроса с left join: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. время выполнения: "Total runtime: 748.315 ms". P.S. Причем на время выполнение запроса с подзапросами эти магматические заклинания не подействовали: было: 1651.062 ms, стало: 1646.203 ms. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2013, 17:52 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Viacheslav_mihalichвыполнил set enable_material to 0; затем заново выполнил explain analyze запроса с left join: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Шайтан! время выполнения сократилось с 2604.619 ms до 745.953 ms! А что собственно произошло после выполнения set enable_material to 0; в двух словах? далее выполняю set enable_nestloop to 0; затем заново explain analyze запроса с left join: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. время выполнения: "Total runtime: 748.315 ms". P.S. Причем на время выполнение запроса с подзапросами эти магматические заклинания не подействовали: было: 1651.062 ms, стало: 1646.203 ms. а если вы еще set work_mem to '16Mb'; поставите еще быстрее будет (~500ms) достаточно сочетания enable_material to 0 и повышенного work_mem а что сделали - запретили использовать неудачный метод соединения таблиц для запроса... я потом поиграю с этим всем и попробую bug-report/test-case разработчикам отправить... не первый раз вижу когда план с материализацией тормозит... что то они с его ценой намудрили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2013, 01:29 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, да, с set work_mem to '16Mb' еще быстрее отработало: "Total runtime: 687.393 ms" В результате производительность возросла в 3,8 раза. Видимо "set enable_material to 0;" и "set work_mem to '16Mb' " нужно выполнять каждый раз, как коннектишься к базе, т.к. при выходе настройка слетает и все возвращается на круги своя. А за помощь однозначно всем спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2013, 09:58 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Viacheslav_mihalich, Эти параметры можно установить раз и навсегда в postgresql.conf (enable_material в разделе Planner Method Configuration). (Может, там еще что-нибудь можно поднастроить). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2013, 10:23 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Все здОрово: параметры выставил, на запрос с "explain analyze" полюбовался, порадовался скорости выполнения. Но возник еще один, возможно глупый вопрос: "explain analyze" снимаю, чтобы работать с реальными данными, и вижу, что настройки: "set enable_material to 0;" и "set work_mem to '16Mb' " без "explain analyze" уже не действуют. Для запроса: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Суммарное время выполнения запроса: 5032 ms (он же с "explain analyze": 694.387 ms). Для запроса: Код: plsql 1. 2. 3. 4. 5. 6. 7. Суммарное время выполнения запроса: 4968 ms (он же с "explain analyze": 1642.155 ms). P.S. других настроек не трогал, данные в таблице не менял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2013, 11:02 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Viacheslav_mihalich чем же запрос с использованием LEFT JOIN лучше запроса с использованием подзапросов, если он медленнее выполняется? Время выполнения запроса не является критерием качества запроса, и, как ни странно, даже не является критерием производительности запроса. Приводи io. По сути же — что в лоб, что по лбу — запросы одинаковы, они даже возможно дают один и тот же план, и выполняются одинаковыми образом. А то, что ты видишь— просто случайные отклонения, вызванные сторонними причинами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2013, 11:11 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Viacheslav_mihalich, либо в .config, либо Код: plsql 1. либо при старте каждого коннекта клиента Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2013, 11:14 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
/\/\/\/\/\/\/\ Вы в обеих запросах используете одно и то же условие: cl.s_id = 1 AND cl.expiration_time IS NULL. Только в первом запросе дополнительные данные вытягиваются только из отобранных данных (то есть после фильтра), а во втором фильтр применяется уже после того, как туева хуча дополнительных данных присоединена к результатам запроса. Вот почему второй вариант хуже. Предположения о порядке вычисления элементов запроса более чем смелые. Для тех, кто не понимает сарказм, скажу прямо: они неверные. Так же, как и оценки качества PG как субд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2013, 11:15 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
MasterZivПредположения о порядке вычисления элементов запроса более чем смелые. Пожалуйста, укажите где можно ознакомиться с порядком вычисления, чтобы предположения превратились в уверенность. Какой-нибудь RTFM, желательно официальный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2013, 11:22 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
/\/\/\/\/\/\/\/\/\MasterZivПредположения о порядке вычисления элементов запроса более чем смелые. Пожалуйста, укажите где можно ознакомиться с порядком вычисления, чтобы предположения превратились в уверенность. Какой-нибудь RTFM, желательно официальный. Нигде нельзя, порядка вычисления элементов запроса не существует. Порядок не определён. Есть только один констрейнт -- условия в HAVING при наличии GROUP BY вычисляются после выполнения группировки (или по крайней мере в процессе её выполнения). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2013, 13:19 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
MasterZiv... порядка вычисления элементов запроса не существует. ... Странно. "Жопа есть, а слова нет". Вычисления есть, а их порядка нет... Значит Вы тоже не знаете. Жаль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2013, 13:28 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Viacheslav_mihalichВсе здОрово: параметры выставил, на запрос с "explain analyze" полюбовался, порадовался скорости выполнения. Но возник еще один, возможно глупый вопрос: "explain analyze" снимаю, чтобы работать с реальными данными, и вижу, что настройки: "set enable_material to 0;" и "set work_mem to '16Mb' " без "explain analyze" уже не действуют. Для запроса: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Суммарное время выполнения запроса: 5032 ms (он же с "explain analyze": 694.387 ms). Для запроса: Код: plsql 1. 2. 3. 4. 5. 6. 7. Суммарное время выполнения запроса: 4968 ms (он же с "explain analyze": 1642.155 ms). P.S. других настроек не трогал, данные в таблице не менял. без explain analyze время выполнения запроса включает в себя a)передачу ответа по сети б)прием ответа клиентов попробуйте с локального (для базы) хоста выполнить запрос... и посмотреть на время... 50000 строк передать по сети вообще долгий процесс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2013, 14:40 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, все дело в том, что именно на localhost-е все это и наблюдается. Т.е. передачи по сети не было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2013, 13:54 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Viacheslav_mihalichMaxim Boguk, все дело в том, что именно на localhost-е все это и наблюдается. Т.е. передачи по сети не было. а сделайте Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. и Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. и пришлите какие времена у вас получились (при work_mem 16Mb и set enable_material to 0;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2013, 14:09 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
При work_mem 16Mb и set enable_material to 0; 1. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Суммарное время выполнения запроса: 375 ms. 1 строка получена. count: 50011, 2. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Суммарное время выполнения запроса: 78 ms. 1 строка получена. count: 50011. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2013, 15:16 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Такое подозрение, что сами запросы выполняются быстро, а основное время идет на вывод 50000 записей на экран... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2013, 15:23 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Viacheslav_mihalichТакое подозрение, что сами запросы выполняются быстро, а основное время идет на вывод 50000 записей на экран... это как раз часть: б)прием ответа клиентов (прием ответа отрисовка и тд)... о которой я писал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2013, 00:42 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 10:25 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
pcadviser Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 10:26 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
pcadviserpcadviser Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 1)почему не в новой теме? 2)приведите результаты explain (analyze, costs, buffers, timing) ваш запрос; тогда и посмотрим. PS: NOT IN использовать с подзапросом идея плохая в 90% случаев. --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 14:35 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
1. на сайте недавно, не знал - что нужно в новой теме, учту протестировал отдельно подзапрос с NOT IN - ми Код: sql 1. 2. 3. 4. 5. Result (cost=120.00..905453.17 rows=1102808 width=494) (actual time=0.025..5114.715 rows=8822060 loops=1) наверное можно переписать запрос через RIGHT OUTER JOIN ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 12:25 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Maxim Bogukpcadviserпропущено... 1)почему не в новой теме? 2)приведите результаты explain (analyze, costs, buffers, timing) ваш запрос; тогда и посмотрим. PS: NOT IN использовать с подзапросом идея плохая в 90% случаев. --Maxim Boguk www.postgresql-consulting.ru 1. на сайте недавно, не знал - что нужно в новой теме, учту протестировал отдельно подзапрос с NOT IN - ми Код: sql 1. 2. 3. 4. 5. Result (cost=120.00..905453.17 rows=1102808 width=494) (actual time=0.025..5114.715 rows=8822060 loops=1) наверное можно переписать запрос через RIGHT OUTER JOIN ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 12:26 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
pcadviser, попробуйте Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 13:06 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
pcadviser, или так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 13:10 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
pcadviser, и да, Махим вас просил: Maxim Boguk 2)приведите результаты explain (analyze, costs, buffers, timing) ваш запрос; тогда и посмотрим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 13:12 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
там не суть важно, как это фильтровать по этому условию думаю, основная мякотка -- в наличии/отсутствии gist индексов по геометриям. (не тащат же они 8 лямов записей из запроса ) 2ТС: лениво раскрывать динамику -- приведите конечный текст запроса (а не строку сборки) в одном из вариантов параметров желательно -- нормально отформатированную. и вообще -- там у вас видится вызов динамики вложенный ['(''SELECT ...], что забавно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 13:49 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
qwwqтам не суть важно, как это фильтровать по этому условию думаю, основная мякотка -- в наличии/отсутствии gist индексов по геометриям. (не тащат же они 8 лямов записей из запроса ) 2ТС: лениво раскрывать динамику -- приведите конечный текст запроса (а не строку сборки) в одном из вариантов параметров желательно -- нормально отформатированную. и вообще -- там у вас видится вызов динамики вложенный ['(''SELECT ...], что забавно. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. результат : Sort (cost=15564684.21..15674965.05 rows=44112335 width=498) (actual time=26819.681..26820.040 rows=6663 loops=1) Sort Key: paths.seq Sort Method: quicksort Memory: 2678kB Buffers: shared hit=49986 read=728492, local hit=6671 -> Nested Loop (cost=0.00..12468.32 rows=44112335 width=498) (actual time=26790.620..26816.858 rows=6663 loops=1) Join Filter: (paths.id2 = road_addedges.id) Buffers: shared hit=49986 read=728492, local hit=6671 -> Function Scan on pgr_astar paths (cost=0.00..10.00 rows=1000 width=8) (actual time=26790.595..26791.357 rows=6664 loops=1) Buffers: shared hit=23267 read=728492, local hit=3 Buffers: shared hit=26719, local hit=6668 -> Index Scan using edges_gid_idx on road_addedges (cost=0.00..0.32 rows=1 width=152) (actual time=0.000..0.000 rows=0 loops=6664) Index Cond: (road_addedges.id = paths.id2) Buffers: local hit=6668 -> Index Scan using edges_gid_idx on edges (cost=0.00..12.12 rows=1 width=494) (actual time=0.003..0.003 rows=1 loops=6664) Index Cond: (road.edges.id = paths.id2) Buffers: shared hit=26719 Total runtime: 26820.381 ms ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 14:58 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
qwwq, пропустил строчку Append (cost=0.00..12.43 rows=2 width=323) (actual time=0.003..0.003 rows=1 loops=6664) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 15:01 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Lonepsycho, результаты выше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 15:03 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
pcadviser, у вас все время ожидаемо уходит на вызов функции pgr_astar теперь берем все запросы внутри этой функции и поштучно анализируем что именно тормозит. PS: из того что я вижу скорее всего тормозит диск и базе надо больше памяти чтобы она нормально там размещалась. Включить track_io_timing и прогоните еще раз тот же explain analyze. PPS: когда я вижу куски SQL передаваемые параметрами в хранимку я уже могу предсказать что там все будет криво (так как так делать не надо никогда это исключительно кривой дизайн). --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 15:05 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Maxim Bogukpcadviser, у вас все время ожидаемо уходит на вызов функции pgr_astar теперь берем все запросы внутри этой функции и поштучно анализируем что именно тормозит. PS: из того что я вижу скорее всего тормозит диск и базе надо больше памяти чтобы она нормально там размещалась. Включить track_io_timing и прогоните еще раз тот же explain analyze. PPS: когда я вижу куски SQL передаваемые параметрами в хранимку я уже могу предсказать что там все будет криво (так как так делать не надо никогда это исключительно кривой дизайн). --Maxim Boguk www.postgresql-consulting.ru Включить track_io_timing нет возможности, так как версия postgres - 9.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 15:18 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
PPS: когда я вижу куски SQL передаваемые параметрами в хранимку я уже могу предсказать что там все будет криво (так как так делать не надо никогда это исключительно кривой дизай хранимая процедура реализована на PL/SQL C++. набор данных передать в функцию иначе нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 15:22 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Lonepsychopcadviser, или так: Код: 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. 5. 6. 7. 8. 9. 10. результат - время возрасло Sort (cost=15564684.21..15674965.05 rows=44112335 width=498) (actual time=30923.256..30923.603 rows=6663 loops=1) Sort Key: paths.seq Sort Method: quicksort Memory: 2678kB Buffers: shared hit=50018 read=728460, local hit=6670 -> Nested Loop (cost=0.00..12468.32 rows=44112335 width=498) (actual time=30894.333..30920.352 rows=6663 loops=1) Join Filter: (paths.id2 = road_addedges.id) Buffers: shared hit=50018 read=728460, local hit=6670 -> Function Scan on pgr_astar paths (cost=0.00..10.00 rows=1000 width=8) (actual time=30894.308..30894.946 rows=6664 loops=1) Buffers: shared hit=23299 read=728460, local hit=2 -> Append (cost=0.00..12.43 rows=2 width=323) (actual time=0.003..0.003 rows=1 loops=6664) Buffers: shared hit=26719, local hit=6668 -> Index Scan using edges_gid_idx on road_addedges (cost=0.00..0.32 rows=1 width=152) (actual time=0.000..0.000 rows=0 loops=6664) Index Cond: (road_addedges.id = paths.id2) Buffers: local hit=6668 -> Index Scan using edges_gid_idx on edges (cost=0.00..12.12 rows=1 width=494) (actual time=0.003..0.003 rows=1 loops=6664) Index Cond: (road.edges.id = paths.id2) Buffers: shared hit=26719 Total runtime: 30923.946 ms ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 15:28 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Lonepsychopcadviser, попробуйте Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. результат - время тоже увеличилось Sort (cost=15564684.21..15674965.05 rows=44112335 width=498) (actual time=31767.105..31767.519 rows=6663 loops=1) Sort Key: paths.seq Sort Method: quicksort Memory: 2678kB Buffers: shared hit=50103 read=728364, local hit=6670 -> Nested Loop (cost=0.00..12468.32 rows=44112335 width=498) (actual time=31736.068..31763.964 rows=6663 loops=1) Join Filter: (paths.id2 = road_addedges.id) Buffers: shared hit=50103 read=728364, local hit=6670 -> Function Scan on pgr_astar paths (cost=0.00..10.00 rows=1000 width=8) (actual time=31736.042..31736.635 rows=6664 loops=1) Buffers: shared hit=23384 read=728364, local hit=2 -> Append (cost=0.00..12.43 rows=2 width=323) (actual time=0.003..0.003 rows=1 loops=6664) Buffers: shared hit=26719, local hit=6668 -> Index Scan using edges_gid_idx on road_addedges (cost=0.00..0.32 rows=1 width=152) (actual time=0.000..0.000 rows=0 loops=6664) Index Cond: (road_addedges.id = paths.id2) Buffers: local hit=6668 -> Index Scan using edges_gid_idx on edges (cost=0.00..12.12 rows=1 width=494) (actual time=0.003..0.003 rows=1 loops=6664) Index Cond: (road.edges.id = paths.id2) Buffers: shared hit=26719 Total runtime: 31767.863 ms ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 15:46 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
из общих соображений -- вы туда через sql передаёте его возврат т.е. оно там, унутре, исполняется "как есть" а потом над возвратом измывается сишным кодом. т.е. дайте план вот такого: Код: sql 1. 2. 3. 4. 5. 6. есть ли gist индексы по the_geom ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 15:54 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
qwwqиз общих соображений -- вы туда через sql передаёте его возврат т.е. оно там, унутре, исполняется "как есть" а потом над возвратом измывается сишным кодом. т.е. дайте план вот такого: Код: sql 1. 2. 3. 4. 5. 6. есть ли gist индексы по the_geom ? индексы есть и по the_geom, id, gid, source, target с применением NOT EXISTS, тоже пробывал результат - хуже результат - в теме, чуть выше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 16:01 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
pcadviserqwwqиз общих соображений -- вы туда через sql передаёте его возврат т.е. оно там, унутре, исполняется "как есть" а потом над возвратом измывается сишным кодом. т.е. дайте план вот такого: Код: sql 1. 2. 3. 4. 5. 6. есть ли gist индексы по the_geom ? индексы есть и по the_geom, id, gid, source, target с применением NOT EXISTS, тоже пробывал результат - хуже результат - в теме, чуть выше гне надо пробЫвать, пробудете так всё на свете надо сделать что просят, если лень читать -- я вытащил наружу передаваемую в C динамику -- и прошу план по ней, а не по внешнему запросу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 16:08 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
да, и втащите WHERE руками в части UNION ALL-а -- оно конечно планер должен это уметь, но писать изначально верно -- не повредит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 16:10 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
2. как велик перечень ключей (source,target), по условиям Код: sql 1. 2. --исчислим ли этот набор (или его срезы) снаружи (т.е. охвачено ли всё fk-ями) ? -- если исчислим, и ожидаемо мал -- нельзя ли инвертировать NOT IN () в "=ANY(ARRAY(SELECT f_keys FROM blahblah EXCEPT ... FROM road_delnodes.))" ? -- если можно -- то нет ли возможности составной btree_gist индекс поюзать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 16:11 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
qwwqpcadviserпропущено... индексы есть и по the_geom, id, gid, source, target с применением NOT EXISTS, тоже пробывал результат - хуже результат - в теме, чуть выше гне надо пробЫвать, пробудете так всё на свете надо сделать что просят, если лень читать -- я вытащил наружу передаваемую в C динамику -- и прошу план по ней, а не по внешнему запросу не понял Вашу мысль сразу, вот Код: sql 1. 2. 3. 4. 5. 6. 7. Nested Loop Anti Join (cost=64.00..3495310.19 rows=1 width=494) (actual time=0.016..13064.774 rows=8746687 loops=1) Join Filter: (rdn.gid = road_addedges.target) Buffers: shared hit=23563 read=728172, local hit=2 -> Nested Loop Anti Join (cost=64.00..3495271.57 rows=1 width=494) (actual time=0.015..9713.446 rows=8746687 loops=1) Join Filter: (rdn.gid = road_addedges.source) Buffers: shared hit=23563 read=728172, local hit=2 -> Hash Anti Join (cost=64.00..3495232.96 rows=1 width=494) (actual time=0.014..6385.614 rows=8746687 loops=1) Hash Cond: (road_addedges.id = rd.gid) Buffers: shared hit=23563 read=728172, local hit=2 -> Append (cost=0.00..3066717.59 rows=8788746 width=494) (actual time=0.006..4877.485 rows=8746689 loops=1) Buffers: shared hit=23563 read=728172, local hit=1 -> Seq Scan on road_addedges (cost=0.00..125.50 rows=440 width=152) (actual time=0.005..0.007 rows=6 loops=1) Filter: ((NOT (the_geom && '0103000020E610000001000000040000000000000000804A400000000000004A4000000000008049400000000000004C400000000000804B400000000000004C400000000000804A400000000000004A40'::geometry)) OR (NOT _st_intersects(the_geom, '0103000020E610000001000000040000000000000000804A400000000000004A4000000000008049400000000000004C400000000000804B400000000000004C400000000000804A400000000000004A40'::geometry))) Buffers: local hit=1 -> Seq Scan on edges (cost=0.00..3066592.09 rows=8788306 width=494) (actual time=0.004..4187.377 rows=8746683 loops=1) Filter: ((NOT (the_geom && '0103000020E610000001000000040000000000000000804A400000000000004A4000000000008049400000000000004C400000000000804B400000000000004C400000000000804A400000000000004A40'::geometry)) OR (NOT _st_intersects(the_geom, '0103000020E610000001000000040000000000000000804A400000000000004A4000000000008049400000000000004C400000000000804B400000000000004C400000000000804A400000000000004A40'::geometry))) Buffers: shared hit=23563 read=728172 -> Hash (cost=34.00..34.00 rows=2400 width=4) (actual time=0.003..0.003 rows=2 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 1kB Buffers: local hit=1 -> Seq Scan on road_deledges rd (cost=0.00..34.00 rows=2400 width=4) (actual time=0.001..0.001 rows=2 loops=1) Buffers: local hit=1 -> Seq Scan on road_delnodes rdn (cost=0.00..34.00 rows=2400 width=4) (actual time=0.000..0.000 rows=0 loops=8746687) -> Seq Scan on road_delnodes rdn (cost=0.00..34.00 rows=2400 width=4) (actual time=0.000..0.000 rows=0 loops=8746687) Total runtime: 13494.066 ms ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 16:35 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
qwwqpcadviserпропущено... индексы есть и по the_geom, id, gid, source, target с применением NOT EXISTS, тоже пробывал результат - хуже результат - в теме, чуть выше гне надо пробЫвать, пробудете так всё на свете надо сделать что просят, если лень читать -- я вытащил наружу передаваемую в C динамику -- и прошу план по ней, а не по внешнему запросу исходный вариант Код: sql 1. 2. 3. 4. 5. 6. Result (cost=120.00..3133126.09 rows=1098593 width=494) (actual time=0.032..6952.084 rows=8746687 loops=1) Buffers: shared hit=23595 read=728140, local hit=3 Append (cost=120.00..3133126.09 rows=1098593 width=494) (actual time=0.032..5770.488 rows=8746687 loops=1) Buffers: shared hit=23595 read=728140, local hit=3 -> Seq Scan on road_addedges (cost=120.00..248.80 rows=55 width=152) (actual time=0.032..0.037 rows=6 loops=1) Filter: ((NOT (hashed SubPlan 1)) AND (NOT (hashed SubPlan 2)) AND (NOT (hashed SubPlan 3)) AND ((NOT (the_geom && '0103000020E610000001000000040000000000000000804A400000000000004A4000000000008049400000000000004C400000000000804B400000000000004C400000000000804A400000000000004A40'::geometry)) OR (NOT _st_intersects(the_geom, '0103000020E610000001000000040000000000000000804A400000000000004A4000000000008049400000000000004C400000000000804B400000000000004C400000000000804A400000000000004A40'::geometry)))) Buffers: local hit=2 SubPlan 1 -> Seq Scan on road_deledges (cost=0.00..34.00 rows=2400 width=4) (actual time=0.001..0.001 rows=2 loops=2) Buffers: local hit=2 SubPlan 2 -> Seq Scan on road_delnodes (cost=0.00..34.00 rows=2400 width=4) (actual time=0.001..0.001 rows=0 loops=2) SubPlan 3 -> Seq Scan on road_delnodes (cost=0.00..34.00 rows=2400 width=4) (actual time=0.001..0.001 rows=0 loops=2) -> Seq Scan on edges (cost=120.00..3132877.29 rows=1098538 width=494) (actual time=0.030..5074.961 rows=8746681 loops=1) Filter: ((NOT (hashed SubPlan 1)) AND (NOT (hashed SubPlan 2)) AND (NOT (hashed SubPlan 3)) AND ((NOT (the_geom && '0103000020E610000001000000040000000000000000804A400000000000004A4000000000008049400000000000004C400000000000804B400000000000004C400000000000804A400000000000004A40'::geometry)) OR (NOT _st_intersects(the_geom, '0103000020E610000001000000040000000000000000804A400000000000004A4000000000008049400000000000004C400000000000804B400000000000004C400000000000804A400000000000004A40'::geometry)))) Buffers: shared hit=23595 read=728140, local hit=1 SubPlan 1 -> Seq Scan on road_deledges (cost=0.00..34.00 rows=2400 width=4) (actual time=0.001..0.001 rows=2 loops=2) Buffers: local hit=2 SubPlan 2 -> Seq Scan on road_delnodes (cost=0.00..34.00 rows=2400 width=4) (actual time=0.001..0.001 rows=0 loops=2) SubPlan 3 -> Seq Scan on road_delnodes (cost=0.00..34.00 rows=2400 width=4) (actual time=0.001..0.001 rows=0 loops=2) Total runtime: 7291.332 ms ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 16:41 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
pcadviser, 1)очень полезно сделать analyze для road_deledges и для road_delnodes 2)а какую собственно производительность вы ожидаете от запроса который возвращает 9M строк и дальше еще что то с ними в сишном коде делает? Тем более что судя по цифрам именно сишная хранимка (и даже не запрос в ней) все время и тратят. --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 16:47 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
qwwq2. как велик перечень ключей (source,target), по условиям Код: sql 1. 2. --исчислим ли этот набор (или его срезы) снаружи (т.е. охвачено ли всё fk-ями) ? -- если исчислим, и ожидаемо мал -- нельзя ли инвертировать NOT IN () в "=ANY(ARRAY(SELECT f_keys FROM blahblah EXCEPT ... FROM road_delnodes.))" ? -- если можно -- то нет ли возможности составной btree_gist индекс поюзать ? набор исчислим - до 1000 записей, примерно не смог разобрать - инвертировать NOT IN () в "=ANY(ARRAY( SELECT f_keys FROM blahblah EXCEPT ... FROM road_delnodes .))" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 16:47 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Maxim Bogukдля road_deledges и для road_delnodes 1) road_deledges и road_delnodes - временные таблицы что за analyze к ним сделать? 2) по производительности - хотелось бы по максимуму. Спасибо за помощь!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 16:54 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
pcadviser, Код: sql 1. PS скорее всего от скана вы не избавитесь. Т.ч. все про "не разобрал" -- не важно. А обегание возврата внутри С не в ваших руках ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 18:10 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Добрый день! с упрощением такого запроса кто нибудь может помочь? SELECT case when orders.operator_comment LIKE '%#dostavleno%' THEN 'ДОСТАВЛЕН ТО' when warehouse1.name = warehouse.name THEN 'ЛЕЖИТ НА ТТ' ELSE 'НЕ ДОСТАВЛЕН' end, case when orders.delivery_method=1 or orders.delivery_method=4 THEN '' when orders.delivery_method=2 THEN warehouse.name ELSE 'Кто тут у нас?' end, case when orders.operator_comment LIKE '%#grandgotov%' and orders.operator_comment LIKE '%#megagotov%' THEN 'ОБА_ГОТОВЫ_АА' when orders.operator_comment LIKE '%#astmelomangotov%' and orders.operator_comment LIKE '%#astmarwingotov%' THEN 'ОБА_ГОТОВЫ_АС' when orders.operator_comment LIKE '%#damn%' THEN 'НЕТ_ТОВАРА' when orders.operator_comment LIKE '%#grandgotov%' THEN 'ГРАНД_СОБРАЛ' when orders.operator_comment LIKE '%#megagotov%' THEN 'МЕГА_СОБРАЛ' when orders.operator_comment LIKE '%#astmelomangotov%' THEN 'АСТ_МЕГА_СОБРАЛ' when orders.operator_comment LIKE '%##astmarwingotov%' THEN 'АСТ_МАРВИН_СОБРАЛ' ELSE 'НЕГОТОВ' end, extract(year from orders.order_date) as year, extract(month from orders.order_date) as month, extract(hour from orders.order_date) as hour, extract(week from orders.order_date) as week, date(orders.order_date), orders.order_id, orders.customer_surname, orders.points_spent, orders.bonus_points, orders.customer_name, orders.customer_secondname, orders.customer_phone, orders.customer_mobile, orders.customer_email, orders.delivery_region, orders.delivery_city, orders.delivery_microdistrict, orders.delivery_street, orders.delivery_house, orders.delivery_apartment, orders.delivery_zip_code, orders.delivery_comment, orders.retail_outlet_name, orders.retail_outlet_address, orders.retail_outlet_phone, orders.retail_outlet_email, orders.retail_outlet_warehouse_token, (orders.delivery_cost+orders.order_cost) as itog, orders.ic, orders.delivery_method_description, orders.delivery_date, orders.delivery_time_of_day, orders.delivery_cost, orders.order_cost, orders.order_date, shipment.warehouse_token, item.name_eshop, item.id_ax, item.name_ax, item.category, item.price, item.quantity, delivery_methods.caption, order_conditions.caption, order_states.caption, orders.responsible, warehouse1.name, warehouse.name, payment_methods.caption, action_journal_goods_item_shipment_state.action_comment FROM imm.orders INNER JOIN imm.item ON (orders.order_id = item.order_id) INNER JOIN dictionaries.delivery_methods ON (orders.delivery_method = delivery_methods.id) INNER JOIN dictionaries.order_conditions ON (orders.order_condition = order_conditions.id) INNER JOIN dictionaries.order_states ON (orders.order_state = order_states.id) INNER JOIN dictionaries.payment_methods ON(orders.payment_method = payment_methods.id), imm.shipment LEFT JOIN imm.action_journal_goods_item_shipment_state j ON j.id=(select max(id) from imm.action_journal_goods_item_shipment_state where reference_id = shipment.id), imm.warehouse warehouse1, imm.warehouse, imm.action_journal_goods_item_shipment_state WHERE item.id = shipment.order_goods_item_id AND warehouse1.token = shipment.warehouse_token AND warehouse.token = orders.retail_outlet_warehouse_token and orders.order_date > '2015-11-16' and orders.delivery_comment like '%expressdelivery%' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2015, 06:51 |
|
||
|
оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Pan_Alaverdy, 0. шагом марш новую тему на форуме: http://www.sql.ru/forum/actualpost.aspx?bid=7 создавать. Хватит наверх мусор 100летней давности поднимать. Тебе ответят все те же люди. 1. explain (запрос)? Причем отформатированный с сохранением пробелов (юзай тег src) 2. таблицы и индексы по ним? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2015, 23:54 |
|
||
|
|

start [/forum/topic.php?all=1&fid=53&tid=1997574]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
165ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 474ms |

| 0 / 0 |
