Oracle Ash Report
-
16-10-2019 - |
Вопрос
Недавно меня передали с Пепел отчет от DBA.
Для меня этот отчет похож на французский. Я понятия не имею, о чем это и что все написано в этом отчете. Может ли кто -нибудь, пожалуйста, направить меня в прочтении и объяснить, какие все шаги я должен предпринять, чтобы сделать мой запрос стабильным и меньше потребителя процессора. Более того, какой запрос занимает больше процессора.
1. Пожалуйста, порекомендуйте, какие действия я должен выполнить.
2. Какой запрос потребляет больше моего процессора и что я должен сделать, чтобы улучшить его.
Решение
Я начну с того, что Oracle DBA должен знать, в чем проблема, глядя на отчеты Ash и AWR. Без сообщений AWR трудно понять, в чем здесь настоящая проблема. Тем не менее, я помогу вам с первым запросом.
Лучший запрос в Top SQL with Top Row Sources
показывает запрос с SQL_ID 8t441yd5bwygd
выполняет сканирование таблицы. Вы можете увидеть текст запроса в Complete List Of SQL Text
раздел.
Основная проблема здесь заключается в том, что есть LIKE
пункт в запросе, который также использует lower()
Функция для преобразования данных столбца в нижний регистр, который затем сравнивается с переменной связывания :1
, которое является значением, передаваемым в запрос из приложения.
Сократить:
select *
from PERSON_CARD
where lower(PERSON_ID) like :1;
Чтобы правильно ответить на вопрос, нам действительно нужна дополнительная информация о типах данных задействованных столбцов и возможных значениях, которые могут быть переданы в предложение о том, где приложением, но есть несколько возможностей.
Я беспокоюсь о том, что этот SQL (и, вероятно, дизайн схемы) генерируется Hibernate, и этот Person_id - длинная шестнадцатеричная строка, а не целое число.
1) Данные в столбце Person_ID-это немерная строка:
Если (и только если) входное значение: 1 содержит только один подстановка в конце строки (например: LIKE "foo%"
) вы можете создать функциональный индекс в столбце Person_id:
create index person_card_pid_idx on person_card(lower(person_id));
Это приведет к сканированию диапазона индекса, а не сканированием таблицы (я надеюсь!).
2) Данные в столбце Person_ID на самом деле являются целым числом, которое точно соответствует значению, передаваемому как: 1
2 возможности здесь. Если Person_id еще не указан в базе данных, добавьте индекс. Если он уже проиндексирован, попросите разработчиков изменить приложение на использование PERSON_ID=:1
вместо того, чтобы с более низким вызовом ().
3) Данные в столбце Person_ID-это немерная строка, а значение в: 1 Соответствующее содержит подстановочные знаки «%» в начале строки
Вам придется использовать текстовые индексы Oracle.