为啥这两个查询之间的性能增益存在差异?

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

以上是关于为啥这两个查询之间的性能增益存在差异?的主要内容,如果未能解决你的问题,请参考以下文章

CTE、子查询、临时表或表变量之间是不是存在性能差异?

我正在尝试提高查找两个表之间差异的 Oracle SQL 的性能

您如何解释这两个查询的性能差异?

与嵌套选择混淆性能增益 * 不存在

视图和存储过程之间是不是存在性能差异

concat 与 || 之间是不是存在性能差异?在甲骨文中