Я написал этот запрос, который «кубизирует» некоторые итоговые данные записи данных:
select upper(coalesce(left(k.SubStabilimento,12),'ALL')) as Stabilimento,
sum(k.PotenzialmenteInappropriato) as Numeratore,
count(k.ProgrSdo)-sum(k.PotenzialmenteInappropriato) as Denominatore,
case when (count(k.ProgrSdo)-sum(k.PotenzialmenteInappropriato)) > 0 then 1.0*sum(k.PotenzialmenteInappropriato) / (count(k.ProgrSdo)-sum(k.PotenzialmenteInappropriato)) else 0 end as Rapporto,
upper(coalesce(DescrDisciplina,'ALL')) AS Disciplina,
case when K.TipologiaDRG = 'C' then 'CHIR.'
when K.TipologiaDRG = 'M' then 'MED.'
when K.TipologiaDRG is null then 'ALL'
when K.TipologiaDRG = '' then 'SENZA TIPO'
end as TipoDRG,
case when [Anno]=@anno then 'ATTUALE'
when [Anno]=@anno-1 then 'PRECEDENTE'
else cast([Anno] as varchar(4))
end as Periodo,
upper(coalesce(left(k.mese,2), 'ALL')) as Mese,
upper(coalesce(NomeMese,'ALL')) as MeseDescr
from
tabella k
where k.Mese <= @mese
and k.anno between @anno-1 and @anno
and k.RegimeRicovero = 1
and codicepresidio=080808
and TipologiaFlusso like 'Pro%'
group by SubStabilimento, DescrDisciplina, TipologiaDRG, anno, mese,nomemese with cube
having grouping(anno) = 0
AND GROUPING(nomeMese) = GROUPING(mese)
этот простой код добавляется во время выполнения в соответствии со значением параметров, которые должны быть переданы в запрос:
if ( parameters.get('par_stabilimenti').toUpperCase() != "'TUTTO'" )
{ query = query + "and upper(coalesce(left(k.SubStabilimento,12),'AUSL_TOTALE')) in ("+ parameters.get('par_stabilimenti').toUpperCase() +" )";}
if ( parameters.get('par_discipline').toUpperCase() != "'TUTTO'" )
{ query = query + "and upper(coalesce(k.DescrDisciplina,'TOT. STABILIMENTO')) in ("+ parameters.get('par_discipline').toUpperCase() +" )";}
Параметры SQL передаются средой выполнения приложения
Я сделал (вручную) все индексации по отдельным столбцам и по первичному ключу таблицы, также я добавил индексы, предложенные настройщиком запросов sql server.
Теперь выполнение по-прежнему занимает слишком много времени (около 4 "), теперь мне нужно, чтобы он работал в 8 раз быстрее.
Есть ли какая-то оптимизация, которую я могу выполнить по запросу? (Параметры передаются приложением)
Есть ли способ, которым я могу пересчитать план выполнения, чтобы серверу sql не приходилось повторять его все время, пока я запускаю запрос?
У меня действительно нетИдея, как улучшить производительность помимо того, что я уже сделал.
Я на SQL Server 2018 pro (так что нет индексов columnstore)
Здесь вы можете найти план выполнения.