如何使用contains子句优化查询

时间:2016-04-27 11:24:19

标签: oracle query-optimization contains

当我在标题字段上使用contains()函数时,参数长度为1(例如..... where contains(title , '%x%') > 0) 我的查询响应时间变慢了。 据我所知,这是因为参数的长度(即length ('x') = 1

有没有优化此类查询的解决方案?

2 个答案:

答案 0 :(得分:1)

你是否只使用CONTAINS来检查标题是否包含字母x?这是一种非常低效的方式。请改用:

... where title like '%x%'

"像"简单地返回是或否,它不会像包含那样计算得分。并且没有包装" title"在一个函数中,Oracle优化器可以自由地使用" title"如果你定义了一个。 (如果你没有考虑加一个。)

祝你好运!

答案 1 :(得分:1)

问题不在于搜索字符串的长度。 搜索%xxxxxxxxxxx%将需要相似的时间。

问题出在前导%,它会禁用索引范围扫描。要匹配%x% ,必须扫描整个索引。

您应该尝试仅限制搜索x%,即没有前导%,这通常是不可能的,因为您只获得结果的子集。

在某些情况下,这是可能的,我将在一个简单的例子中说明它。

假设您正在搜索表的前缀,并且表可以是非限定的和合格的。

您必须搜索%x%以获得两个字符串的匹配:

XTABLE   
OWNER.XTABLE2

您可以做的是将点定义为whitespace
这将分割所有者形成表名和索引三个tokes:

XTABLE   
OWNER
XTABLE2

这将使搜索x%仅以索引范围扫描结束并获得更好的性能。