【发布时间】:2018-09-29 13:20:56
【问题描述】:
在工作中,我有一个 200M 行(300+ 列,~200GB)的索赔表,它按成员编号 (memno) 和服务日期 (dos) 进行索引。
我必须每月两次从固定日期范围(例如 2017 年 1 月 1 日到 2018 年 5 月 1 日)中提取 50,000 个会员编号的声明,而我只需要来自声明的有限列。
MyInputList 只有 1 列(memno)。
proc sql;
create table myClaims as
select a.claimno, a.dos, a.memno
from s.claims a inner join myInputList b
on a.memno = b.memno
where a.dos between '01Jan2017'd and '01May2018'd;
quit;
PROC SQL 运行通常需要大约 3-4 小时。数据本身不是由 RDMS 托管的,我阅读了许多关于 PROC SQL 是笛卡尔积的 SAS 文章,由于我不需要每条记录全部 300 列,我想知道使用哈希表是否会更好。
我的问题:我可以给哈希表“提示”,以便它可以利用索引列(memno, dos)?
data myClaimsTest (drop=rc);
if 0 then set myInputList;
declare hash vs(hashexp:7, dataset:'myInputList');
vs.definekey('memno');
vs.definedata();
vs.definedone();
do until (eof);
set s.claims (keep=claimno dos) end=eof;
if vs.find()=0 then output;
end;
stop;
run;
新部分(由 Richard 添加)
运行此代码以获取变量和索引的列表。
dm "clear output"; ods listing; ods noresults; options nocenter; title;
proc contents varum data=all_claims;
run;
dm "output" output; ods results;
在此处复制并粘贴输出的底部。将此示例替换为您的实际列表。
Variables in Creation Order
# Variable Type Len Format
1 claim_id Num 8
2 member_id Num 8
3 claim_date Num 8 YYMMDD10.
Alphabetic List of Indexes and Attributes
# of
Unique Unique
# Index Option Values Variables
1 PICK YES 333338 member_id claim_date
【问题讨论】:
-
索引和哈希是完全不同的概念。一个是磁盘常驻(索引),而另一个是内存常驻。他们访问的方式也非常不同。所以索引列提示哈希对象没有意义。你有没有 Hash 技术,结果如何。
-
@Kiran 也许这是我的问题,我的哈希从未返回(在大小为 10 的测试输入上),它运行了一个多小时,我不得不终止它。
-
“我读了很多 SAS 论文”,你能回忆起并引用问题中的任何内容吗?你读过"Two Guys on Hash" Dorfman and Eberhardt (2010) 吗?您是否使用
options MSGLEVEL=I;启用了 INFO 日志记录?信息消息会告诉您是否使用了索引。 -
BIG 表索引是否唯一? (我认为没有)。如果不是,是否有可以添加到复合索引以使其唯一的第三变量? , 如果第三个 yes 是关联值的域,那么它是先验可知的,因此可以在每个 50K 选择器的查找级别进行迭代?
-
我看到你的哈希查询有显着差异,它不包括 '01Jan2017'd 和 '01May2018'd 之间的 a.dos 位置