【问题标题】:Use Function Based Index on COUNT DISTINCT?在 COUNT DISTINCT 上使用基于函数的索引?
【发布时间】: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


【解决方案1】:

答案是:,在这种情况下您不能使用基于函数的索引。

只能在来自 ONE 表的列上创建索引(任何索引)。
COUNT 中的表达式引用了三个表:l + t + s

count(distinct (case when l.NAME ='LPS' and t.BATCH is null then s.SAMPLE_NUMBER
    else null end)) LPS 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 2012-07-22
    • 1970-01-01
    相关资源
    最近更新 更多