vs sql加入vs本机合并vs格式的情况

时间:2018-05-28 10:15:17

标签: sql sas

我必须处理大量代码,我觉得应该运行得更快,我怀疑某些问题与case when中过度使用PROC SQL有关。

从PROC SQL查询中获取的代码示例如下:

 (case 
when t3.AFFC_AFF_CONTACT_ID^=. and t3.AFFC_CHANNEL in ('F2F' 'F2' 'ME' 'VI' 'AP') then 'F2F'
when t3.AFFC_AFF_CONTACT_ID^=. and t3.AFFC_CHANNEL in ('T' 'CB' 'CE' 'VOICE') then 'TEL'
when t3.AFFC_AFF_CONTACT_ID^=. and t3.AFFC_CHANNEL='' and AFFC_BRANCH in ('CC_FR' 'CC_GENT' 'CC_LIEGE' 'CC_NL') then 'TEL'
when t3.AFFC_AFF_CONTACT_ID^=. and t3.AFFC_CHANNEL in ('DM_EMAIL' 'EMAIL' 'EMAIL_PS' 'OE' 'EMA' 'DM_' 'CI' 'LI' 'MP') then 'EMAIL'
when t3.AFFC_AFF_CONTACT_ID^=. and t3.AFFC_CHANNEL in ('DM_LETTER' 'MA') then 'MAIL'
when t3.AFFC_AFF_CONTACT_ID^=. and t3.AFFC_CHANNEL in ('EMAIL_OLB' 'OB') then 'IM'
when t3.AFFC_AFF_CONTACT_ID^=. and t3.AFFC_CHANNEL in ('' 'OT' 'SM' 'EMESSAGE' 'OC') and DWH_CTI_CONTACT.CTIC_CHANNEL='' then 'OTHER'
when t3.AFFC_AFF_CONTACT_ID=. and DWH_CTI_CONTACT.CTIC_CONTACT_ID^=. and t3.AFFC_CHANNEL ='' and DWH_CTI_CONTACT.CTIC_CHANNEL^='' then DWH_CTI_CONTACT.CTIC_CHANNEL
  end) AS Channel

这种类型的实例可以通过各种方式进行重新编码,使用与SQL连接一起使用的查找表或与SAS合并,或者可能使用格式(我还没有考虑过很多)。也许还有其他方法我不知道。

在我开始修改所有这些代码之前(其中有很多代码......),我想知道什么是最佳实践,因为我主要关心的是速度。

1 个答案:

答案 0 :(得分:1)

一般而言,如果不对整个计划进行高层次的观察,很难就绩效问题提出建议。也就是说,我不认为这种查找的逻辑选择可能会对整体性能产生很大的影响 - 在SAS中,任何最小化磁盘I / O的选项通常都接近最优。

在所有其他条件相同的情况下,我的建议是寻找一种在易于维护和避免重复代码之间取得平衡的选项。为此,我可能会使用查找表,因为它们很容易被其他人接收(特别是那些刚接触SAS的人)并且您可以根据需要附加行而不更改代码(如果是新类别)出现。

如果要避免在SQL连接中使用查找表而产生大量额外的磁盘I / O,请考虑在它们上创建适当的索引,并使用sasfile语句在使用它们之前缓冲内存中较小的索引。