Настройка производительности SQL-запроса для DB2 Z/oS с похожим предикатом (Pattern Match)
Пожалуйста, помогите мне в настройке производительности запроса ниже или предложите альтернативную логику.
Select FNAME, MNAME, SURNAME, DOB, ADDRESS, PHONE
from INDIVIDUAL_DATA
WHERE DOB = V_DOB
AND (SURNAME = V_SURNAME
OR (SURNAME LIKE '%' || ' ' || V_SURNAME)
OR (SURNAME LIKE V_SURNAME || ' ' || '%')
OR (SURNAME LIKE '%' || ' ' ||
V_SURNAME || ' ' || '%'));
V_SURNAME - это переменная с вводом фамилии, а V_DOB - с вводом DOB(Дата рождения). Я создал индекс, используя SURNAME и столбец DOB. Этот запрос является частью хранимой процедуры. и этот запрос будет первым запросом, который выполняется при вызове хранимой процедуры.
У меня около 7 миллионов записей в базе данных DB2, по которым будет выполняться этот запрос. Мы сталкиваемся с проблемой производительности, которая занимает много времени. Я подозреваю, что причина проблемы связана с оператором Like Predicate с оператором OR. Эта логика реализована для выполнения поиска по шаблону. Пожалуйста, посмотрите на тестовые случаи ниже:
Случай 1.
DOB= 1992-10-10 and SURNAME = 'ALEX MATHEWS'
V_DOB = '1992-10-10' and SURNAME = 'ALEX'
это должно найти положительное совпадение.
случай 2.
DOB= 1965-05-10 and SURNAME = 'FRANKLIN JERRY'
V_DOB = '1965-05-10' and V_SURNAME = 'FRANK'
Это не должно быть получено. это негативный случай.
1 ответ
Попробуйте функцию LOCATE:
AND LOCATE(' '||V_SURNAME||' ', ' '||SURNAME||' ') > 0
Столбец DOB должен быть ведущим столбцом индекса.