3

我对 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 之外执行?

文档不清楚。请参见第 62 页。

4

3 回答 3

2

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

于 2015-11-18T21:29:08.757 回答
1

您可以通过一组需要简化的非语法高亮选项在任何一段代码上回答这个问题:

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

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

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

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

您希望避免在查询中直接使用的一些常见函数,尤其是在使用 Oracle 时:

  1. datepart()

  2. intnx()

  3. intck()

  4. today()

  5. put()

  6. input()

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

于 2015-11-19T14:37:21.877 回答
1

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

  1. LIBNAME 引用 -将 SAS 库引用分配给 DBMS 对象,例如模式和数据库;然后,您可以像使用 SAS 数据集一样使用表或视图...您可以在任何引用 DBMS 数据的 libref 上使用诸如 PROC SQL 或 DATA 步编程之类的 SAS 过程。
  2. SQL Pass-through 工具- 使用其本机 SQL 语法与数据源交互,而无需离开您的 SAS 会话。SQL 语句直接传递给数据源进行处理... DBMS 优化器可以利用 DBMS 列上的索引来更快、更有效地处理查询

因此,对于第一种方法,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 对象(特别是特殊的 tabledefs),这与 SAS 的 libname refs 不同,后者被加载到 JET/ACE 表容器中,数据指向外部。然后可以像使用任何其他 Access 本地表一样使用链接表,并使用任何 ACE SQL 方言。这个特殊的链接表(很像 SAS 的 libname refs 是由 ODBC 或其他连接类型建立的)指向外部源,驱动程序为迁移操作转换查询命令。因此,完全相同的 Access 链接表查询的执行方式可能与相同的 RDMS 查询不同。

比喻

我想 SAS 的行为方式相同,并且作为前端存在,libname ref 作为带有指向后端的指针的本地对象。所有数据步骤处理都在本地处理,并且引擎只需导入或提取结果集。打个比方。数据库是家,而 SAS 是垃圾人、家居装饰师或搬入帮手。SAS(如 Java 的 JDBC、PHP 的 PDO、Python 的游标、R 的库)敲开了数据库回答的门(被这么多请求惹恼了)。“嘿,伙计,我们需要倒垃圾,这里是确切的物品......或者我们需要改造地下室,这里是确切的规格......或者我们有新家具要添加到卡车上准备下车...签署凭据后,请立即执行。” 和两者一样,传递方法是在后端引擎上执行的请求。所以 SAS 留下指令,也许是门上的一张纸条(不准确)供房主执行。

于 2015-11-19T21:07:04.263 回答