2013-09-23 2 views
0

У меня есть следующий запрос, который занимает около 23-30 секунд для выполнения. Таблица образцов содержит 2,8 миллиона строк, а таблица тестов - 21,1 миллиона строк. У меня есть индексы по номеру первичных ключей и номеру теста, но предложение 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

Ответ: НЕТ, вы не можете использовать индекс на основе функции в этом случае.

Индекс (любой индекс) может быть создан только для столбцов, поступающих из одной таблицы.
Выражение COUNT ссылается на три таблицы: л + т + S

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