使用类似谓词(模式匹配)对DB2 Z / oS的SQL查询进行性能调优

时间:2015-11-20 06:35:24

标签: sql db2 pattern-matching sql-like sql-tuning

请帮助我调整以下查询的效果或建议任何替代逻辑。

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'

不应提取此内容。这是一个消极的案例。

1 个答案:

答案 0 :(得分:0)

尝试LOCATE功能:

AND LOCATE(' '||V_SURNAME||' ', ' '||SURNAME||' ') > 0

DOB列应该是索引的前导列。