|
|
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2018, 14:39 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2018, 14:40 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
Может предварительно все те поля которые по distinct засунуть в отедльные таблицы ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2018, 14:56 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
Ни одной попытки локализовать проблему и уменьшить тест-кейс. На что надеется автор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 13:04 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
x17.mstuМожет предварительно Предварительно выбросьте весь хлам из запроса и уберите ненужный дубляж. Нагородили целый роман там, где достаточно пол-странички текста. По максимуму уберите OR-условия. Потом можно будет говорить про какую-либо оптимизацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 14:30 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
x17.mstu, тема "Как еще можно оптимизировать запрос? " т.е. Вы утверждаете что Вы его УЖЕ оптимизировали? Тогда какого результата Вы пытаетесь достичь? Чтоб он не отработал за 2 недели (стандартное время на увольнение)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 15:12 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
x17.mstu, 'Y' = 'N' Что это за условие такое? Здесь надо максимально вынести общее, которое повторяется в каждом Union в отдельный запрос, дальше уже его результат использовать в разных вариациях. Также по поводу Exists, здесь могут быть варианты, все зависит от данных которые убиваются при inner join, возможно оптимальней будет отфильтровать по исходному множеству, чем по результату. Например в первом множестве будет 10 одинаковых ISSUE_UBS_ID и такие же 20 ISSUE_UBS_ID во втором, в результате после inner join необходимо проверять все 20*10, куда оптимальней было б проверять не 200, а изначально 20+10 и не делать кучу лишних движений... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2018, 16:19 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
x17.mstu, горю желанием оптимизировать твой запрос, но вот на бумажке запутался, а выполняю на тестовой БД, ловлю Код: plsql 1. 2. Не знаешь в чем может быть проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2018, 16:32 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
julat21'Y' = 'N' Что это за условие такое?Даже не имея опыта в разнообразии систем, можно заметить подобное среди множества тем на sql.ru. julat21после inner join необходимо проверять все 20*10Великий трансформатор, что ни джоин, то cross? Хотя да будет быстрее. После фильтра обоих источников джоин ничего не вернет и вообще ничего проверять не придется. А вот применить фильтр только к одной таблице можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2018, 16:59 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
-2-, не такой большой опыт посещения сайта как у Вас, не понимаю применения условия которое заведемо ложно. Дайте ссылку или расстолкуйте для чего это нужно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2018, 17:06 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
julat21не понимаю применения условия которое заведемо ложно Запрос, вероятнее всего, формируется приложением по некоторым условиям. И если условие командует "этот кусок данных не использовать", включается ложное условие "1=0". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2018, 17:23 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
-2-, Не совсем Вас понял Вариант 1. Есть множество 1, которое пересекается с множеством 2 по опеределенному полю. Результат по этому полю проверяется со множеством 3. Вариант 2. Если изначально проверить множетсво 1 с множеством 3, потом 2 с множеством 3 и их подрезультат пересечь, то мы получим тот же результат, что в варианте 1. Например 10 мешков яблок, 20 мешков картошки, 15 мешков лука одно множество. Второе множество допустим 5 мешков яблок, 25 мешков картошки, 10 мешков лука. Третье множество это три машины, что должны везти товар: яблок, картошки, лука. В первом случае мы скидываем все мешки в общую кучу по признаку что это и потом среди этой кучи выбираем в какую машину это грузить. Куда проще было бы, выбрать с первой кучи яблоки и подобрать им машину и выбрать яблоки со второй кучи и потом погрузить отдельные кучи. Вот что я имел ввиду, поэтому не согласен, что пересечение даст пустое множество. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2018, 17:25 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
dmdmdm, Обычно в таком случае поступают так ((flag= 'N') OR (flag = 'Y' ...)) Где flag внешняя переменная которая, которая управляет внутренней логикой. Но здесь написано прямо в лоб 'Y' = 'N', поэтому и возник вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2018, 17:29 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
julat21Обычно в таком случае поступают так ((flag= 'N') Для машины что " 1 = 0 ", что " flag = 'N' ", без разницы. А раз вы задаете подобные вопросы, и пытаетесь оптимизировать многоэтажный запрос с помощью форума, а не нескольких лет практики под руководством опытного товарища, вам в ответ и пишут всякие колкости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2018, 17:34 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
dmdmdm, Будьте внимательней. Это не я пытаюсь запрос оптимизировать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2018, 17:37 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
julat21Будьте внимательней. Буду. Мой ответ "без разницы" в таком случае адресован и вам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2018, 17:41 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
dmdmdmjulat21не понимаю применения условия которое заведемо ложно Запрос, вероятнее всего, формируется приложением по некоторым условиям. И если условие командует "этот кусок данных не использовать", включается ложное условие "1=0".Не, настолько витиевато динамически учитывать через and или or записано целевое выражение, я бы не смог. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2018, 17:42 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
Хех, судя по названию переменных - вы работаете в финансовом секторе UBS. Надо помочь коллеге с параллельного проекта)) В целом, расследование тормозящего запроса начинается с анализа - какая конкретно строчка занимает время. Для начала: Оптимизатор считает что это вторая строчка - FILTER. Так как ему нужно предположительно для 500k строк т.е. 500k раз сделать INDEX_RANGE_SCAN по табличке INST_INCREMENTAL. Более точно будет ясно если вы сюда скинете содержимое второй строчки блока PREDICATES в dbms_xplan. Но судя по всему это именно этот подзапрос: Код: plsql 1. Почему столь высокий кост у INDEX_RANGE_SCAN? Посмотрите код индекса INST_INCREMENTAL_IDX. Или ведь должен существовать индекс у которого первое поле ISSUE_UBS_ID? Если нет - то создание такого индекса будет очевидным ответом. Если вы определите почему у него кост поиска по такому запросу 120k - вы вероятно решите проблему. Кроме того, сам по себе FILTER с подзапросами - это почти всегда проблема. Исполнять сотни тысяч раз один подзапрос, пусть даже быстрый ( хотя в данном случае вероятно это не так ) - неээфективно. Подумайте, нельзя ли от него избавиться. Скажем переписать это на джойн с предварительно отфильтрованной порцией INST_INCREMENTAL. Теперь: все сказанное выше имеет силу только при условии что у вас в базе все в порядке со статистикой и оценки оптимизатора имеют смысл. Я бы начал с проверки - на какой реально строчке у вас тормозит. Это можно проверить запустив запрос с хинтом MONITOR и наблюдая real-time-monitoring вьюхи. ( Судя по тому что у вас экзадата, и на diagnostics пак не должны были поскупиться ). Там вы увидите и время, и количество строк выполнения. Если время тратится действительно в блоке 14-16 строчки - вы знаете что делать. Если нет возможности запустить сейчас, то вы можете определить это в истории ASH/AWR ( gv$active_session_history/ dba_hist ). Там есть поле sql_plan_line_id. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2018, 18:03 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
И да - отформатируете запрос CTRL+SHIFT+F или что там у вас, невозможно читать же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2018, 18:06 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
julat21Вариант 1. Есть множество 1, которое пересекается с множеством 2 по опеределенному полю. Результат по этому полю проверяется со множеством 3. Вариант 2. Если изначально проверить множетсво 1 с множеством 3, потом 2 с множеством 3 и их подрезультат пересечь, то мы получим тот же результат, что в варианте 1.Во-первых. Не по "этому" полю, а по этому ИЛИ по другому. Если обрезать множества до соединения, то ИЛИть может быть уже нечего. Во-вторых. Абстрагируясь от несовместимого результата, джоин, как правило, выполняется по ключу и не умножает количество строк. Проверять условие до джоина, это N+M проверок. После - не больше greatest(N, M). Вопрос лишь в том, что эффективнее выполнять вперед: джоин-иннер или джоин-экзистс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2018, 18:55 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
-2-, Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. По Вашему утверждению представленый запрос выполнит функцию func_rez 3 раза? Я думаю она выполниться все 6 раз для конечного множества. Поэтому предварительное использование фильтрации в данных вызовет функцию только 5 раз... ИМХО. Могу ошибаться... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2018, 19:22 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
julat21Я думаю ... Могу ошибаться...Тут всё просто. Свою невесомую потенциально ошибочную мысль лучше всего подкреплять тест-кэйсом. А если соблюдать надлежащий порядок, то ошибочная мысль просто не просочится на форум, будучи отфильтрованной убедительным самопримером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2018, 20:22 |
|
||
|
Как еще можно оптимизировать запрос?
|
|||
|---|---|---|---|
|
#18+
Elic, перед тем как писать, я специально заюзал функцию и она действительно вызывается 6 раз, потому как 6 строчек изолированы друг от друга и функция зависит от внешних условий. Простой пример, если в функцию передавать статический параметр и возвращать + текущее время(которое не стоит на месте). 6 запросов - 6 разных моментов времени, 6 разных результатов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 10:14 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39729333&tid=1883199]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
156ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 463ms |

| 0 / 0 |
