Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Оптимизация. Замена коррелированного подзапроса.
|
|||
|---|---|---|---|
|
#18+
Привет всем. Мне нужна Ваша помощь. Занялся оптимизацией кода и не могу придумать альтернативу для замены коррелированного подзапроса. Задача выглядит просто: Есть таблица с историей начисления бонусных очков покупателю. Необходимо достать из таблицы количество начисленных бонусов за 5 предыдущих дней, не считая текущего дня. Как реализовать эту задачу без использования подзапроса ? Спасибо. Ниже представлен скрипт. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2019, 16:51 |
|
||
|
Оптимизация. Замена коррелированного подзапроса.
|
|||
|---|---|---|---|
|
#18+
С чего вы взяли, что проблема в корреклированном подзапросе, а не, к примеру, в неправильной или отсутствующей индексации, или вовсе в архитектуре? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2019, 17:02 |
|
||
|
Оптимизация. Замена коррелированного подзапроса.
|
|||
|---|---|---|---|
|
#18+
YuriySu, ну например если растянуть ваши даты до ежедневного, то накопительной суммой на ROWS BETWEEN 5 PRECEDING AND CURRENT ROW ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2019, 17:03 |
|
||
|
Оптимизация. Замена коррелированного подзапроса.
|
|||
|---|---|---|---|
|
#18+
Гавриленко Сергей АлексеевичС чего вы взяли, что проблема в корреклированном подзапросе, а не, к примеру, в неправильной или отсутствующей индексации, или вовсе в архитектуре? Здравствуйте, Гавриленко Сергей Алексеевич. Я вижу оптимизацию так: 1. Оптимизировать структуру БД под текущую задачу (что-то нормализировать, а что-то напротив денормализировать) 2. Составить оптимальные, с точки зрения оптимизатора SQL, запросы. 3. Добавить необходимые индексы. На данный момент я работаю над 2-м пунктом. И использование кореллированных подзапросов желательно избегать, т.к. этот запрос отрабатывает для каждой строки. Я думал над вариантом перенести этот подзапрос в JOIN, но не могу придумать как. Возможно нужно что-то сделать по 1-му пункту. Но что? Подскажите, пожалуйста, если у Вас есть какие-то мысли по этому поводу. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2019, 17:25 |
|
||
|
Оптимизация. Замена коррелированного подзапроса.
|
|||
|---|---|---|---|
|
#18+
TaPaKYuriySu, ну например если растянуть ваши даты до ежедневного, то накопительной суммой на ROWS BETWEEN 5 PRECEDING AND CURRENT ROW Спасибо, TaPaK. Похоже это очень хороший вариант. Супер. Скажите, есть ли еще какие-то варианты? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2019, 17:27 |
|
||
|
Оптимизация. Замена коррелированного подзапроса.
|
|||
|---|---|---|---|
|
#18+
YuriySuНа данный момент я работаю над 2-м пунктом. И использование кореллированных подзапросов желательно избегать, т.к. этот запрос отрабатывает для каждой строки. Вы это в плане увидели или просто так решили? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2019, 17:29 |
|
||
|
Оптимизация. Замена коррелированного подзапроса.
|
|||
|---|---|---|---|
|
#18+
YuriySu, ну просто в jOIN Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2019, 17:30 |
|
||
|
Оптимизация. Замена коррелированного подзапроса.
|
|||
|---|---|---|---|
|
#18+
msLexYuriySuНа данный момент я работаю над 2-м пунктом. И использование кореллированных подзапросов желательно избегать, т.к. этот запрос отрабатывает для каждой строки. Вы это в плане увидели или просто так решили? Здравствуйте, msLex. Не обязательно заглядывать в план запроса чтобы понять то, что запрос, который записан в перечне выводимых полей (SELECT) будет выполняться для каждой строки. И когда таблица содержит не 30, а 1 млн. записей, то это уже большая проблема. Разве я заблуждаюсь? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2019, 18:40 |
|
||
|
Оптимизация. Замена коррелированного подзапроса.
|
|||
|---|---|---|---|
|
#18+
TaPaKYuriySu, ну просто в jOIN Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. TaPaK, как всегда на высоте. Спасибо огромное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2019, 18:44 |
|
||
|
Оптимизация. Замена коррелированного подзапроса.
|
|||
|---|---|---|---|
|
#18+
YuriySuНе обязательно заглядывать в план запроса"Не читал, но осуждаю." (с) YuriySuРазве я заблуждаюсь?Само собой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2019, 18:50 |
|
||
|
Оптимизация. Замена коррелированного подзапроса.
|
|||
|---|---|---|---|
|
#18+
Гавриленко Сергей АлексеевичYuriySuНе обязательно заглядывать в план запроса"Не читал, но осуждаю." (с) YuriySuРазве я заблуждаюсь?Само собой. Скажите пожалуйста, Гавриленко Сергей Алексеевич. От Вас может исходить какой-то конструктив? Я ведь не позиционирую себя как эксперта иначе я бы не задавал этих вопросов. Я лишь прошу помощи. И если я заблуждаюсь в этом вопросе, то напишите, пожалуйста, что мне загуглить, дабы не смешить больше Вас своими глупыми вопросами. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2019, 18:59 |
|
||
|
Оптимизация. Замена коррелированного подзапроса.
|
|||
|---|---|---|---|
|
#18+
YuriySu, Оптимизация запроса начинается с изучения его плана. Вы же считаете, что этот пункт не обязателен и сразу надо переписывать все коррелированные подзапросы. Какой еще конструктив до вас донести? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2019, 19:07 |
|
||
|
Оптимизация. Замена коррелированного подзапроса.
|
|||
|---|---|---|---|
|
#18+
Гавриленко Сергей АлексеевичYuriySu, Оптимизация запроса начинается с изучения его плана. Вы же считаете, что этот пункт не обязателен и сразу надо переписывать все коррелированные подзапросы. Какой еще конструктив до вас донести? Еще раз, я не считаю, что план запросов - это что-то несущественное. Напротив - это самый важный инструмент для поиска узких мест. Это я конечно же знаю)) Я прошу Вас написать мне почему SELECT-подзапросы не выполняются для каждой выводимой строки? Ведь Вы же утверждаете, что это не так. Мне интересно почему? Извините, если я Вас неправильно понял. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2019, 19:14 |
|
||
|
Оптимизация. Замена коррелированного подзапроса.
|
|||
|---|---|---|---|
|
#18+
YuriySu, При выполнении запроса с коррелированными подзапросами, точно так же, как и с не коррелированными, никаких других запросов не выполняется. Можете запустить профайлер и убедиться в этом. Более того, одинаковые по логике запросы с коррелированным подзапросом и join'ом могут иметь одинаковый план. (Есть нюансы с функциями, но это явно не ваш случай.) Поэтому ваш подход к оптимизации мне кажется весьма странным, как-будто он продиктован какими-то детскими травмами и суевериями, типа "уу, коррелированные подзапросы -- это же самое зло, как увидел, переделай". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2019, 19:27 |
|
||
|
Оптимизация. Замена коррелированного подзапроса.
|
|||
|---|---|---|---|
|
#18+
Гавриленко Сергей АлексеевичYuriySu, При выполнении запроса с коррелированными подзапросами, точно так же, как и с не коррелированными, никаких других запросов не выполняется. Можете запустить профайлер и убедиться в этом. Более того, одинаковые по логике запросы с коррелированным подзапросом и join'ом могут иметь одинаковый план. (Есть нюансы с функциями, но это явно не ваш случай.) Поэтому ваш подход к оптимизации мне кажется весьма странным, как-будто он продиктован какими-то детскими травмами и суевериями, типа "уу, коррелированные подзапросы -- это же самое зло, как увидел, переделай". Спасибо за Ваши замечания. Действительно не так все печально с кореллированными подзапросами как я думал изначально. На реальной базе получается, то что альтернативы я пока что не нашел (( Я очень благодарен TaPaK за его решения. Они интересны с точки зрения альтернативных подходов. Но если применять конкретно к моей задаче, то оба варианта: первый - с оконными функциями и второй - с JOIN не подходят. Дело в том, что все упирается в количество строк. С вариантом "кореллированный подзапрос" количество обрабатываемых строк около 1 млн. А с "оконными функциями" и с JOIN - число обрабатываемых строк разрастается до 300 млн. И, соответственно, по стоимости и скорости выполнения вариант с "кореллированными подзапросами" выигрывает с уверенным отрывом. Эхх... Буду рад, если кто-нибудь предложит почитать грамотный материал по оптимизации запросов. Дело в том, что информации в интернете очень много и с чего начать изучать данную проблематику не совсем понятно. Спасибо всем, огромное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2019, 20:30 |
|
||
|
Оптимизация. Замена коррелированного подзапроса.
|
|||
|---|---|---|---|
|
#18+
YuriySu, Индекс нужен (buyer , b_date) include (b_sum) - тогда вариант с join будет выигрышней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2019, 21:32 |
|
||
|
Оптимизация. Замена коррелированного подзапроса.
|
|||
|---|---|---|---|
|
#18+
YuriySuДело в том, что все упирается в количество строк. С вариантом "кореллированный подзапрос" количество обрабатываемых строк около 1 млн. А с "оконными функциями" и с JOIN - число обрабатываемых строк разрастается до 300 млн. непонятно. Запрос должен выбирать данные одного пользователя или всех сразу? Если всех, то непонятно откуда разница в результатах в 1 / 300 млн строк. Если одного, то тоже непонятно откуда разница в результатах в 1 / 300 млн строк. В вашем запросе с одной единственной таблицей я лично не вижу возможности разницы между join и подзапросом. Если вам надо вынимать одного пользователя из 300 миллионов записей, это одно. Если при этом у вас один пользователь генерит около 1 млн записей - это другое. Если же надо вынимать всех пользователей и там сотни миллионов записей, это трерье, и при аггрегациях sum(sum_b) онлайн нагрузка будет большая. Возможно лучше преаггрегировать эти данные, тем более, что у вас в условии "не считая текущего дня". Как вариант хранить ваши #Bonuses как простой лог #Bonuses_log, а при вставке делать +sum_b в таблицу #Bonuses (buyer, sum_b) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2019, 07:33 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=87&tid=1687212]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 386ms |

| 0 / 0 |
