楼主: luyoung
1765 1

[问答] 求问提高SAS读取数据效率的方式 [推广有奖]

  • 2关注
  • 0粉丝

本科生

50%

还不是VIP/贵宾

-

威望
0
论坛币
1073 个
通用积分
36.0396
学术水平
0 点
热心指数
5 点
信用等级
0 点
经验
847 点
帖子
35
精华
0
在线时间
120 小时
注册时间
2016-1-21
最后登录
2024-1-31

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
背景介绍:
        数据库:ORACLE
        网络方式:VPN
        需求:读取多张含json的数据的表,当前数据库内包含大量数据,只需要处理近一周的数据即可。
        核心问题:数据读取太慢!
        小障碍:1.因数据库内无索引,部分表无可用时间字段进行筛选。
                      2.VPN网络不稳定导致不能测试代码读数效率。
求教可以有效提高SAS读取数据的效率的方式。

个人已尝试多种方式,但是效率颠覆之前的一些认知,并未有效提高效率,方式如下:

方式1:*col2为案件的通用编号
  1. connect to oracle as data (user=XXX password=XXXXXX path=XXXX);
  2. create table TEMP as
  3.         select * from connection to data(
  4.                 select * from(
  5.                         select a.col1,
  6.                                 c.col2,
  7.                                 row_number()over(partition by c.col2 order by c.col2,c.time desc) as rm
  8.                         from AA.TAB1 a
  9.                         inner join AA.TAB2 b on a.KEY1=b.KEY1
  10.                         inner join AA.TAB3 c on c.KEY2=b.KEY2
  11.                         where b.id is not null
  12.                                 and to_char(c.time,'yyyy-mm-dd')>=to_char(sysdate-1,'yyyy-mm-dd')
  13.                 )where rm=1
  14.         );
  15. disconnect from data;
  16. quit;
复制代码


方式2:
  1. libname AA oracle user=XXX password=XXXXXX path='XXXX' schema=AA;
  2. create table TEMP as
  3.         select a.col1,
  4.                 c.col2,
  5.                 c.time
  6.         from AA.TAB1 a
  7.         inner join AA.TAB2 b on a.KEY1=b.KEY1
  8.         inner join AA.TAB3 c on c.KEY2=b.KEY2
  9.         where b.id is not null
  10.                 and to_char(c.time,'yyyy-mm-dd')>=to_char(sysdate-1,'yyyy-mm-dd');
  11. quit;
  12. proc sort data=TEMP;by KEY2 descending time;run
  13. data TEMP ;
  14.         set TEMP;
  15.         by KEY2;
  16.         if first.KEY2;
  17. run;
复制代码


方式3:
  1. libname AA oracle user=XXX password=XXXXXX path='XXXX' schema=AA;
  2. data TAB1;
  3.         set AA.TAB1(keep=KEY1 col1);
  4. run;
  5. data TAB2;
  6.         set AA.TAB2(
  7.                 keep=KEY1 KEY2
  8.                 where=(id^='')
  9.         );
  10. run;
  11. data TAB3;
  12.         set AA.TAB3(
  13.                 keep=KEY2 col2 time
  14.                 where=(to_char(time,'yyyy-mm-dd')>=to_char(sysdate-1,'yyyy-mm-dd'))
  15.         );
  16. run;
  17. proc sort data=TAB3;by KEY2 descending time;run
  18. data TAB3 ;
  19.         set TAB3;
  20.         by KEY2;
  21.         if first.KEY2;
  22. run;
  23. proc sql;
  24. create table TEMP as
  25.         select a.col1,
  26.                 c.col2
  27.         from TAB1 a
  28.         inner join TAB2 b on a.KEY1=b.KEY1
  29.         inner join TAB3 c on c.KEY2=b.KEY2;
  30. quit;
复制代码
其中data步这块,尝试了几种方式提高效率,但是从时间上看where= firstobs= _n_这些都没有起到提高效率的作用,如:
  1. data TAB2;
  2.         set AA.TAB2(
  3.                 keep=KEY1 KEY2
  4.                 firstobs=10000000        *保证前10000000条数据不涉及当前需求
  5.         );
  6.         where id^=''
  7. run;

  8. data TAB2;
  9.         set AA.TAB2(keep=KEY1 KEY2);
  10.         _n_>=10000000        *保证前10000000条数据不涉及当前需求
  11.         where id^=''
  12. run;
复制代码


求解惑,谢谢!!






二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:读取数据 inner join Disconnect connection partition

沙发
xiami2000 在职认证  发表于 2018-3-2 00:23:43 |只看作者 |坛友微信交流群
This is a complicated case which migh be not caused by SAS. I assumed the networking is slow so we can try to increase buffersize as  'libname option readbuff=10000'. default size for Oracel is 250. Good luck.
已有 1 人评分论坛币 收起 理由
admin_kefu + 10 热心帮助其他会员

总评分: 论坛币 + 10   查看全部评分

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 09:25