我正在处理两个表之间的连接条件,其中一个要匹配的列是值的连接。我需要将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:需要这种类型的连接的表设计不是我此时可以更改的内容。我意识到将具有不同类型数据的字段分开是可取的。
答案 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