将 SQL Passthrough 工具与 SAS 一起使用有什么优势吗?
5 回答
虽然这个问题过于笼统,但我可以提供一个过于笼统的答案。
SAS 中的直通 SQL 允许您直接与数据库通信。当您使用数据库特定功能时,这将变得非常有利。Oracle 的统计功能就是一个例子。您不必担心 SAS 将如何处理您的编码或翻译您的 SQL。
此外,Pass-through SQL 在 SAS 端只需要很少的处理,这对我们也有好处。如果您有一个非常繁忙的 SAS 盒子,您可以选择将处理逻辑直接发送到数据库。这在不使用 Pass-through SQL 的情况下是可能的,但是在使用它时您有更高程度的控制。
这绝不是一个详尽的好处列表,只是使用传递 SQL 的一些高级特权。如果您有更具体的用例,我们可以讨论编码技术的具体差异。
PROC SQL 将尝试将尽可能多的逻辑传递给数据库,但有时它不能。使用数据库(或数据库的 SAS/ACCESS 引擎)中没有等效功能的 SAS 函数将阻止将整个查询传递到数据库。当查询未完全传递到数据库时,数据将被拉入 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 秒。
如果您不使用传递,那么您必须将所有记录(处理所需的)从数据库导入到 sas。通过使用传递,您可以在数据库端完成一些处理,并且只将结果记录带入 sas。差异(在处理时间和网络使用方面)可以非常,从微小到巨大,取决于您所做的事情。
使用直通有很多优点,但这取决于您要完成的工作。通常,我在进行查询时使用标准的 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;
显然,这不是可以在直通之外完成的事情(至少我不知道)。所以是的......这一切都取决于你想要完成什么。
简而言之,SQL 传递语句让您可以更好地控制发送到数据库的内容。