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

Posted

技术标签:

【中文标题】使用 like 谓词(模式匹配)对 DB2 Z/oS 的 SQL 查询进行性能调优【英文标题】:Performance Tuning of SQL query for DB2 Z/oS with like predicate(Pattern Match) 【发布时间】:2015-11-20 06:35:23 【问题描述】:

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

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 数据库中有大约 700 万条记录,将在这些记录上执行此查询。我们正面临性能问题,这需要很长时间。我怀疑是因为带有 OR 运算符的 Like Predicate 是问题的原因。 实现此逻辑以执行模式搜索。请查看以下测试用例:

案例一。

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 列应该是索引的前导列。

【讨论】:

以上是关于使用 like 谓词(模式匹配)对 DB2 Z/oS 的 SQL 查询进行性能调优的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的子查询谓词中的 LIKE[c] 与此名称不匹配?

通配符过滤正则表达式

MySQL 学习三 关于转义

MySQL常用命令(四)-REGEXP

Day-5:通配符过滤

Oracle Like(模式匹配)子句