Оптимизация запросов вне индексов - PullRequest
0 голосов
/ 23 октября 2018

Я написал этот запрос, который «кубизирует» некоторые итоговые данные записи данных:

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)

Здесь вы можете найти план выполнения.

...