繁体   English   中英

优化SAS proc SQL

[英]Optimize SAS proc sql

我要联接2个表,并在它们之间创建一个微型笛卡尔联接,以使城市和州内的所有企业都匹配起来,然后我要使用一些模糊逻辑来尝试匹配企业名称和街道名称。 输入表上有约300万条记录,输出表上有约2500万条记录,因此运行需要很长时间。 我已经在要连接的所有列上以及在where语句中使用的所有列上创建了索引。

我的下一个想法是用整数替换城市/州名称,但是我要增加创建这些表的处理时间。 是否有人对减少处理时间有其他想法。

proc sql;
create index output_stname on tbl._output (output_stname);
create index output_namevar on tbl._output (output_namevar);
create index key on tbl._output (key);
create index city on tbl._output (city);
create index state on tbl._output (state);

create index input_stname on tbl._input (input_stname);
create index input_namevar on tbl._input (input_namevar);
create index key_input on tbl._input (key_input);
create index city_input on tbl._input (city_input);
create index state_input on tbl._input (state_input);
;
quit;

proc sql;
create table tbl._level2 as
select distinct
key_input,
name_input,
address_input,
city_input,
state_input,
zip_input,
key,
business_nm1,
address,
city,
state,
zip,
'2 - Street Name & Business Name Match' as matchtype

from tbl._input a
left join tbl._output b on a.city_input=b.city and a.state_input=b.state
where 
compged(a.input_stname,b.output_stname) <= 50 and 
compged(input_namevar,output_namevar) <= 50
and case 
    when length(strip(a.input_namevar)) <= 2 then 1
    when length(strip(b.output_namevar)) <= 2 then 1
        else 0
end = 0
;
quit;

我将从输出表上的复合索引开始:

proc sql;
    create index output_stname on tbl._output (state, city, output_stname, output_namevar);

这样可以加快连接速度。 但是, select distinct仍然令人怀疑。 通常最好不用select distinct

我建议不要用SQL处理。 由于COMPGED和CASE语句,SQL优化器无法真正很好地对其进行优化,因为它并不真正知道这些实现的频率。 而且COMPGED非常昂贵。 这样一来,无论如何您都会遇到一个非常缓慢的过程。

最有可能的是,哈希解决方案是最好的。 不查看数据就很难说(例如,有多少个城市/州对-是否有大量唯一的或相对较少的数目?)。 但是哈希解决方案可能会更快,特别是因为它避免了索引创建步骤,假设您可以将输出表放入哈希中(或者将输入表放入哈希中)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM