在1个查询中加速3个类似语句的问题(oracle)

时间:2010-10-04 15:07:51

标签: php sql oracle performance sql-like

这是我的查询片段:

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个,从不多,从不少。

3 个答案:

答案 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对表返回的行数的估计。这反过来可能导致计划的重大重组,从而导致业绩发生变化。

进一步分析必须等到您提供查询(包括视图)和查询计划。