У меня есть следующий запрос, который занимает около 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;
Недостаточно данных: сколько строк в каждой таблице удовлетворяют условию объединения? Существуют ли другие индексы? средний размер строк в каждой таблице? Также, конечно, это поможет получить фактический ** план оптимизатора **! * В общем случае * простое вычисление, подобное простому 'CASE', принимает порядковые величины ** меньше ** ресурса и времени, чем фактически нахождение строк (что выглядит как большой FULLSCAN + HASH JOIN). –