У меня есть представление, которое содержит все данные, относящиеся к сотруднику. у него было около 350 тыс. Записей. Мне нужно создать функцию поиска имени. Это позволит получить все данные, соответствующие введенному ключевому слову.Оптимизация поиска строк в oracle
Производительность запроса очень медленная, для получения данных требуется 15-20 секунд. Экономически 15000
Мой запрос:
SELECT H.PERSON_ID,
B.EMPLOYEE_ID,
INITCAP(B.FIRST_NAME) EMP_FNAME,
INITCAP(B.MIDDLE_NAME) EMP_MNAME,
INITCAP(B.LAST_NAME) EMP_LNAME,
B.EMPLOYEE_TYPE PERSON_DESC,
B.EMPLOYMENT_STATUS STATUS_TYPE,
EA.BASE_BRANCH
FROM EMPLOYEE_BASIC_DTLS B,
EMP_ASSIGNMENT_DTLS_MV EA,
EMPLOYEE_HIS_DEPNDENT_TBL H
WHERE B.PERSON_ID = EA.PERSON_ID
AND B.PERSON_ID = H.PERSON_ID
AND ((UPPER(B.FIRST_NAME) LIKE
('%' || V_SEARCH_PARAM1 || '%')) OR
(UPPER(B.MIDDLE_NAME) LIKE
('%' || V_SEARCH_PARAM1 || '%')) OR
(UPPER(B.LAST_NAME) LIKE
('%' || V_SEARCH_PARAM1 || '%')))
AND TRUNC(SYSDATE) BETWEEN EA.EFFECTIVE_START_DATE AND
EA.EFFECTIVE_END_DATE
AND UPPER(H.RELATIONSHIP_CODE) = 'A';
С EMPLOYEE_BASIC_DTLS вид я не могу использовать индексацию.
Вам действительно нужен главный шаблон во всех ваших выражениях? У вас действительно есть люди, которые хотят найти «Justin Cave», когда они набирают «stin»? Ведущая дикая карта будет препятствовать использованию любых индексов на базовой таблице. Если вы действительно хотите создать основной шаблон, вы можете использовать индекс Oracle Text и реорганизовать свой запрос на использование 'CONTAINS', а не' LIKE', но это также довольно сложно. –