代码之家  ›  专栏  ›  技术社区  ›  moodymudskipper

当vs sql连接vs本机合并vs格式时的情况

  •  2
  • moodymudskipper  · 技术社区  · 6 年前

    我必须处理许多我认为应该运行得更快的代码,我怀疑其中一些问题与过度使用 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 回复  |  直到 6 年前
        1
  •  1
  •   user667489    6 年前

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

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

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