请帮助我调整以下查询的效果或建议任何替代逻辑。
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列创建了一个索引。 此查询是存储过程的一部分。此查询将是第一个在调用存储过程时执行的查询。
我在DB2数据库中有大约7百万条记录将执行此查询。我们正面临性能问题,需要花费很多时间。我怀疑因为Like谓词而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'
不应提取此内容。这是一个消极的案例。
答案 0 :(得分:0)
尝试LOCATE功能:
AND LOCATE(' '||V_SURNAME||' ', ' '||SURNAME||' ') > 0
DOB列应该是索引的前导列。