外部数据库上的SAS / ACCESS和数据步骤

时间:2015-11-18 20:44:53

标签: sas datastep

我对SAS / ACCESS设施有以下关注。

让我们假设我们有一个外部数据库(即Oracle),我们将其分配给某个libname。

接下来,我们对该DB中的一个表进行简单的操作,即

data db.table_new;
  set db.table_old(keep=var1 var2 var3);
  if var1>0 then new_var1=5;
run;

我的问题如下:

  1. 是否将整个表table_old从外部数据库拉到SAS服务器以处理数据?
  2. SAS / ACCESS会将数据步骤转换为DBMS操作还是SQL,因此整个处理将在SAS之外执行?
  3. documentation尚不清楚。见第62页。

3 个答案:

答案 0 :(得分:2)

通常经验法则是:如果在DATA步骤中使用的SAS函数可以转换为本机db sql函数,那么SAS将让DB服务器进行数据处理。在你的情况下,这似乎是这种情况。

答案 1 :(得分:1)

您可以通过set of non-syntax-highlighted options that need to be simplified

在任何代码上回答此问题

options sastrace=',,,d' sastraceloc=saslog nostsuffix;

运行数据步骤时,请检查日志。您将看到有关SAS是否能够成功翻译代码的信息。如果不成功,您将看到:

ACCESS ENGINE: SQL statement was not passed to the DBMS, SAS will do the processing.

如果发生这种情况,SAS通常会向服务器发送select *并在过滤之前提取所有内容。当您看到该错误时,请尝试执行显式passthrough,或重新设计您的查询,以便它可以在服务器上执行所有操作。如果表足够大,可能会关闭SAS服务器,或严重降低Oracle服务器的性能。

您希望避免直接在查询中使用的一些常见功能,尤其是对于Oracle:

  1. datepart()

  2. intnx()

  3. intck()

  4. today()

  5. put()

  6. input()

  7. 如果我必须使用这些函数中的任何一个,我通常会安全地播放它并事先创建静态变量的宏变量(例如today()),首先过滤最低级别的原始数据以使其进入SAS服务器,或使用显式SQL passthrough。

答案 2 :(得分:1)

总之,我会说这取决于你的方法。在上面链接中SAS / Access 9.2文档第1章的第二页上,SAS / ACCESS工具有两种方法(在较旧的DBLOAD程序中):

  1. LIBNAME参考 - 将SAS librefs分配给DBMS对象等 作为模式和数据库;然后,您可以像使用SAS数据集一样使用表或视图...您可以在任何引用DBMS数据的libref上使用此类SAS过程作为PROC SQL或DATA步骤编程。
  2. SQL传递工具 - 使用其与数据源进行交互 本机SQL语法,无需离开SAS会话。 SQL语句直接传递给数据源进行处理...... DBMS优化器可以利用DBMS列上的索引更快地处理查询 有效地
  3. 因此,对于第一种方法,SAS处理处理,第二种方法DBMS处理处理。像连接到外部RDMS源的大多数客户端(Java,C#,Python脚本或PHP网页)一样,除非明确使用直接ODBC / OLEDB或其他API连接并发送请求,否则处理在前端处理(即,计算参数)并通过事务将最终结果更新到后端。在指定的会话期间,所有SAS的库都将存在于内存(或临时硬盘)中,并且取决于代码处理数据本身并将结果传递给外部源或将数据处理完全传递给另一个源。

    比较示例:Microsoft Access

    一个很好的比较示例是Microsoft Access,它也像SAS一样为任何符合ODBC的RDMS提供链接表连接和传递查询,包括SQL Server,Oracle,MySQL等。将Access标记为以下通常是一个误称实际上它是一个GUI程序和对象集合的数据库,其中一个是默认 Windows JET / ACE引擎(.dll文件),根本不限于Access但可供所有Office程序使用。注意世界默认,因为它可以切换到任何ODBC数据库源。

    链接表本质上是Access GUI对象(特别是特殊的tabledef),与SAS的libname引用不同,它们被加载到JET / ACE表容器中,数据指向外部。然后,可以像任何其他Access本地表一样使用链接表,并使用ACE SQL方言的任何内容。此特殊链接表(非常类似于SAS的libname引用由ODBC或其他连接类型建立)指向外部源,驱动程序转换查询命令以执行迁移操作。因此,完全相同的Access链接表查询可能与同一RDMS查询的执行方式不同。

    <强>类比

    我认为SAS的行为方式相同,并且作为前端存在,libname引用为具有指向后端的指针的本地对象。所有数据步骤处理都在本地处理,结果集简单地由引擎导入或提取结果集。用一个类比。数据库将成为家庭,SAS是垃圾人,家庭装饰者或搬入帮助者。 SAS(就像Java的JDBC,PHP的PDO,Python的游标,R&C的库)敲响了数据库应答的门(受到如此多的请求的困扰)。 &#34; 嘿伙计,我们需要拿出垃圾,这里是确切的物品......或者我们需要改造地下室,这里是确切的规格...或者我们有新的家具要添加卡车已准备好下车......凭证书签名请立即执行。&#34;和两者一样,传递方法是在后端引擎上执行的请求。所以SAS会留下指示,也许是门上的一张纸条(没有准确性)供房主执行。