使用子字符串与使用通配符的SQL比较的性能

时间:2011-09-15 17:00:09

标签: sql optimization db2 ibm-midrange

我正在处理两个表之间的连接条件,其中一个要匹配的列是值的连接。我需要将tableA中的columnA加入tableB中columnB的前2个字符。

我已经开发了两个不同的语句来处理这个问题,我试图分析每种方法的性能。

方法1:

ON tB.columnB   like  tA.columnA || '%'

方法2:

ON substr(tB.columnB,1,2) = tA.columnA

与方法2相比,查询执行计划使用方法1的步骤少得多,但是,方法2的执行速度要快得多。此外,执行计划显示了方法2的推荐索引,可以提高其性能。

我在IBM iSeries上运行它,虽然对一般意义上的答案感兴趣,以了解有关sql查询优化的更多信息。

方法2执行得更快是否有意义?

这个问题类似,但似乎没有人对这些方法的性能差异提供任何具体的答案:T-SQL speed comparison between LEFT() vs. LIKE operator

PS:需要这种类型的连接的表设计不是我此时可以更改的内容。我意识到将具有不同类型数据的字段分开是可取的。

4 个答案:

答案 0 :(得分:3)

我在DB2 LUW 10.1数据库中的一个表上的IBM Data Studio中的SQL Advisor中运行了以下内容:

SELECT *
FROM PDM.DB30
WHERE DB30_SYSTEM_ID = 'XXX'
    AND DB30_VERSION_ID = 'YYY'
    AND SUBSTR(DB30_REL_TABLE_NM, 1, 4) = 'ZZZZ'

SELECT * 
FROM PDM.DB30 
WHERE DB30_SYSTEM_ID = 'XXX' 
    AND DB30_VERSION_ID = 'YYY' 
    AND DB30_REL_TABLE_NM LIKE 'ZZZZ%' 

它们都具有完全相同的访问路径,使用相同的索引,相同的估计IO成本和相同的估计基数,唯一的区别是LIKE的估计总CPU成本为178,343.75,而SUBSTR为197,518.48(~10%)差)。

两者的累计总成本相同,因此根据顾问的不同,这个差异可以忽略不计。

答案 1 :(得分:2)

是的,方法2会更快。 LIKE不是一个有效的功能。

要比较各种技术的性能,请尝试使用Visual Explain。你会发现它埋藏在System i Navigator中。在系统连接下,展开数据库,然后单击您的RDB名称。在右下方窗格中,您可以单击“运行SQL脚本”选项。输入SELECT语句,然后选择Visual Explain或Run and Explain的菜单选项。 Visual explain将细分您的对帐单的执行计划,并显示每个部分的成本,这些成本是根据可用索引在表上估算的。

答案 2 :(得分:1)

您实际上可以在数据库中使用真实示例运行。

LIKE在我的跑步中总是更好。

select count(*) from u_log where log_text like 'AUT%';
1 row(s) returned : 90ms taken

select count(*) from u_log where substr(log_text,1,3)='AUT';
1 row(s) returned : 493ms taken

答案 3 :(得分:0)

我在与IBM性能相关的IBM红皮书中找到了这个引用。听起来SUBSTR标量函数可以由iSeries以优化的方式处理。

  

如果您搜索第一个字符并想要使用SQE   对于CQE,您可以在左侧标志上使用标量函数子字符串   等号。如果你必须搜索其他字符   在字符串中,您还可以使用标量函数POSSTR。通过   将LIKE谓词拆分为多个标量函数,即可   影响查询优化器使用SQE。

http://publib-b.boulder.ibm.com/abstracts/sg246654.html?Open