Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
Столкнулся с проблемой значительного увеличения времени работы запроса при связывании двух простых подзапросов. Каждый из них работает с таблицами примерно по миллиону записей и выдаёт несколько десятков строк и 5-6 полей, при этом длится менее минуты. Когда соединяю их через left join, время работы такого объединённого скрипта возрастает до часа! Конструкция такая: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Сервер Firebird 2.5.7, работаю через IBExpert версия 2016.11.7.2 Как можно убыстрить процесс? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2017, 15:38 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
PavelBardRu, Из примера трудно понять чего к чему. Посмотри в IBExpert'е закладку "Анализ производительности". Скорее всего при left join идёт перемножение 1лям на 1лям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2017, 16:32 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
KreatorXXI, я недавно работаю с FireBird'ом, возможно, проблемы от этого. Раньше я в таких случаях запихивал результаты подзапросов во временные таблицы, а потом их джойнил. Если результаты подзапросов были маленькие (как сейчас у меня, 60 записей), то сджойнивание их дополнительного времени практически не занимало. Время счета равнялось сумме времён подзапросов. То, что "перемножаются" миллионы записей, я подозреваю, но возникает вопрос: можно ли объяснить FireBird'у, что надо джойнить уже результаты подзапросов, не прокручивая полные таблицы? Вот сейчас замерил. Два подзапроса. Первый 3 колонки 87 строк Execute time = 6s 172ms Второй 4 колонки 74 записи Execute time = 3s 906ms Джойню - Execute time = 3m 42s 62ms ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2017, 17:58 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
PavelBardRuможно ли объяснить FireBird'у, что надо джойнить уже результаты подзапросов, не прокручивая полные таблицы? С левым соединением - нет. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2017, 18:02 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
PavelBardRu, firebird пока не умеет делать внешние соединения с использованием алгоритмов hash/merge. На внутренних соединениях в 2.5 будет использован алгоритм соединения merge, в 3.0 - hash join. Поэтому такие соединения будут делаться относительно быстро. Возможно 4.0 будет уметь делать внешние соединения с использованием hash join. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2017, 15:19 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
PavelBardRu, Если данных из двух подзапросов на несколько десятков записей, то "убивание" внешних условий должно облегчить ситуацию. Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2017, 18:21 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
afgm, Чё это вдруг? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 10:24 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
afgm, не должно, а может и то далеко не всегда, причём только для join, а не left join. Это не правило, а скорее исключение когда hash/merge join работает лучше чем nested loop с использованием индексов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 10:29 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
Симонов Денис, Чтобы MERGE сработал, ещё сортировка нужна, скорее всего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 12:08 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
WildSery, конечно нужна, вот только есть оптимизатор выберет алгоритм MERGE JOIN, то сортировку он сам воткнёт не зависисмо от того отсортированы ли данные по необходимым полям соединения или нет. Ну и сортировка "десятков строк" это не дорого. Опять же надо пробовать, как я уже сказал принудительный merge/hash это скорее исключение чем правило. Когда нет возможность использования индексов для соединения он и так будет выбран, но не для left join. Надеюсь в 4.0 это поправят (про outer join). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 12:17 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
Симонов Денис, У меня почему-то никогда не получалось "в обратную сторону". Когда выполняешь все условия, и записи выбираются в порядке соединения (дополнительно сортировкой или в порядке индекса), тогда MERGE подхватывается. А вот наоборот - чтобы сервер сам добавил сортировку, мне как-то не попадалось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 13:03 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
WildSery, ну так ты не отключал использование индексов. Просто попробуй Код: sql 1. 2. 3. вот на моей базе примерчик на 2.5 Код: sql 1. 2. 3. 4. 5. план Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 13:11 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
WildSeryafgm, Чё это вдруг? Есть подозрение, что условия джойна объединяются с внутренними, из-за этого тормоза (могу ошибаться, т.к. работаю и с 3 и 4 версией, там проброс изменился). "Материализовать" и уже потом перемножением соединить записи не должно быть долго, с учётом их небольшого количества. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 13:21 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
afgm, в 3.0 merge join заменён на hash join. В остальном почти всё так же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 13:29 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
afgm, Так в том-то и дело, что это всё до 4-ки не сработает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 13:41 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
WildSery, afgm в оптимизаторе 4.0 по сравнению с 3.0 пока ни чего не менялось ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 13:51 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
Симонов Денис, Так я и не утверждаю, что в 4 точно будет :) Я надеюсь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 14:04 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
WildSeryТак в том-то и дело, что это всё до 4-ки не сработает. Чёйта? 2 запроса по минуте выдают не сколько десятков (пусть сотен записей) и 6 полей (сделаем побольше). итого 2 минуты на формирование поздапросов. Далее неэффективным пребирающим left_join-ом объединяем. И тут вдруг час. С какого? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 15:46 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
Симонов Денисв 3.0 merge join заменён на hash join. В остальном почти всё так же. Ещё проброс условий внутрь представлений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 15:46 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
afgm, Я не понял, что ты хотел сказать. И к чему этот странный пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 15:55 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
afgm, попробовал. Твоё условие A1.type_name||'' = A2.type_name||'' скорости не добавило, как я и ожидал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 16:02 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
WildSeryafgm, Я не понял, что ты хотел сказать. И к чему этот странный пример. Я хотел сказать что неэффективный левый джойна на плевом объеме все равно должен отработать за вменяемое время. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 17:49 |
|
||
|
Оптимизация времени выполнения скрипта
|
|||
|---|---|---|---|
|
#18+
Симонов Денисafgm, попробовал. Твоё условие A1.type_name||'' = A2.type_name||'' скорости не добавило, как я и ожидал Так оно должно было замедлить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 17:51 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=39474220&tid=1561526]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
66ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
| others: | 11ms |
| total: | 189ms |

| 0 / 0 |
