【发布时间】:2013-04-15 15:01:28
【问题描述】:
在 Oracle 中构建和调整查询时,速度通常是开发人员主要关心的问题。但是,在调整特定查询时,我最近尝试了 FIRST_ROWS 和 NO_CPU_COSTING 提示,生成的执行计划在执行时间上比之前的计划快 80%,但成本高出 300%。执行计划中的 I/O 非常少,而且所有额外开销似乎都来自两个视图之间的嵌套循环外连接。
这个查询是分页的,所以我只需要前几百行。缺乏重要的 I/O 使我认为这个查询不会依赖于缓存,乍一看似乎是要走的路。但是,由于我从未见过查询的速度提高和同时成本如此之高,我不确定使用此查询可能有什么缺点。有吗?
【问题讨论】:
-
您提到的两个提示是非常面向嵌套循环的 - NL 对于检索前 N 行很有用,而且对于非常便宜的 CPU 而言,这是一种非常简单的方法。另一种选择是例如合并排序 - 主要用于连接两个大表。它的 CPU 很昂贵,因为它需要排序。散列连接也是 CPU 昂贵的,因为它需要应用散列函数。我不具体了解您的情况,但大多数系统都受磁盘限制而不是 CPU 限制,因此减少磁盘读取量会降低成本。
-
其实我觉得准确性比速度更重要。
-
我曾在一个表中有超过 500,000 行的系统上工作过。我认为速度是必须的,否则会损害整个系统。
-
您的意思是在获取 所有 行时,还是在获取第一个屏幕时,它的速度提高了 80%?如果只获取第一个屏幕,那么这完全符合预期 - 完整查询的总成本更高,但前几行的经过时间更短。
-
@TonyAndrews 查询本身是分页的,所以resulset比较小,最坏的情况下不到几百行。
标签: sql performance oracle query-optimization sql-execution-plan