索引之外的查询优化

时间:2018-10-23 16:05:54

标签: sql sql-server optimization cube rolap

我写了这个查询,“求”一些写部分总数的数据:

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 server在启动查询时不必每次都重新执行它?

我真的不知道如何提高性能,超越我已经做到的。

我正在使用SQL Server 2018 Pro(因此没有列存储索引)

Here,您可以找到执行计划。

0 个答案:

没有答案