优化SAS proc sql

时间:2016-05-18 15:08:56

标签: sql sas query-optimization

我正在加入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;

2 个答案:

答案 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非常昂贵。因此,无论如何你都会遇到一个非常缓慢的过程。

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