使用SAS合并本地和远程表时出现问题,使用'dbkey ='选项时不工作

时间:2018-01-31 13:53:01

标签: sql sql-server sas

我有一些代码可以将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尝试下载整个远程表。

有关如何进行的建议?

1 个答案:

答案 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才能批量加载。