关于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 查询[任何]更快。
我现在的环境是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 查询[任何]更快。