SAS中的SQL Passthrough

时间:2009-03-11 06:38:19

标签: sql sas proc-sql

使用SQL Passthrough工具和SAS有什么好处吗?

5 个答案:

答案 0 :(得分:6)

虽然这个问题过于宽泛,但我可以提供一个过于宽泛的答案。

SAS中的传递SQL允许您直接与数据库通信。当您使用特定于数据库的功能时,这将变得非常有利。一个例子是Oracle的统计功能。您不必担心SAS将如何处理您的编码或翻译您的SQL。

此外,对我们来说,传递SQL在SAS端需要很少的处理也是一个好处。如果您有一个非常繁忙的SAS框,您可以选择将处理逻辑直接发送到数据库。这可以在不使用Pass-through SQL的情况下实现,但在使用时可以获得更高程度的控制。

这绝不是一个详尽的好处列表,只是使用传递SQL的一些高级特权。如果您有更具体的用例,我们可以讨论编码技术的具体差异。

答案 1 :(得分:5)

PROC SQL会尝试将尽可能多的逻辑传递给数据库,但有时候它不能。使用在数据库中没有等效的SAS函数(或在数据库的SAS / ACCESS引擎中)将阻止将整个查询传递到数据库。当查询未完全传递到数据库时,数据将被拉入SAS并在那里处理。 SQL越复杂,最终在SAS中处理的可能性就越大。这是一个比你想象的更大的差异。

libname db <database> path=dbserver user=... password=...;
proc sql;
   create table db.new as
   select * from db.largedata where flag=1;
quit;

实际上(至少通过SAS 9.1.3)将所有匹配flag = 1的数据拉到SAS,然后将其加载回数据库。这是数百万行它真的减慢了。

在这种情况下,您会发现显式传递速度更快。

proc sql;
   connect dbase (server=dbserver user=... password=...);
   execute (create table db.new as
   select * from db.largedata where flag=1) as dbase;
   disconnect dbase;
quit;

我最近使用Oracle和一个大约250,000行的表做了一个例子。第一种方式需要20秒,第二种方式需要2秒。

答案 2 :(得分:2)

如果您不使用传递,则必须将所有记录(处理所需的记录)从数据库导入到sas。通过使用传递,您可以在数据库端完成一些处理,并将结果记录仅带入sas。根据您的工作,差异(在处理时间和网络使用方面)可能非常小,具体取决于您的工作。

答案 3 :(得分:2)

使用passthrough有好处,但这取决于你想要完成的事情。通常,我在执行查询时使用标准的proc sql而没有passthrough。然而,最近我用它来生成一些存储过程。

proc sql;
    connect to mysql(user = 'xxxxx' pass = 'xxxxx' server = 'localhost');
        execute(set @id = &id.) by mysql;
        execute(select (@lit:=image_text) from quality.links_image_text where image_id = @id) by mysql;
        execute(set @lidx = locate('ninja',@lit)) by mysql;
        execute(set @lidx2 = locate(' ',@lit,@lidx)) by mysql;
        execute(set @lidxd = @lidx2 - @lidx) by mysql;
        execute(set @lf = substr(@lit,@lidx,@lidxd)) by mysql;

        create table asdf as
        select &id. as id, a as ws from connection to mysql
        (select @lf as a)
        ;
    disconnect from mysql;
quit;

显然,这不是可以在直通之外完成的事情(至少不是我所知道的)。所以...这一切都取决于你想要完成的是什么。

答案 4 :(得分:0)

简单地说,SQL传递语句可以让您更好地控制发送到数据库的内容。