数据步骤 - where子句

时间:2018-02-07 12:00:21

标签: sas

正如标题所示,我在使用datastep时遇到了一些意想不到的性能行为。

A. 以下代码在0.01秒内执行。到目前为止一切都很好。

data policen_roh;
    set dwhprod.tbwh_kdu_detail_hi(
        keep=
        kdu_dt_id police_nr record_typ kdnr bag betrag_akt ursp_beginn_dt beginn_dt ablauf_dt storno_dt
        where=(
        police_nr=406045267 
        and record_typ='P' 
        )
        )
    ;
run;

B。此外,我必须过滤日期,该日期存储在日期ID中,从1开始01/01/1850。由于我创建了将date-id转换为年(整数)的格式,因此我添加了行input(put(kdu_dt_id, tag_id2jahr.),best.) ge 2017

按预期工作。这里没问题。我得到了我的15条预期记录,执行时间略微增加到0.02秒:

data policen_roh;
    set dwhprod.tbwh_kdu_detail_hi(
        keep=
        kdu_dt_id police_nr record_typ kdnr bag betrag_akt ursp_beginn_dt beginn_dt ablauf_dt storno_dt
        where=(
        police_nr=406045267 
        and input(put(kdu_dt_id, tag_id2jahr.),best.) ge 2017
        and record_typ='P' 
        )
        )
    ;
run;

C。 现在出现了问题:为了加快我的代码需要更大的数据集,我更换了

input(put(kdu_dt_id, tag_id2jahr.),best.) ge 2017

kdu_dt_id gt 60997 - 相当于01/01/2017

据我了解,这应该更快,因为不需要投入/输入计算。但是,虽然这会返回与B相同的结果,但执行时间会增加到大约30.00秒。

我错过了什么?

附录:记录以供进一步参考

1                                                          The SAS System                          13:56 Wednesday, February 7, 2018

1          ;*';*";*/;quit;run;
2          OPTIONS PAGENO=MIN;
3          %LET _CLIENTTASKLABEL='Programm';
4          %LET _CLIENTPROJECTPATH='R:\Projekte\20180125 Erneuerungsprovisionen\Erneuerungsprovisionen.egp';
5          %LET _CLIENTPROJECTNAME='Erneuerungsprovisionen.egp';
6          %LET _SASPROGRAMFILE=;
7          
8          ODS _ALL_ CLOSE;
9          OPTIONS DEV=ACTIVEX;
10         GOPTIONS XPIXELS=0 YPIXELS=0;
11         FILENAME EGHTML TEMP;
12         ODS HTML(ID=EGHTML) FILE=EGHTML
13             ENCODING='utf-8'
14             STYLE=HtmlBlue
15             STYLESHEET=(URL="file:///C:/Program%20Files%20(x86)/SASHOME/x86/SASEnterpriseGuide/7.1/Styles/HtmlBlue.css")
16             ATTRIBUTES=("CODEBASE"="http://www2.sas.com/codebase/graph/v94/sasgraph.exe#version=9,4")
17             NOGTITLE
18             NOGFOOTNOTE
19             GPATH=&sasworklocation
20         ;
NOTE: Writing HTML(EGHTML) Body file: EGHTML
21         
22         GOPTIONS ACCESSIBLE;
23         data policen_roh;
24             set dwhprod.tbwh_kdu_detail_hi(
25                 keep=
26                 kdu_dt_id police_nr record_typ kdnr bag betrag_akt ursp_beginn_dt beginn_dt ablauf_dt storno_dt
27                 where=(
28                 police_nr=406045267
29                 and kdu_dt_id gt 60997
30                 and record_typ='P'
31                 )
32                 )
33             ;
34         run;

NOTE: There were 14 observations read from the data set DWHPROD.TBWH_KDU_DETAIL_HI.
      WHERE (police_nr=406045267) and (kdu_dt_id>60997) and (record_typ='P');
NOTE: The data set WORK.POLICEN_ROH has 14 observations and 10 variables.
NOTE: Compressing data set WORK.POLICEN_ROH increased size by 100.00 percent. 
      Compressed is 2 pages; un-compressed would require 1 pages.
NOTE: DATA statement used (Total process time):
      real time           1:10.44
      cpu time            0.03 seconds


35         
36         GOPTIONS NOACCESSIBLE;
37         %LET _CLIENTTASKLABEL=;
38         %LET _CLIENTPROJECTPATH=;
39         %LET _CLIENTPROJECTNAME=;
40         %LET _SASPROGRAMFILE=;
41         
42         ;*';*";*/;quit;run;
43         ODS _ALL_ CLOSE;
44         
45         
46         QUIT; RUN;
2                                                          The SAS System                          13:56 Wednesday, February 7, 2018

47         

1 个答案:

答案 0 :(得分:0)

我的猜测是您的基础表位于数据库上,并且删除输入/放置函数会更改查询执行,使其不再使用可用索引。

有点违反直觉,但尝试从where子句中删除kdu_dt_id gt 60997并将其放在门控if语句中。

data policen_roh;
    set dwhprod.tbwh_kdu_detail_hi(
        keep=
        kdu_dt_id police_nr record_typ kdnr bag betrag_akt ursp_beginn_dt beginn_dt ablauf_dt storno_dt
        where=(
        police_nr=406045267 
        and record_typ='P' 
        )
        )
    ;
  if kdu_dt_id gt 60997;
run;

如果这是一个经常运行的查询,请与您的dba讨论如何调整数据库。

有关更多信息,您可以使用proc sql使用_tree选项重新编写查询(以查看执行计划)。然后,您可以使用_method选项来播放/调整该计划。

另外,请查看options sastrace=',,,d' sastraceloc=saslog;,以便根据基础SQL查询向您的dba显示有关发送到数据库的内容的更多信息。