我试图用PROC SQL查询DB2表与数以亿计的记录。 在开发阶段,我想在这些记录(比如1000)任意小的子集上运行我的查询。 我已经使用INOBS限制观察试过,但我相信,这个参数是简单地限制的记录数这SAS是处理。 我想SAS只从数据库中提取的记录的任意数量(再处理所有的)。
如果我写一个SQL查询我自己,我会简单地使用SELECT * FROM x FETCH FIRST 1000 ROWS ONLY ...
(相当于SELECT TOP 1000 * FROM x
在SQL Server)。 但PROC SQL似乎并不具备这样的任何选项。 它采取非常长的时间来获取记录。
问题:我如何可以指示SAS任意限制的记录数从数据库返回 。
我读过PROC SQL使用ANSI SQL,不具有行限制关键字的任何规范。 也许SAS不喜欢做它的SQL语法转换为供应商特定关键字的努力? 有没有解决办法?
当SAS在讨论通过SAS语法数据库,查询的一部分可以转化为DBMS语言等同 - 这是通过所谓的隐式传递。 查询的其余部分是“后处理”通过SAS,产生最终结果。 根据SAS版本,DBMS供应商和DBMS版本,并且在一些情况下甚至一些连接/ LIBNAME选项,SAS语法的不同部分是可平移/考虑SAS和DBMS之间兼容,从而发送到由DBMS而不是SAS来执行。
随着SAS SQL选项 - INOBS和OUTOBS - 我已经通过不同版本的SAS做了很多与MS SQL和Oracle,但我还没有看到那些曾经翻译成TOP XXX类型的查询,所以这可能是还不支持,尽管当查询倒是刚刚DMBS数据(没有加入到SAS数据等),应该是比较可行的。
因此,我认为你留下了所谓的明确的直通 - 特定SAS SQL语法来连接数据库。 这种类型的查询是这样的:
proc sql;
connect to oracle as db1 (user=user1 pw=pasw1 path=DB1);
create table test_table as
select *
from connection to db1
( /* here we're in oracle */
select * from test.table1 where rownum <20
)
;
disconnect from db1;
quit;
在SAS 9.3的语法可以简化 - 如果已经有一个LIBNAME连接,你可以重复使用它进行显式直通:
LIBNAME ORALIB ORACLE user=...;
PROC SQL;
connect to oracle using ORALIB;
create table work.test_table as
select *
from connection to ORALIB (
....
当使用LIBNAME一定要使用READBUFF连接(我通常会设置一些5000左右)或INSERTBUFF选项装载数据库时(1000以上)。
要查看是否隐含的传递发生,设置sastrace选项:
option sastrace=',,,ds' sastraceloc=saslog nostsuffix;
您是否尝试过使用outobs
在你的选择proc sql
?
例如,
proc sql outobs=10; create table test
as
select * from schema.HUGE_TABLE
order by n;
quit;
另外,您也可以使用SQL直通使用DB2语法(编写一个查询FETCH FIRST 10 ROWS ONLY
),尽管这需要您将所有数据存储在数据库中,至少暂时如此。
直通看起来是这样的:
proc sql;
connect to db2 (user=&userid. password=&userpw. database=MY_DB);
create table test as
select * from connection to db2 (
select * from schema.HUGE_TABLE
order by n
FETCH FIRST 10 ROWS ONLY
);
quit;
它需要更多的语法和无法访问您的数据集SAS,所以如果outobs
为你的作品,我会建议。