|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
Polesov, Это забавно. Структура БД Код: 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.
Запрос Код: plsql 1. 2. 3. 4. 5. 6.
отрабатывает за 3.5 секунды, при Count(*) A = 100К, B1 = 400K, B2 = 700K, C = 150K... Как блин?.. И можно ли это сделать ещё быстрее? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2020, 22:17 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
В общем на данный момент самым оптимальным запросом под мои задачи, из тех что я смог придумать и протестировать, оказался такой: Код: sql 1. 2. 3. 4. 5. 6. 7.
Код: plaintext 1. 2. 3.
Вопрос: добавил к B2 ещё один внешний ключ к B1 (т.к. они всё-таки взаимосвязаны). Запрос стал выполняться на 60% дольше (было 3.5, стало 5.2 секунды)... хотя этот ключ непосредственно в запросе не используется. Это можно как-то нивелировать? Также приветствуются любые советы по оптимизации. Если вдруг кому интересно, то бэкап тестовой базы с тестовыми данными тут (~10 Мб, сама база ~200 Мб). ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 01:53 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
alekcvp Polesov alekcvp, А связь A к B и A к C один к одному? Если нет, то этот способ еще хуже. Нет, один ко многим. А почему хуже? По триггеру пересчитать одно поле одной записи вроде не должно занимать много времени? Я имел ввиду, что хуже потому, что усложнится логика. 20578934 ))) Например: добавлена запись в A. В таблице С соответствующих записей нет. Что произойдет в триггере, если в таблицу С будет вставлена запись? Что-то типа Код: sql 1.
И аналогичные действия при апдейте и удалении записи из таблицы C? Хотя, согласен - в принципе, схема работоспособная. Ну, и не допускать ошибочной деактивации триггера ) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 13:08 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
alekcvp Polesov, Это забавно. Структура БД Код: 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.
Запрос Код: plsql 1. 2. 3. 4. 5. 6.
отрабатывает за 3.5 секунды, при Count(*) A = 100К, B1 = 400K, B2 = 700K, C = 150K... Как блин?.. И можно ли это сделать ещё быстрее? :) Я уже предлагал способ - обеспечить в таблице A наличие фиктивных записей, подзпаросы оформить в виде CTE и использовать inner join. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 13:12 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
Polesov, > обеспечить в таблице A наличие фиктивных записей обеспечить для таблицы A наличие фиктивных записей ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 13:15 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
alekcvp Polesov, Запрос Код: plsql 1. 2. 3. 4. 5. 6.
отрабатывает за 3.5 секунды, при Count(*) A = 100К, B1 = 400K, B2 = 700K, C = 150K... А как измерял? Я окончания полного фетча для этого запроса ждал 2 минуты - не дождался. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 14:16 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
alekcvp В общем на данный момент самым оптимальным запросом под мои задачи, из тех что я смог придумать и протестировать, оказался такой: Код: sql 1. 2. 3. 4. 5. 6. 7.
Код: sql 1. 2. 3. 4. 5. 6. 7.
2. Т.к. полей из С в результате нет, то можно избавиться от агрегата с ней Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 15:14 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
hvlad 2. Т.к. полей из С в результате нет Думаю, ТС, приводя запрос, просто ошибся. В исходном посте сказано, что из таблицы C надо выводить min( FLAG ). Кстати, есть ли существенные минусы в добавлении фиктивных записей в дочерние таблицы для обеспечения использования inner join? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 16:19 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#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. 27. 28. 29.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 16:40 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
Polesov alekcvp Polesov, Запрос Код: plsql 1. 2. 3. 4. 5. 6.
отрабатывает за 3.5 секунды, при Count(*) A = 100К, B1 = 400K, B2 = 700K, C = 150K... А как измерял? Я окончания полного фетча для этого запроса ждал 2 минуты - не дождался. А запрос во время выполнения разве не все данные считает, а тоже порциями? Я имел в виду время выполнения самого запроса. Фетч-то на 100к записей может и сам по себе долго выполняться, нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 16:53 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
hvlad 2. Т.к. полей из С в результате нет, то можно избавиться от агрегата с ней ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 16:56 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
Flashpoke, Охренеть. Спасибо! Я так понимаю этот запрос разворачивает все три таблицы в одну, а потом тупо строит по ней аггрегатный запрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 17:01 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
Flashpoke, нужно ещё HAVING MAX(FLAG) IS NOT NULL добавить, иначе запрос не эквивалентен. А вот так будет ещё немножко лучше Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 17:26 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
alekcvp, таблицы агрегируются независимо друг от друга, чтобы избежать коррелированных подзапросов. Потом результаты склеивается одну строку для каждого ID_A и берётся полный их список из A. hvlad, вроде же в исходном запросе все записи из таблицы А достаются и показываются? HASH JOIN ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 17:49 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
А я эпично обломался. Решил начать от простого к сложному, хаха :( Внезапно, даты в BETWEEN у меня не задаются в параметрах запроса, а вычисляются из поля таблицы A, причём сложно. Т.е. там есть поле "начало учётного периода", которое содержит в себе число. И интервал Between - это либо прошлый, либо текущий месяц. Т.е. если там "20", а сегодня 10е мая, то надо просуммировать либо с 20 марта по 19 апреля (SUM2), либо с 20 апреля по сегодняшний день, включительно (SUM1). Блин. Что-то я всё больше склоняюсь к кэшированию в A всех сумм и обновлению их по триггерам... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 17:51 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
Flashpoke Код: 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.
Исходное условие - должны быть все записи из A. В результат данного запроса не попадут записи из A, которых нет ни в B1, ни B2, ни в C. Тогда уж Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 18:15 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
Polesov Исходное условие - должны быть все записи из A. В результат данного запроса не попадут записи из A, которых нет ни в B1, ни B2, ни в C. Ну by design записи в C создаются одновременно с A, если запись есть в A, но нет ни одной записи в C - это нештатная ситуация, так что если такие записи не будет видно - не страшно. Вот отстутствие записей в B1, B2 - это нормально. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 18:17 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
alekcvp Ну by design записи в C создаются одновременно с A Аднака, паходу выявилась масса нюансоффф ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 18:35 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
Flashpoke hvlad, вроде же в исходном запросе все записи из таблицы А достаются и показываются? Всю ветку не читал, скучно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 19:18 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
hvlad Flashpoke hvlad, вроде же в исходном запросе все записи из таблицы А достаются и показываются? 22143229 Выяснилось, что в C есть все, что есть в А. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 22:35 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
А вот этого монстра можно как-нибудь оптимизировать?.. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
DFST/DLST Код: 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.
Polesov Выяснилось, что в C есть все, что есть в А. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 22:48 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
alekcvp А вот этого монстра можно как-нибудь оптимизировать?.. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2020, 02:11 |
|
Вложенные запросы или как правильно это сделать?
|
|||
---|---|---|---|
#18+
Flashpoke alekcvp А вот этого монстра можно как-нибудь оптимизировать?.. Ну исходный-то за секунду срабатывал, пока я в него кривыми ручками не залез :) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2020, 02:13 |
|
|
start [/forum/topic.php?fid=40&msg=39964807&tid=1560343]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
128ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 234ms |
0 / 0 |