【发布时间】:2015-12-15 11:43:47
【问题描述】:
我有 2 个大表,我正在尝试加入这些表,以便根据第二个表中的字段对第一个记录进行分组。左表有大约 5000 万条事件记录,右表有大约 3500 万条每月间隔记录。每月间隔处于 subjID 级别,因此我无法通过仅保留开始日期和结束日期来减小右表的大小。目前执行连接大约需要 40 - 60 分钟。
我尝试在 subjID、eventDate、startDate 和 endDate 上创建简单的索引,但是它似乎并没有提高性能(创建索引在大约 5 分钟内完成,连接在 38 分钟内完成)。
我可以使用其他选项来改进处理吗?
subjID 级别的事件左表:
data eventsTable;
input @1 subjID 8.
@10 eventDate date9.;
format eventDate mmddyy10.;
datalines;
101 01AUG2011
101 28AUG2011
101 30AUG2011
101 01SEP2011
101 12SEP2011
101 28SEP2011
102 01JAN2015
102 15JAN2015
102 01FEB2015
102 16FEB2015
;
run;
subjID 级别的月间隔右表。如果事件发生在开始日期和结束日期之间,我会尝试将 endDate 带到事件中:
data monthlyTable;
input @1 subjID 8.
@10 startDate date9.
@22 endDate date9.;
format startDate endDate mmddyy10.;
datalines;
101 28JUL2011 30AUG2011
101 30AUG2011 28SEP2011
101 28SEP2011 28OCT2011
102 01DEC2014 02JAN2015
102 02JAN2015 02FEB2015
102 02FEB2015 02MAR2015
;
run;
输出:
proc sql;
create table wantTable as
select a.*,
endDate as monthlyDate
from eventsTable a left join monthlyTable b on
a.subjID = b.subjID
where a.eventDate > b.startDate and a.eventDate <= b.endDate
order by subjID, eventDate;
quit;
【问题讨论】:
-
您是只是从
monthlyTable附加enddate还是附加一些其他变量? -
我从monthlyTable 中附加5 个变量。在实践中,我的左表有 6 个变量,我的右表有 11 个变量。
-
我已经更新了我的答案,加入了一种哈希方法,可以让您一次性附加所有变量。
标签: sql join optimization sas proc