我正在加入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;
答案 0 :(得分:0)
我将从输出表上的复合索引开始:
proc sql;
create index output_stname on tbl._output (state, city, output_stname, output_namevar);
这应该加速连接。但是,select distinct
仍然存在疑问。通常最好不要使用select distinct
。
答案 1 :(得分:0)
我建议不要用SQL处理它。由于COMPGED和CASE语句,SQL优化器无法真正优化这一点,因为它并不真正知道这些事件的真实程度。并且COMPGED非常昂贵。因此,无论如何你都会遇到一个非常缓慢的过程。
最有可能的是,哈希解决方案是最好的。没有看数据很难说(例如,有多少城市/州对,是否有大量独特的数据,或者数量相对较少?)。但是哈希解决方案可能会更快,特别是因为它可以避免索引创建步骤,假设您可以将输出表放入内存中的哈希值(或者,将输入表适合哈希值)。