【问题标题】:On the optimization of Oracle SQL (group by) [closed]关于Oracle SQL的优化(分组)[关闭]
【发布时间】:2020-01-07 02:35:29
【问题描述】:

我目前的环境是Oracle 10g。我的 SQL 语句是:

select t.pici pici,
      min(t.fdate) minfdate,
      max(t.rdate) maxrdate,
      count(1) countNum
from 
      test t
group by 
      t.pici
order by 
      minfdate desc

我还在 pici、fdate、rdate 上创建了索引。我需要分页查询这个结果,但是太慢了。此 SQL 语句需要 15 秒。 表中有大约 1000 万条数据。 如何优化此 SQL 或其他设置

【问题讨论】:

  • 这与 Java 无关。请用 relevant 标签标记您的问题。它将帮助您更快地获得答案。

标签: sql database oracle10g


【解决方案1】:

我需要分页查询...

您的查询没有任何过滤条件(WHERE 子句),因此它包括整个表(所有行)。计算 1000 万行需要一些时间。没办法。

这不适合交互式查询。如果是这种情况,您将需要重新考虑您的策略。可能您需要将查询结果预先计算到临时表或物化视图(带有索引)中,并每隔一小时左右刷新一次临时表。您不可能每次都运行 1000 万行查询,可能同时有多个用户。

话虽如此,您仍然可以通过使用“覆盖索引”来改进查询,至少稍微改进一下。也就是说,创建一个索引,其中包含GROUP BY 子句中的列,然后是SELECT 子句中的列。根据您的示例,您应该使用的覆盖索引是:

create index ix1 on test (pici, fdate, rdate);

这个覆盖索引可能允许优化器跳过读取堆而只使用索引,但这不是一个确定的事情;优化器将使用表统计信息和棘手的操作(以及缓存的 I/O)来检索必要的数据。您应该尝试添加此索引,看看它是否会使您的 Oracle 查询 [any] 更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2015-09-18
    相关资源
    最近更新 更多