【问题标题】:Why does select max(field) from table work so fast as compared to select min(field) from table, Oracle 9i为什么 select max(field) from table 比 select min(field) from table 工作得这么快,Oracle 9i
【发布时间】:2011-09-09 04:50:45
【问题描述】:

我遇到了在 Oracle 9i 中运行 select max 语句的机会,它运行得非常快。

select max(id) from audit_log; 

select min(id) from audit_log;

但是,在运行 select min 时,查询似乎挂起并且永远不会返回。该表有审计日志和几亿条记录。

Explain plan for select min

Explain plan for select max

【问题讨论】:

  • 您收到explain plan 和/或trace 了吗?
  • 嗨汉克,我刚刚做了一个快速解释计划,不确定我是否做得正确。
  • 我无法从这里访问图像。您可以将文本内容剪切并粘贴到您的问题中吗?
  • @Jens Schauder 据我所知,它们是相同的。
  • @Chin Boon 他们看起来像是在向我解释计划。不幸的是,没有什么能说明为什么min 的行为如此奇怪。我建议进行跟踪并通过TKPROF 运行它以尝试更深入地了解问题。我不是 Oracle DBA,所以如果不是很明显,我可能无法提供帮助,但大多数 DBA 可能无论如何都会要求提供此信息,所以我希望这不会完全浪费时间。

标签: oracle select max oracle9i min


【解决方案1】:

一个可能的原因是列 ID确实有索引,但可以为空。在这种情况下,ID 为 null 的行不会在索引中。因此 min() 不能使用可空列上的索引。

...所以你可能只需要alter table audit_log modify id not null;

或者您可以创建一个新的复合索引,在 ID 后面有一个非空列。这应该也可以,因为这样每一行都会有一个条目。

【讨论】:

  • 如果这是问题所在,解释计划会不会有所不同?
  • 我也是这么认为的,但是一个快速的实验表明 min 和 max 都以相同的方式处理 NULL,所以我不明白这如何解释所描述的行为。
【解决方案2】:

您的最大值可能在内存中。如果它快速增加,它可能一直在内存中。如果没有人访问最小值,则必须检索它。

可能是您遇到了锁定问题。尝试更改隔离级别,看看是否会有所不同。

可能是您的索引已损坏。尝试重建它。

【讨论】:

    猜你喜欢
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多