我不得不处理很多我觉得应该运行得更快的代码,我怀疑其中一些问题与在PROC SQL
中过度使用case when
有关。
从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合并一起使用的查找表,或者可能使用格式(我并没有深入研究过)。也许还有其他我不知道的方式。
在我开始修改所有这些代码(有很多……)之前,我想知道什么是最佳实践,因为我主要关心的是速度。
发布于 2018-05-28 18:47:12
一般来说,如果不对整个程序进行高层次的查看,就很难对性能问题提出建议。也就是说,我不认为这种查找逻辑的选择可能会对整体性能产生太大影响-在SAS中,任何最小化磁盘I/O的选项通常都接近最佳。
在其他条件相同的情况下,我的建议是寻找一种在易维护性和避免重复代码之间取得平衡的选择。为此,我可能会使用查找表,因为它们很容易被其他人使用(特别是对于那些刚接触SAS的人),而且如果出现新的类别,您可以根据需要追加行,而无需更改代码。
如果您希望避免在SQL join中使用查找表导致大量额外的磁盘I/O,请考虑在它们上创建适当的索引,并在使用它们之前使用sasfile
语句在内存中缓冲较小的索引。
https://stackoverflow.com/questions/50564060
复制相似问题