0

実行に約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;
4

1 に答える 1

1

答えはNOです。この場合、関数ベースのインデックスは使用できません。

インデックス (任意のインデックス) は、1 つのテーブルからの列に対してのみ作成できます。
COUNT の式は 3 つのテーブルを参照します: l + t + s

count(distinct (case when l.NAME ='LPS' and t.BATCH is null then s.SAMPLE_NUMBER
    else null end)) LPS 
于 2013-09-23T18:12:58.790 に答える