我有一些代码可以将SAS中的本地密钥表与远程表(来自MS-SQL数据库)合并。
示例代码:
LIBNAME RemoteDB ODBC user=xxx password=yyy datasrc='RemoteDB' READBUFF=1500;
proc sql;
create table merged_result as
select t1.ID,
t1.OriginalInfo,
t2.RemoteInfo
from input_keys as t1
Left join RemoteDB.remoteTable (dbkey=ID) as t2
on (t1.ID = t2.ID)
order by ID;
quit;
这曾经工作正常(至少150000行),但现在不行,可能是由于SAS更新。目前,相同的代码导致SAS尝试下载整个远程表(数百GB)进行本地合并,这显然不是一种选择。显然dbkey=
选项已停止工作。对于记录,用于连接的密钥(示例中的ID)在远程表中编入索引。
而是使用dbmaster=
选项和multi_datasrc_opt=in_clause
选项一起工作(在LIBNAME语句中),但仅适用于4500及更少的密钥。尝试再次合并更大的数据集会导致SAS尝试下载整个远程表。
有关如何进行的建议?
答案 0 :(得分:1)
Underwater的问题表明隐式传递功能之前已经以与优化处理一致的方式工作。更新后,隐式传递继续适用于他的查询,尽管是以非最佳方式。
为确保已知(显式)等效近似最优处理方法,我将input_keys
上传到RemoteDB中的临时表,并在传递时远程连接。只要您对Executor,SQL planner和库引擎做出的隐式决策不满意,此代码就是一个可行的回退示例。
LIBNAME tempdata oledb ... dbmstemp=yes ; * libname for remote temp tables;
* store only ids remotely;
data tempdata.id_list;
set input_keys(keep=id);
run;
* use uploaded ids in pass-through join, capture resultset and rejoin for OriginalInfo in sas;
proc sql;
connect to ... as REMOTE ...connection options...;
create table results_matched as
select
RMTJOIN.*
, LOCAL.OriginalInfo
from
(
select * from connection to remote
(
select *
from mySchema.myBigTable BIG
join tempdb.##id_list LIST
on BIG.id = LIST.id
)
) as RMTJOIN
JOIN input_keys as LOCAL
on RMTJOIN.id = LOCAL.id
;
quit;
SQL Server连接的dbmstemp
选项会导致新的远程表驻留在tempdb
模式中,并以前导##命名。
使用SQL Server时,请使用BULKLOAD=
libname选项以获得最高性能。您可能需要数据库管理员使用特殊GRANT
才能批量加载。