使用SQL Passthrough工具和SAS有什么好处吗?
答案 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传递语句可以让您更好地控制发送到数据库的内容。