当我在标题字段上使用contains()
函数时,参数长度为1(例如..... where contains(title , '%x%') > 0
)
我的查询响应时间变慢了。
据我所知,这是因为参数的长度(即length ('x') = 1
)
有没有优化此类查询的解决方案?
答案 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%
仅以索引范围扫描结束并获得更好的性能。