关于Oracle SQL的优化(分组依据)

问题描述 投票:-2回答:1

我当前的环境是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或其他设置

sql database oracle10g
1个回答
0
投票

我需要页面查询...

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.