【发布时间】:2013-09-28 15:32:13
【问题描述】:
我有以下查询,执行大约需要 23 - 30 秒。样本表有 280 万行,测试表有 2110 万行。 我有关于主键样本号和测试号的索引,但是 count(distinct) 子句对性能造成了严重影响。我可以在 COUNT DISTINCT 上使用基于函数的索引来提高性能吗?
select
l.NAME as LABORATORY,
count(distinct s.SAMPLE_NUMBER),
count(distinct (case when l.NAME ='LPS' and t.BATCH is null then s.SAMPLE_NUMBER
else null end)) LPS
from LABORATORY l inner join SAMPLE s on l.NAME = s.LAB
inner join TEST t on s.SAMPLE_NUMBER = t.SAMPLE_NUMBER
and s.STATUS <> 'U' and s.TEMPLATE <> 'QC_SAMPLE' and t.STATUS in ('I', 'P')
group by l.NAME;
【问题讨论】:
-
数据不足:每张表有多少行满足join条件?还有其他指标吗?每个表中行的平均大小?当然,制定实际的优化器计划也会有所帮助! 一般像简单的
CASE这样的简单计算比实际查找行(看起来像一个大的 FULLSCAN + HASH JOIN)要花费数量级更少的资源和时间。
标签: oracle