|
Медленная работа запроса на одном из значений параметра
|
|||
---|---|---|---|
#18+
Здравствуйте. Возникла проблема с медленной работой запроса на одном из значений параметра. Есть 2 таблицы (БД Oracle 12.2.0.1.0): DEPARTMENT_DOC_MASTER Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
DEPARTMENT_DOC_VERSION Код: 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.
Выполняется соединение этих двух таблиц по внешнему ключу DEPARTMENT_DOC_VERSION.DEPARTMENT_DOC_MASTER_ID: Код: 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.
Изначальный запрос (HQL) выполняется в Java ORM Hibernate (затем формируется вышеуказанный запрос Oracle): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
При значении 'VSP' в условии "where (department1_.department_type in ('VSP'))" адаптивный план запроса следующий (Cost очень высокий): Код: 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.
При этом, если в условии поменять значение на другое (например, 'TB'), то план запроса меняется (скорость выполнения увеличивается в разы): Код: 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.
Подозреваю, что всё дело в количестве записей и при значении 'VSP' индекс по полю DEPARTMENT_TYPE не рабоотает, т.к. выбирается большой процент запией от всех строк таблицы DEPARTMENT_DOC_MASTER: Код: plsql 1. 2. 3. 4. 5. 6. 7.
Подскажите пожалуйста каким образом можно ускорить выполнение данного запроса (добавить индексы в таблицы или ущё что-то) со значением 'VSP' в параметре (хинты не помогут, т.к. изначальный запрос выполняется в HQL). ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 13:53 |
|
Медленная работа запроса на одном из значений параметра
|
|||
---|---|---|---|
#18+
План запроса с 'VSP': ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 13:57 |
|
Медленная работа запроса на одном из значений параметра
|
|||
---|---|---|---|
#18+
Визуализация плана запроса (если это как-то может помочь): ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 14:01 |
|
Медленная работа запроса на одном из значений параметра
|
|||
---|---|---|---|
#18+
chikaginsk Выполняется соединение этих двух таблиц по внешнему ключу DEPARTMENT_DOC_VERSION.DEPARTMENT_DOC_MASTER_ID: Если Вы посмотрите "хороший план", то "соединение ... по внешнему ключу" не обнаруживается. Hash join и full table scan'ы Я бы попытался в индекс index IDX_DEPARTMENT_DOC_VERSION_MASTER_ID on DEPARTMENT_DOC_VERSION (DEPARTMENT_DOC_MASTER_ID) добавить start_date, finish_date Почему version в запросе написали вперед master'а? Оно, конечно, в данном случае пофиг, но с точки зрения красоты коды - я всегда пишу наоборот. Аналогично и в index IDX_DEPARTMENT_DOC_MASTER_TYPE on DEPARTMENT_DOC_MASTER (DEPARTMENT_TYPE) хорошо бы добавить open и close date ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 14:09 |
|
Медленная работа запроса на одном из значений параметра
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, "Хороший план" - это который адаптивный? Там действительно полное сканирование каждой таблицы и HASH JOIN по ним. Хотя в плане на картинке (в сообщении 22337227 ) отображён индекс по внешнему ключу. Но он (если судить по Cost) никак не задействован. Если Вас не затруднит, то могли бы дать совет как можно ускорить запрос? Структуру таблиц менять мне не дадут. Может как-то можно изменить условия в запросе или добавить какие-то индексы? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 14:24 |
|
Медленная работа запроса на одном из значений параметра
|
|||
---|---|---|---|
#18+
chikaginsk Может как-то можно изменить условия в запросе или добавить какие-то индексы? Или добавить индексы или поля в существующий индекс. Если full table scan Вас устраивает, можете попытаться прохинтовать запрос. Но IMHO, full table scan это значит, что индексы не работают и их нужно отправлять в топку / делать новые ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 14:37 |
|
Медленная работа запроса на одном из значений параметра
|
|||
---|---|---|---|
#18+
1. При запросе с VSP - индексы не работают 2. При запросе с TB - у оптимизатора просто сорвало крышу, даже думать что этот план значит не хочется. Т.к. ясно, что по хорошему должно быть Nested Loop и два Index Scan'а Думаю, что добавление дат в индекс должно помочь Ну и судя по всему, это не только должно помочь, но и будет правильно. Т.к. ясно, что на исторических таблицах 95% запросов будет содержать условия с датами. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 14:40 |
|
Медленная работа запроса на одном из значений параметра
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, Благодарю за подробный ответ! После прочтения статьи про Hash Join подозревал, что нужны индексы на полях дат, но хотелось узнать мнение опытных людей. Прошу сделать небольшое уточнение - индексы для полей дат лучше создавать отдельные для каждого поля с датой (которые используются в условии WHERE) или в каждой таблице создать по одному составному индексу для обеих полей с датами? И ещё, в таблице DEPARTMENT_DOC_MASTER уже есть индекс (судя, по плану запроса, он не используется ни в одном из случаев) по полю DEPARTMENT_TYPE (которое используется в условии WHERE). Корректно ли будет добавить это поле в один составной индекс вместе с полями дат или для дат лучше создать отдельный(е) индекс(ы)? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 15:03 |
|
Медленная работа запроса на одном из значений параметра
|
|||
---|---|---|---|
#18+
chikaginsk Прошу сделать небольшое уточнение - индексы для полей дат лучше создавать отдельные для каждого поля с датой (которые используются в условии WHERE) или в каждой таблице создать по одному составному индексу для обеих полей с датами? Категорически нет. Должно быть один индекс, включающий в себя поля участвующие в варажении в where. Т.е. DEPARTMENT_DOC_MASTER_ID, start_date, finish_date и DEPARTMENT_TYPE, open_date, close_date Тогда Oracle будет отбирать по DEPARTMENT_DOC_MASTER_ID по b-tree, накладывать фильтр на start_date и finish_date и только за результатом залезать в основную таблицу. Если создать несколько индексов, то в лучшем случае они не будут использоваться, а в худщем IMHO & AFAIK приведут ко всякой порнографии (IMHO !) вида b-tree to bitmap index conversion и прочем радостям современных БД технологий. IMHO. Могу ошибаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 15:39 |
|
|
start [/forum/topic.php?fid=52&fpage=17&tid=1880101]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 239ms |
total: | 384ms |
0 / 0 |