Вопрос

Недавно меня передали с Пепел отчет от 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top