0

我正在尝试优化以下查询以提高性能,尤其是联接。我将不胜感激任何建议和帮助。非常感谢。我正在考虑使用 CTE 而不是子查询

询问:

Select  year(dtb.tbDATE) as YearR, 
     `CONVERT(VARCHAR(12),dtb.tbDATE,110) as DateR,
     (case when dtb.l_grp_no= 7 then COMPANY_B else COMPANY_A end ) as Portfolio,
     (case when dtb.past_days between 5 and 30 then '5-30'
          when dtb.past_days between 31 and 60  then'31-60'
          when dtb.past_days between 61 and 90  then '61-90'
          when dtb.past_days >= 91 then '91+' 
          when dtb.past_days <5 then 'Current' else 'Dis_po' end) 'Qdel',
     case when lsc.SStatusC is not null and dtb.tbDATE> ls.eff_date 
          then lsc.SStatusC else 'XX'end as 'LStatus',
     count(dtb.refaccno) as lcount,
     sum (dtb.P_bal) as Lbal
from sln.[dbo].[table_dtb] as dtb
     --left outer join sln.dbo.acct_l la on dtb.accrefno = la.accrefno
     left outer join (select stat_acct_l.* from sln.dbo.stat_acct_l
     inner join 
         (select refaccno, max(row_id) as MaxRow_id
          from sln.dbo.stat_acct_l
          group by refaccno) as maxStatus 
        on stat_acct_l.refaccno = maxStatus.refaccno 
            and stat_acct_l.row_id = maxStatus.MaxRow_id) as ls 
        on ls.refaccno = dtb.refaccno
     left outer join dw.dbo.AccSt_C lsc on lsc.Stat_C_ID= ls.status_code_no
where dtb.l_grp_no in (7,4,8,15)and dtb.tbDATE > '2010-06-31'
     and dtb.P_bal+dtb.l_C_bal >0
group by year(dtb.tbDATE), CONVERT(VARCHAR(12),dtb.tbDATE,110),
     case when dtb.past_days between 5 and 30 then '5-30'
          when dtb.past_days between 31 and 60  then'31-60'
          when dtb.past_days between 61 and 90  then '61-90'
          when dtb.past_days >= 91 then '91+' 
          when dtb.past_days <5 then 'Current' else 'Dis_po' end
     case when dtb.l_grp_no= 7 then COMPANY_B else COMPANY_A end,
          case when lsc.SStatusC is not null 
                    and dtb.tbDATE> ls.eff_date Yearthen 
           lsc.SStatusC else 'XX'
      end
order by year(dtb.tbDATE), CONVERT(VARCHAR(12),dtb.tbDATE,110),
      case when dtb.l_grp_no= 7 then COMPANY_Belse COMPANY_A end
4

3 回答 3

0

我会尝试将您的案例陈述封装到 UDF 中。与常规 case 语句相比,这些应该作为 UDF 更快地计算。这也将使您的查询更易于分析和维护。

于 2013-02-14T10:31:37.097 回答
0

您可以从GROUP BY子句中删除的列越多越好。根据您正在处理的行数,根据您的选择列表创建一个临时表或表变量可能是值得的,该列表包含一个名为“past_days_group”的列以容纳 5-30、31-60 等。 .CASE插入临时表时执行当前在您的group by子句中的逻辑,然后您可以从“past_days_group”分组的临时表中选择您的查询。

于 2013-02-14T03:15:43.830 回答
0

我注意到了几件事。首先,如果您首先查看您的数据,您可以优化您的案例结构。然后对您的案例进行排序,以便首先查看最有可能返回 true 的案例。你可能已经这样做了,很难说。

接下来,将更多过滤从 where 子句移至 join 子句。例如,这个:

left outer join dw.dbo.AccSt_C lsc on lsc.Stat_C_ID= ls.status_code_no
WHERE dtb.l_grp_no in (7,4,8,15)and dtb.tbDATE > '2010-06-31' 
and dtb.P_bal+dtb.l_C_bal >0

可能会像这样运行得更快:

left outer join dw.dbo.AccSt_C lsc on lsc.Stat_C_ID= ls.status_code_no
AND dtb.l_grp_no in (7,4,8,15)and dtb.tbDATE > '2010-06-31' 
and dtb.P_bal+dtb.l_C_bal >0

另外,不要选择不需要的字段。你真的需要这里的每一列吗?

left outer join (select stat_acct_l.* from sln.dbo.stat_acct_l

也许这些会有所帮助。

于 2013-02-14T00:10:39.883 回答