Настройка производительности 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 должен быть ведущим столбцом индекса.

Другие вопросы по тегам