为啥这两个查询之间的性能增益存在差异?
Posted
技术标签:
【中文标题】为啥这两个查询之间的性能增益存在差异?【英文标题】:why there's a difference of performance gain among both these queries?为什么这两个查询之间的性能增益存在差异? 【发布时间】:2010-08-27 08:26:55 【问题描述】:选择 instmax, r 来自 (选择 instmax, 行号 r 来自 ( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST ) WHERE rownum ) 其中 r >=6;
输出
选择 instmax, r 来自 (选择 instmax, 行号 r 来自 ( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST ) ) WHERE r 在 6 到 10 之间;
输出
这两个查询之间真的有明确的性能提升吗?你能澄清一下吗?
【问题讨论】:
【参考方案1】:Oracle 无法将涉及别名 ROWNUM
的条件推送到内联视图中。
这意味着第二个查询将使用对rn
进行过滤的全表(或索引)扫描,而第一个查询将使用STOPKEY
(因为它使用无别名的ROWNUM < 10
)
您可能想阅读这篇文章:
Oracle: ROW_NUMBER vs ROWNUM【讨论】:
我无法打开该链接。您能否扩大解释范围? @Pradosh:那里的文字太多,无法在此处复制。该链接有效(刚刚检查过)。【参考方案2】:那可能是因为 STOPKEY 优化不再起作用了。
“rownum
您应该比较执行计划并查找“STOPKEY”,如果它在,则它是优化的Top-N查询。
另见:
http://blog.fatalmind.com/2010/07/30/analytic-top-n-queries/
【讨论】:
这个 STOPKEY 优化究竟是什么?你能用简单的方式解释一下吗? @Pradosh:这意味着引擎将在获取10th
记录后停止查询。
@Quassnoi.ok 所以在第一个查询中它只会获取到第 10 行。ok
STOPKEY 表示数据库停止搜索更多值,因为已达到“rownum
以上是关于为啥这两个查询之间的性能增益存在差异?的主要内容,如果未能解决你的问题,请参考以下文章