代码之家  ›  专栏  ›  技术社区  ›  Rene Pot

1个查询中3个类似语句的速度问题(Oracle)

  •  2
  • Rene Pot  · 技术社区  · 14 年前

    这是我的一个查询片段:

    and (
        ADDR_FULLTEXT
        like upper(:streets1)
    )
    

    每当我执行查询时,这是的一部分,它将在大约0.05秒后执行。这太完美了! 但是,当我执行以下操作时:

    and (
        ADDR_FULLTEXT
        like upper(:streets1)
        AND
        ADDR_FULLTEXT
        like upper(:streets2)
    )
    

    它会产生一个20秒的查询。为什么差别这么大,怎么解决呢?

    查询的其余部分基本上是从一个视图中选择多个字段(addr_fulltext就是其中之一)。 还有另外一种,就像这个一样。

    也许我在这里做了一些非常错误的事情,也许因此有更好的方法来做这件事。

    仅供参考:一个PHP循环生成这个查询,这是搜索查询分解后的结果。在这个查询中,每个单词都会被解析,从而在一个查询中产生一个或多个相同的“like”。另一个相似是以同样的方式生成的,但这总是1相似,永远不会多,永远不会少。

    3 回复  |  直到 7 年前
        1
  •  1
  •   KM.    14 年前

    尝试将其分解为两个不同的查询,并取交叉点,例如:

    SELECT * FROM YourTable WHERE ADDR_FULLTEXT like upper(:streets1)
    INTERSECT
    SELECT * FROM YourTable WHERE ADDR_FULLTEXT like upper(:streets2)
    

    看见 Intersect

        2
  •  0
  •   Benoit    14 年前

    对于每一个LIKE语句,可能都有一个完整的表扫描,而查询的其余部分使用索引。

        3
  •  0
  •   Jeffrey Kemp    14 年前

    对该谓词的更改可能会更改CBO对该表将返回的行数的估计。这反过来可能导致计划的重大重组,从而导致绩效的变化。

    在您提供查询(包括视图)和查询计划之前,必须等待进一步的分析。