LIKE运算符的预准备语句的执行计划

时间:2015-02-14 20:59:07

标签: sql sql-like sql-execution-plan

我想知道为准备好的查询创建的执行计划之间是否存在初始或稍后提供LIKE谓词中的'%'的区别。我的意思是否这个

SELECT * FROM table WHERE column LIKE ? || '%'

然后将占位符设置为您要查找或正在执行的值

SELECT * FROM table WHERE column LIKE ?

然后将占位符设置为您要查找的值加上'%'后缀将导致不同的执行计划(假设第一个更高效)。

在第一个版本中,理论上数据库会知道我可能要查询的是前缀,因此选择一个索引来执行此操作,而对于第二个形式,它是任意的,它不能假设任何东西(那说,当然还有第一种形式,我仍然可以自由地放置任何%,所以仍然需要一些后备。)

所以可能会有一些性能优势,特别是在一些经过严格优化的商业数据库上,做第一个或者无关紧要,因为两个执行计划都是相同的,并且需要在填充参数后做一些额外的准备工作?

2 个答案:

答案 0 :(得分:3)

您没有指定数据库,但使用双垂直部分进行字符串连接建议使用Oracle或Postgres。

在任何情况下,大多数数据库引擎都足够聪明地认识到这一点:

where col like 'pattern%'

可以由col上的索引处理。我很确定Postgres和Oracle都会进行这种优化(就像MySQL和SQL Server以及其他数据库一样)。

下一部分是猜测。我想象当将参数化常量替换为字符串时,相同的优化也起作用。您可以通过查看数据库中此类查询的执行计划来检查这一点。

如果您需要更复杂的文本匹配算法,大多数数据库都支持全文搜索 - 这可以大大加快搜索操作的速度。

答案 1 :(得分:0)

实际导致缓存计划的预准备语句将永远不会使用任何索引,因为它不知道提供的参数中有哪种通配符。仅当优化器决定不使用缓存计划(即每次基于参数中的实际值重新优化查询)时,它实际上可能使用索引。