在Oracle中构建和调优查询时,速度通常是开发人员主要关注的问题。但是,在调优特定查询时,我最近尝试了FIRST_ROWS和NO_CPU_COSTING提示,并且生成的执行计划比执行时间的前一个计划快80%,但成本却高出300%。执行计划中的I / O非常少,并且所有额外成本似乎来自两个视图之间的嵌套循环外连接。
这个查询是分页的,所以我只需要前几百行。缺乏重要的I / O导致我认为这个查询不依赖于缓存,乍一看似乎是要走的路。但是,由于我从未见过查询速度增加和同时花费如此之多,我不确定使用此查询的缺点是什么。有没有?
答案 0 :(得分:4)
这是一个非常典型的查询,其中等值连接被优化以在需要完整数据集时使用散列连接,并且当仅需要前几行时使用嵌套循环,或者使用排序用于在索引可以更有效地用于子集的完整日期集上排序。
当然,如果优化器不知道您只是要使用行的子集,那么它不会为您实际执行的查询提供成本,因为它包含所有嵌套循环操作的成本永远不会执行。
但是,估计的成本没有任何不正确之处,它只是它的本质。如果您想要一个更有意义的数字供您自己理解,那么请使用rownum限制。
顺便说一下,不推荐使用FIRST_ROWS,而选择first_rows(1),first_rows(10),first_rows(100)或first_rows(1000)。