2013-09-23 37 views
0

我有以下查詢需要大約23 - 30秒執行。樣品臺有280萬行,測試臺有2110萬行。 我在主鍵樣本號和測試號上有索引,但是count(distinct)子句對性能造成嚴重影響。我可以在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; 
+1

數據不足:多少行中的每個表滿足連接條件?還有其他的索引嗎?每個表中的行的平均大小?當然,這將有助於實際的**優化器計劃**! *一般來說*簡單的計算就像一個簡單的'CASE'比實際查找行(看起來像是一個大的FULLSCAN + HASH JOIN)要小几個數量級**資源和時間。 –

回答

1

答案是:NO,你不能在這種情況下使用功能的索引。

只能在來自一個表的列上創建索引(任何索引)。
中COUNT的表達式引用三個表:升+ T + S

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