Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
Запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Анализ: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Если убрать ORDER, то время сразу устраивает в отличии от результата: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Анализ: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Нужна одна любая строчка с минимальной SUM_DIST. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2016, 10:52 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_me, Вы статистику давно пересобирали? Во всех узлах ожидание 1 записи. SeqScan-ы по `ru_psk_point` с фильтрацией — может индексы сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2016, 12:41 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
vyegorovits_me, SeqScan-ы по `ru_psk_point` с фильтрацией — может индексы сделать? там копейки. потом он берёт декартов квадрат 181*181 = 32761 (нельзя ли усечь до треугольника), умножает его декартово ещё на табличку -- и начинает фильтровать по функциональным критериям. потом сортирует опять по ф-ии, и берет первое. ессно, всё это дорого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2016, 14:04 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwq, не совсем копейки, есть смысл индексы сделать, чтобы на секунду ускорить: Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2016, 15:04 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
Alexiusqwwq, не совсем копейки, есть смысл индексы сделать, чтобы на секунду ускорить: неа, взять 1 цте, с обеими расстояниями, и квадратить уже его декартом. (а лучше -- таки треуголить, если по логике возможно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2016, 15:09 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
А можно поприземлённей немного выдать рекомендацию?)) Я уж точно ничего не декартил - просто написал запрос.)) По поводу индексов ru_psk_point, есть только 2: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2016, 15:14 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_me, декартите,, да ещё и со свистом Код: sql 1. 2. 3. 4. -- это одна и та же выборка, но с разными расчетными расстояниями. возьмите её как одно цте. и 2 раза попользуйте. если не боитесь писать рукамидалее -- вы знаете, что расстояния неотрицательны (ну вот так вот оно) и вы знаете, что сумма неотрицательных упорядочена где--то по слагаемым, с максимумами по диагонали слагаемых. т.е. можете взять руками цте, и по нему рекурсивно например побежать от минимальных расстояний, проверяя фильтры по--ходу. а не сортируя итоговое произведение. если рекурсивный запрос для вас сложен -- распишите в plpgsql двумя вложенными циклами. (там надо выскакивать не сразу, а когда одна из координат превзойдет минимальную ранее найденную сумму -- т.е. ограниченный сорт у вас останется) но это суровый хенджоб тащемто, проще попытаться запинать вдвое, зная как у вас ориентировано это нечто (с какого конца по ид у вас старт, а с какого енд) -- вместо квадрата получите его половину . в 10 раз не выиграете -- но 2--ку наберете. ну и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2016, 17:06 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwq, для начала что такое "цте"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2016, 17:08 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
и еще, изначально был вариант через циклы в функции(меньше предыдущего) - дольше, в итоге я у этого запроса сижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2016, 17:11 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_meqwwq, для начала что такое "цте"? ЦТЕ == CTE == Common Table Expression Имеют эффект материализации (гарантированно исполняются только один раз). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2016, 22:26 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwqits_me, т.е. можете взять руками цте, и по нему рекурсивно например побежать от минимальных расстояний, проверяя фильтры по--ходу. а не сортируя итоговое произведение. Этот момент можете прояснить, у меня в голове несколько вариантов возникло, но что именно Вы имели ввиду(взять весь мой результат и прорекурсиветь или взять отдельную часть запроса прорекурсиветь и далее ее "соединить" и тп)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 15:42 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_me, у вас 181 запись с 2-- мя расстояниями, вы их декартово умножается на себя, расстояния складываются. получается 181*181 вариантов, которые вы фильтруете умножая эти 181*181 ещё на таблицу -- для фильтра. (вместо скажем екзистса) потом результат сортируете по сумме расстояний, и берете 1 запись вдоль сортировки. ясно, что вы можете бежать в двойном цикле по 2-м сортированным (по разному) экземплярам (по 191 записи), и найти первое попавшееся под итоговый фильтр. вернее пробежаться чуть дальше -- до размера любой координаты в квадранте "не больше" первого найденного суммарного расстояния [далее => текущего минимального суммарного расстояния], и там немного посортировать (на самом -- на лету вычислять least), но гораздо меньше чем 181*181. как--то так. короче -- ищущий да обрящет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 16:00 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwq, Я только вчера узнал про рекурсивную выборку, а тут такое объяснение, зря спросил)))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 16:06 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_me, Можете где-то дампы табличек выложить, поиграться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 19:43 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
vyegorov, Честно говоря даже не знаю как подойти к этому вопросу) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2016, 11:39 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
vyegorov, есть такая ссылка: https://www.dropbox.com/s/pbtn1qhgioruqh3/backup_tables.7z?dl=0 пойдёт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2016, 14:56 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwqits_me, у вас 181 запись с 2-- мя расстояниями, вы их декартово умножается на себя, расстояния складываются. получается 181*181 вариантов, которые вы фильтруете умножая эти 181*181 ещё на таблицу -- для фильтра. (вместо скажем екзистса) потом результат сортируете по сумме расстояний, и берете 1 запись вдоль сортировки. ясно, что вы можете бежать в двойном цикле по 2-м сортированным (по разному) экземплярам (по 191 записи), и найти первое попавшееся под итоговый фильтр. вернее пробежаться чуть дальше -- до размера любой координаты в квадранте "не больше" первого найденного суммарного расстояния [далее => текущего минимального суммарного расстояния], и там немного посортировать (на самом -- на лету вычислять least), но гораздо меньше чем 181*181. как--то так. короче -- ищущий да обрящет. Вы тут имеете ввиду через функцию(циклы) или ЦТЕ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 10:48 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwq ясно, что вы можете бежать в двойном цикле по 2-м сортированным (по разному) экземплярам (по 191 записи), и найти первое попавшееся под итоговый фильтр. вернее пробежаться чуть дальше -- до размера любой координаты в квадранте "не больше" первого найденного суммарного расстояния [далее => текущего минимального суммарного расстояния], и там немного посортировать (на самом -- на лету вычислять least), но гораздо меньше чем 181*181. Кто-нибудь может перевести это на человеческий язык? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 11:58 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_meqwwqясно, что вы можете бежать в двойном цикле по 2-м сортированным (по разному) экземплярам (по 191 записи), и найти первое попавшееся под итоговый фильтр. вернее пробежаться чуть дальше -- до размера любой координаты в квадранте "не больше" первого найденного суммарного расстояния [далее => текущего минимального суммарного расстояния], и там немного посортировать (на самом -- на лету вычислять least), но гораздо меньше чем 181*181. Кто-нибудь может перевести это на человеческий язык? вы хотели спросить, как это перевести с человеческого на язык пошаговых инструкций "для дебилов" ? можно и на пошаговый. но лень. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 12:34 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
маленький экзерсис для мозга: вот например у вас есть неуникальный индекс , для простоты по NOT NULL полю , и вы выбираете вдоль него лимит 10 смотрите план -- постгрес правильно берет лимит вдоль индекса, профетчив всего 10 записей. далее вы добавляете в свой order by, ПОСЛЕ своего индексированного поля, еще и ключевое поле -- для уникальности [повторяемости] сортировки -- смотрите план, и видите лимит после фетча всего и сортировки всего. и начинаете медленно охеревать с интеллектуальности оптимизатора. недолго думая вы пишете выборку всего того, что не больше (по вашему полю), чем то, что найдено по предыдущему, неповторимому, условию "лимит 10", и делаете повторимый ордер бай лимит 10 от этой промежуточной выборки -- и берёте с полки пирожок с чувством СВ "глубокого удовлетворения". вот когда этот экзерсис разберёте руками и поймете -- начнете что--то понимать и про прочую оптимизацию. А заодно -- про оптимизатор ПЖ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 12:50 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwq далее вы добавляете в свой order by, ПОСЛЕ своего индексированного поля, еще и ключевое поле -- для уникальности [повторяемости] сортировки -- смотрите план, и видите лимит после фетча всего и сортировки всего. и начинаете медленно охеревать с интеллектуальности оптимизатора. добавить в order by в смысле или имеется ввиду подзапрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 14:54 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwqмаленький экзерсис для мозга: вот например у вас есть неуникальный индекс , для простоты по NOT NULL полю , и вы выбираете вдоль него лимит 10 смотрите план -- постгрес правильно берет лимит вдоль индекса, профетчив всего 10 записей. далее вы добавляете в свой order by, ПОСЛЕ своего индексированного поля, еще и ключевое поле -- для уникальности [повторяемости] сортировки -- смотрите план, и видите лимит после фетча всего и сортировки всего. и начинаете медленно охеревать с интеллектуальности оптимизатора. недолго думая вы пишете выборку всего того, что не больше (по вашему полю), чем то, что найдено по предыдущему, неповторимому, условию "лимит 10", и делаете повторимый ордер бай лимит 10 от этой промежуточной выборки -- и берёте с полки пирожок с чувством СВ "глубокого удовлетворения". вот когда этот экзерсис разберёте руками и поймете -- начнете что--то понимать и про прочую оптимизацию. А заодно -- про оптимизатор ПЖ. Да дело не в объяснении, русских слов мало да ещё и присутствуют биржевые определения. Вообще я до Вашего объяснения сделал так: взял из первой строки(limit 1) первую сумму(быстро отрабатывает) и сделал в выборке не больше или равно этой суммы, а как гарантия того что не попадет самое большое сделал ORDER по dist_start например и время сократилось в 10-15 раз. Может Вы примерно такое имели ввиду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 14:59 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwqвот например у вас есть неуникальный индекс , для простоты по NOT NULL полю , и вы выбираете вдоль него лимит 10 смотрите план -- постгрес правильно берет лимит вдоль индекса, профетчив всего 10 записей.. вот что получилось Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. т.е. таки по таблице скан, если я правильно понимаю план ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 16:04 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
Jonhson, data Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. test: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 2 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. handjob Код: 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. особенно это приятно, когда какой--нито битмап скан вместо индекскана превращает лимит проходной по мердж джойну партиций в лимит после фулл апенда + сорта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 16:30 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. когда сделал сорт (в моём тесте) , пошло по индексу. Правда что раньше мешало? ;) а в вашем тесте не понял Код: sql 1. если вы берёте select id, f , при этом id нет в индексе по f ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 17:46 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
Jonhson <> а в вашем тесте не понял <> а как дысал, как дысал ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 17:51 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. чудеса! Берёт то, чего в индексе нет. Судя по всему шаг table access by rowid план просто не пишет ( а он явно есть) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 17:53 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
п.с. прекратите уже паясничать. Не два по третьему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 17:54 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
А мне это поможет?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 18:02 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_meА мне это поможет?)зависит от вас. просто демонстрируется факт, что для нахождения некоторых первых записей не надо строить весь набор, сортировать и выбирать первые. если вы знаете, как заранее можно обрезать выборку -- это может помочь. в вашем случае индексов нет, но есть другой способ обхода множества из 181*181 записей, думается. Если конечно фильтр, как назло, не подавляет всё в начале и пропускает только в конце перебора. (т.е. не коррелирует с обходом). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 18:09 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
Jonhsonп.с. прекратите уже паясничать. свободен, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 18:10 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
JonhsonСудя по всему шаг table access by rowid план просто не пишет ( а он явно есть) Вам неоднократно говорили — прочитайте уже, наконец, документацию. И не ждите ORACLE-их фич, это другая СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 18:34 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
На чём я остановился пока: Код: 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. Анализ: Код: plaintext 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. Результат есть, но меня пугает то, что записи в таблицах, таких как ru_psk_point, ru_psk_rels, будут пополняться и значительно(в разы чем сейчас). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 09:22 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_me, [thy. yt rjvvtynbhe. PS однако вот такое вот вам не приходило в голову : Код: sql 1. т.е. если вы не можете усечь перебор до треугольника -- м.б. хотя бы диагональ явно выколоть, а не неизвестно сколько исполняемой ф--ей ? да ,если выложите в свободное место свои таблички, -- м.б. кто--то не поленится их покрутить. а так -- нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 10:44 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwq, Я херню комментирую). Про массивы пока не дошло. Про выкладывания - я ссылку кидал уже выше: https://www.dropbox.com/s/pbtn1qhgioruqh3/backup_tables.7z?dl=0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 11:02 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
ещё: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 11:11 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_meqwwq, Я херню комментирую). не льстите себе, мсье. вы её пишете its_meПро массивы пока не дошло. пичаль. на хабре или их гите щас хорошая статья про микроцефалию новых поколений. its_meПро выкладывания - я ссылку кидал уже выше: https://www.dropbox.com/s/pbtn1qhgioruqh3/backup_tables.7z?dl=0 это говно настойчиво хочет от меня логина. приходится им писать в поле логина "кто вы такие, чего вам надо, ..." далее -- по известному мему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 11:41 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_meещё: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. это не оракел. не надо подменять sql ф--ями. хотя оно у вас секъюрити инвокер, должно встраиваться в план как подзапрос. могли еще стейблом сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 11:44 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwq, Скачать можно, если в окне регистрации нажать ссылгу "Мне пофиг" (внизу), вверху-справа нажать "Скачать". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 12:01 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwq, Мне трудно говорить с человеком который говорит сам с собой... Раньше больше/преимущественно ораклом занимался. Попробуйте эту ссылку(редко требуется передавать файлы по ссылкам): http://filecloud.me/s53lmqzwgtaa.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 12:01 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_me, У вас в запросе функция, которой нет в дампе: bus_idx_rels_parts ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 12:55 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_meqwwq, Мне трудно говорить с человеком который говорит сам с собой... если вы чего--то не поняли, это не проблема собеседника. хорошая для вас новость -- рекурсивным запросом эффективно резать не удастся. по крайней мере -- навскидку. (чтобы добегать только до фильтра в каждой итерации надо отдельно сортировать и фильтровать -- идексов то нет) видимо надо попытаться plpgsql вложенным лупом по 2--м сортированным наборам с выходами по условию выхода из диапазонов. -- должно сработать за 1 проход. иначе -- это просто многочисленная сортировка с фильтрацией на каждой итерации: //это должно было быть понятно сразу. проглядел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 13:18 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
vyegorovits_me, У вас в запросе функция, которой нет в дампе: bus_idx_rels_parts если на неё наплевать -- то примерно так : Код: 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. 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 13:52 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwqесли на неё наплевать -- то примерно та: Чёт не выходит у меня этот цветок :) Меня напрягает, что нужно сортировать явным образом `ru_psk_point`, без индексов. Если, как было сказано, оно ещё и вырастет, то тут подход неправильный. Думаю, что в `ru_psk_rels` хранятся маршруты, `ru_psk_rels.parts` -- остановки. В `ru_psk_point` -- какие-то моменты в рамках маршрута. Может через kNN искать ближайшую остановку из общего списка для каждого момента , а потом уже накладывать эти точки на маршруты? Ну чтобы индексы задействовать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 15:05 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
vyegorovits_me, У вас в запросе функция, которой нет в дампе: bus_idx_rels_parts Я её выше написал отдельно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 15:14 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
vyegorov Меня напрягает, что нужно сортировать явным образом `ru_psk_point`, без индексов. Если, как было сказано, оно ещё и вырастет, то тут подход неправильный. Думаю, что в `ru_psk_rels` хранятся маршруты, `ru_psk_rels.parts` -- остановки. В `ru_psk_point` -- какие-то моменты в рамках маршрута. Может через kNN искать ближайшую остановку из общего списка для каждого момента , а потом уже накладывать эти точки на маршруты? Ну чтобы индексы задействовать... ru_psk_rels - маршруты(общее - отношения) ru_psk_rels.parts - объекты отношения(в тч остановки из ru_psk_point.id) ru_psk_point - остановки(точки) Про метод задействовать индексы непонял, что за каждый момент? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 15:19 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwq видимо надо попытаться plpgsql вложенным лупом по 2--м сортированным наборам с выходами по условию выхода из диапазонов. -- должно сработать за 1 проход. Вы же можете писать как пример скрипты тут и даже не маленькие, как хорошо бы эту строчку увидеть в "скриптовом" виде)). Вы же вкурсе как до меня доходят Ваши советы)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 15:23 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_meЯ её выше написал отдельно. Я не понимаю что там: - создаётся функция - потом индекс на несуществующей реляции - потом создаётся таблица с названием `ru_psk_rels_parts_idx` в которой вы раскрываете список точек в маршруте (если мои предположения верны). Опишите, что вы делаете формально, будет проще экспериментировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 15:31 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
vyegorovits_meЯ её выше написал отдельно. Я не понимаю что там: - создаётся функция - потом индекс на несуществующей реляции - потом создаётся таблица с названием `ru_psk_rels_parts_idx` в которой вы раскрываете список точек в маршруте (если мои предположения верны). Опишите, что вы делаете формально, будет проще экспериментировать. Порядок только у меня перепутан)). Создаю таблицу для извлечения информации по индексам в массиве(parts) объектов отношения. Далее индекс для этой таблицы. Далее функцию которая из этой таблицы возвращает индекс(нужна в запросе для фильтра порядка расположения остановок). Главная проблема/причина у меня была в извлечении индексов объектов массива - версия постгреса 9.2(нету array_position), intarray не включить(ругается osm2pgsql), есть generate(он используется у меня в следующем запросе и он не самый быстрый тоже) - других я не нашел методов возврата индекса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 15:48 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_me, что храниться в `ru_psk_point.way` -- точка? ломанная? замкнутый контур? координаты откуда беруться? и что это -- фиксация каких-то мест? вы считаете дистанцию от заданных координат и потом отбираете минимальныую сумму. Вы хотите найти `way`-ы, ближайшие к заданным координатам? Расстояние между координатами? Расстояния между `way`-ми? -- уточните! если `ru_psk_point.way` используется в географических выражениях, почему не использовать тип geography? зачем хранить точки `ru_psk_rels.parts` в виде массива и мучаться с индексами, может ввести подчинённую таблицу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 16:09 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
vyegorovits_me, что храниться в `ru_psk_point.way` -- точка? ломанная? замкнутый контур? координаты откуда беруться? и что это -- фиксация каких-то мест? вы считаете дистанцию от заданных координат и потом отбираете минимальныую сумму. Вы хотите найти `way`-ы, ближайшие к заданным координатам? Расстояние между координатами? Расстояния между `way`-ми? -- уточните! если `ru_psk_point.way` используется в географических выражениях, почему не использовать тип geography? зачем хранить точки `ru_psk_rels.parts` в виде массива и мучаться с индексами, может ввести подчинённую таблицу? 1. Точка(её координаты) 2. Координаты - это входящая переменная(в функции где этот запрос). 3. Минимальную сумму расстояний от стартовой входящей координаты до посадочной остановки и от конечной координаты до остановки для выхода. Далее беру id остановок(для дальнейшей обработки - списка маршрутов) и way-и остановок(для геометрической проверки принадлежности к линии маршрута). 4. Не знаю, просто стоит тип geometry, не думал вообще над этим и зачем это. 5. В таком виде предоставляет данные программа-импорт(osm2pgsql), в принципе я уже создал таблицу для извлечения индексов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 16:24 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_me, удф по всему у вас мухи копулируют в голове и коде. он должен выглядеть как--то так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. при этом на прогретых данных имеем: Код: 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. 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. ели я правильно понял про ваш unnest . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 17:11 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwq, и тогда без лишних структур: Код: 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. 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 17:24 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwqits_me, удф по всему у вас мухи копулируют в голове и коде. он должен выглядеть как--то так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. при этом на прогретых данных имеем: Код: 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. 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. ели я правильно понял про ваш unnest . )))))Да, порядок такой!))) P.S.: Боюсь понимать уже Вас(удф,мухи,да ещё и копулируют!!!ужас) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 17:25 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwq, Код: plaintext 1. Это я Ваш DO выполнил, по времени у меня также мой запрос, в чем изюминка?(если аккуратно можно ответить))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 17:29 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_meqwwq, Код: plaintext 1. Это я Ваш DO выполнил, по времени у меня также мой запрос, в чем изюминка?(если аккуратно можно ответить))) что конкретно вас интересует ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 17:34 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
_t1_ и _t2_ - эточё такое? ещё это непонятно, что тут происходит(это "или" или "и"?): Код: plaintext с unnest-ом еще протестю... и самый главный вопрос: это будет работать без потери времени при увеличении исходных таблиц? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 18:01 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_me, <<label>> : https://www.postgresql.org/docs/9.5/static/plpgsql-control-structures.html#PLPGSQL-CONTROL-STRUCTURES-LOOPS https://www.postgresql.org/docs/current/static/functions-array.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 18:12 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_meи самый главный вопрос: это будет работать без потери времени при увеличении исходных таблиц? с потерей не менее чем квадратичной. при одинаковых длинах путей. если и пути вырастут -- всё будет еще гаже. вы что--то не то изобретаете. у вас постгис есть с дистансами и прочими удобствами меж точками и мультипойнтами -- а вы все это назад в скл тянете с неоптимальными переборами коллекций. https://yandex.ru/yandsearch?text=multipoint distance postgis&lr=213 там где--то и оценки затратности от мощности геометрий были. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 21:02 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwq, Я правильно понял, что если все строки из первого/верхнего цикла не пройдут по фильтру(ok) с первой строкой внутреннего/второго цикла, то результата вообще не будет(я так понял описание выхода из блока/цикла)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 11:17 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_meqwwq, Я правильно понял, что если все строки из первого/верхнего цикла не пройдут по фильтру(ok) с первой строкой внутреннего/второго цикла, то результата вообще не будет(я так понял описание выхода из блока/цикла)? народноемальчик, ты дебил ? формально -- да, результата не будет. но фильтр просто повторяет ваш множественный джойн , если вы не заметили. т.е. фильтрует только те пары, которые принадлежат одному пути и состоят в заданном отношении порядка. т.е. он не может ничего не вернуть. выгода EXISTS вместо JOIN -- на единственности чека. можно идти в обратную сторону -- идти циклом не по точкам, а по путям. вложенно -- циклом по точкам путей (по индексу массивов). (там есть пара мест для оптимизации -- т.е. понятно , когда НЕ надо пересчитывать суммарные длинноты на шаге, посчитав расстояние от очередной точки). т.е. затраты -- около ~ числа путей на число или квадрат (там на мультипойнты рассечения надо брать, но слева инкрементально расстояние считается, а справа его не надо пересчитывать часто -- если расстояние от выпавшей точки больше прежнего, т.ч. квадрата там не будет) числа точек в пути. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 11:43 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwq, А почему он "не может ничего не вернуть"? Теоретически легко же может не вернуть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 12:04 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_meqwwq, А почему он "не может ничего не вернуть"? Теоретически легко же может не вернуть? Отвечаю сам себе. Вся проблема из-за маленького нюанса - я не знал , что 10>=null возвращает FALSE(где-то я встречал наоборот). Пришлось протестить этот вопрос отдельно. Теперь точно что-то вернёт, если такое есть там(пройдет все основные минимальные варианты). Так что прошу прощения за последнее сомнение. На счет наоборот идти и других вариантов, на вскидку, будет быстрее или минимальны изменения по времени? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 15:13 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_meits_meqwwq, А почему он "не может ничего не вернуть"? Теоретически легко же может не вернуть? Отвечаю сам себе. Вся проблема из-за маленького нюанса - я не знал , что 10>=null возвращает FALSE(где-то я встречал наоборот).мальчик, <<<>>> Код: sql 1. и не путайте результаты least | greatest с результатом сравнения. там результат если один из операндов null оговорен отдельным соглашением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 15:25 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_meНа счет наоборот идти и других вариантов, на вскидку, будет быстрее или минимальны изменения по времени? вам что--то мешает проверить ? напишите, учтите моменты, оптимизирующие проход -- и сравните. всё в ваших руках. или вы хотите , чтобы за вас это сделали из чисто факультативного интереса ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 15:28 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwq, Я протестил least и greatest с null и без - он просто игнорит его и всё. На счет самому протестить, то я собирался попробовать идти геометрическим путём без цикла в голове по подбору вариантов по текущему направлению, поэтому спросил на вскидку. Да и спасибо за проделанную помощь, результат ведь уже есть положительный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 15:43 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
qwwq, А ещё, по поводу замечания что FALSE возвращает: для IF он его и возвращает, NULL это по любому=у не TRUE для IF. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 15:47 |
|
||
|
Что можно сделать для сокращения времени обработки запроса?
|
|||
|---|---|---|---|
|
#18+
its_meqwwq, А ещё, по поводу замечания что FALSE возвращает: для IF он его и возвращает, NULL это по любому=у не TRUE для IF. не надо рисать херни, даже когда очень хочется просто выполните : Код: sql 1. 3-х значная логика потому и называется 3-х значной, что Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 16:31 |
|
||
|
|

start [/forum/topic.php?all=1&fid=53&tid=1997126]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
183ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
81ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 322ms |

| 0 / 0 |
