这是我的查询片段:
and (
ADDR_FULLTEXT
like upper(:streets1)
)
每当我执行查询时,这是其中的一部分,它在大约0.05秒内执行。太棒了! 但是,当我做以下事情时:
and (
ADDR_FULLTEXT
like upper(:streets1)
AND
ADDR_FULLTEXT
like upper(:streets2)
)
导致20秒的查询。为什么差异很大,如何解决这个问题?
查询的其余部分基本上是从视图中选择多个字段(ADDR_FULLTEXT就是其中之一)。 还有另外一个像这样的。
也许我在这里做了一些非常错误的事情,也许因此有更好的办法。
仅供参考:PHP循环生成此查询,该查询是由搜索查询的爆炸引起的。在此查询中解析每个单词,在1个查询中生成1个或多个相同的“like”。另一个像是以相同的方式生成,但这总是1个,从不多,从不少。
答案 0 :(得分:1)
尝试将其分解为两个不同的查询,然后选择交叉点,如:
SELECT * FROM YourTable WHERE ADDR_FULLTEXT like upper(:streets1)
INTERSECT
SELECT * FROM YourTable WHERE ADDR_FULLTEXT like upper(:streets2)
请参阅Intersect
答案 1 :(得分:0)
您可能会为每个LIKE语句进行全表扫描,其余查询使用索引。
答案 2 :(得分:0)
对此谓词的更改可能会更改CBO对表返回的行数的估计。这反过来可能导致计划的重大重组,从而导致业绩发生变化。
进一步分析必须等到您提供查询(包括视图)和查询计划。