SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1659|回复: 0
打印 上一主题 下一主题

请教:为什么两个记录数更少的表merge花的时间更多

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2013-7-4 15:17:22 | 只看该作者

请教:为什么两个记录数更少的表merge花的时间更多

想请大家帮忙看看两段sas代码和log:
代码一:


                *----------------------------*
                |   与索赔申请单合并
                *----------------------------*;
                data temp.TI_ASC_RO_AP(compress=yes index=(vin));

                        merge   temp.TI_ASC_ROALL(in=ina)
                                                  temp.TI_WR_APPLICATION(in=inb keep=ASC_CODE ASCRO_NO
                                                        LINE_NO FAILEDPART_CODE FAILEDPART_NAME WR_APPLICATION_ID VIN REPAIR_ITEM_ID
                                                        REPAIRORDER_DATE RO_ENDDATE LABOUR_STARTTIME LABOUR_ENDTIME
                                                        LABOUR_AMOUNT TECHNICIAN CLAIM_TYPE CLAIM_TIMES LABOUR_OPERATION_DESC
                                                        REPAIR_TOTAL COMPLAINT_DESC TROUBLE_DESC STATUS STATUS_DESC
                                                        rename=(FAILEDPART_CODE=PART_NO
                                                                                        FAILEDPART_NAME=PART_NAME
                                                                                        ASCRO_NO=RO_NO));
                        *----------------------------*
                        |   update at 2013-06-15
                        |        by asc_code ro_no line_no;
                        *----------------------------*;

                        by asc_code ro_no REPAIR_ITEM_ID;
                        SAS_DATE="&sysdate9."d;
                        format SAS_DATE date9.;

                        ASCRONO=cats(ASC_CODE,RO_NO);

                        rename ID=RO_ID;

                        if inb then do;
                                if not ina then do;
                                        START_TIME=LABOUR_STARTTIME;
                                        START_TIME1=datepart(LABOUR_STARTTIME);
                                        BALANCE_TIME=RO_ENDDATE;
                                end;
                                else do;
                                        START_TIME1=datepart(START_TIME);
                                end;
                                IF_MODIFY=1;
                        end;
                        else do;
                                START_TIME1=datepart(START_TIME);
                                IF_MODIFY=0;
                        end;

                run;

观测:
TEMP.TI_ASC_ROALL : 109042356 个观测
TEMP.TI_WR_APPLICATION : 8511021 个观测

TIME : 14 hours

LOG:

WARNING: 输入数据集为变量“TROUBLE_DESC”指定了多个长度。这可能会造成数据截断。
WARNING: 输入数据集为变量“PART_NAME”指定了多个长度。这可能会造成数据截断。
NOTE: MERGE 语句有多个数据集带有重复的 BY 值。
NOTE: 缺失值的生成是对缺失值执行操作的结果。
      指定每个位置的方式: (次数)(行:列)。
      3121,位置: 2161:21。   
NOTE: 从数据集 TEMP.TI_ASC_ROALL. 读取了 109042356 个观测
NOTE: 从数据集 TEMP.TI_WR_APPLICATION. 读取了 8511021 个观测
NOTE: 数据集 TEMP.TI_ASC_RO_AP 有 113583973 个观测和 45 个变量。
NOTE: 压缩的数据集 TEMP.TI_ASC_RO_AP 大小减少了 93.97%。
       压缩为 489109 页;不压缩将会要求 8113144 页。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          13:55:56.70
      用户 CPU 时间     41:07.78
      系统 CPU 时间     42:07.88
      内存                            1050137k
      OS 内存                         1059068k
      时间戳            6/30/2013  1:01:57 PM
      页错误数                       14419042
      页回收数                     1578632
      页交换数                        0
      主动上下文切换数        338202
      被动上下文切换数      1105020
      块输入操作数            0
      块输出操作数           0

代码二:

                *----------------------------*
                |   与车辆信息表合并
                *----------------------------*;
                data temp.TI_ASC_REPAIR(compress=yes index=(indx=(asc_code ro_no repair_item_id)));

                        merge  temp.TI_ASC_RO_AP(in=ina)
                               SRC.TI_VEHICLE_INFO( in=inb keep=VIN EngineType CustomerName CustomType
                                                        PURCHASING_DATE DEALER_CODE BRAND MODEL);
                        by vin;
                        SAS_DATE="&sysdate9."d;
                        format SAS_DATE date9.;
                        if ina;

                run;

观测:
temp.TI_ASC_RO_AP : 113583973 个观测
SRC.TI_VEHICLE_INFO : 1423459 个观测

TIME : 20 hours


LOG:

NOTE: MERGE 语句有多个数据集带有重复的 BY 值。
NOTE: 从数据集 TEMP.TI_ASC_RO_AP. 读取了 113583973 个观测
NOTE: 从数据集 SRC.TI_VEHICLE_INFO. 读取了 1423459 个观测
NOTE: 数据集 TEMP.TI_ASC_REPAIR 有 113583973 个观测和 52 个变量。
NOTE: 压缩的数据集 TEMP.TI_ASC_REPAIR 大小减少了 95.35%。
       压缩为 528621 页;不压缩将会要求 11358400 页。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          20:51:20.64
      用户 CPU 时间     43:21.17
      系统 CPU 时间     46:36.22
      内存                            1053051k
      OS 内存                         1061812k
      时间戳            7/01/2013  9:53:18 AM
      页错误数                       15821602
      页回收数                     2133497
      页交换数                        0
      主动上下文切换数        580114
      被动上下文切换数      1096267
      块输入操作数            0
      块输出操作数           0

两段代码里面的表,都是按关联字段建了索引的。
第二段代码中的表数据量比第一段代码少,逻辑也简单,为什么花的时间更长呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-5-2 07:33 , Processed in 0.089821 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表