使用 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 查询进行性能调优的主要内容,如果未能解决你的问题,请参考以下文章