关于OracleSQL的优化(group by)

On the optimization of Oracle SQL (group by)

我现在的环境是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 秒。 table中大约有1000万条数据。 我如何优化此 SQL 或其他设置

I need to page query...

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

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

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

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

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