我正在尝试使用PROC SQL来查询具有数亿条记录的DB2表.在开发阶段,我想在这些记录的任意小的子集上运行我的查询(例如,1000).我尝试使用INOBS来限制观察,但我相信这个参数只是限制了SAS正在处理的记录数.我希望SAS只从数据库中获取任意数量的记录(然后处理所有这些记录).
如果我自己编写SQL查询,我会简单地使用SELECT * FROM x FETCH FIRST 1000 ROWS ONLY ...(相当于SELECT TOP 1000 * FROM xSQL Server).但PROC SQL似乎没有这样的选择.获取记录需要很长时间.
问题:如何指示SAS任意限制从数据库返回的记录数.
我已经读过PROC SQL使用ANSI SQL,它没有行限制关键字的任何规范.也许SAS不想将其SQL语法转换为特定于供应商的关键字?有没有解决方法?
ste*_*lan 28
您是否尝试过使用该outobs选项proc sql?
例如,
proc sql outobs=10; create table test
as
select * from schema.HUGE_TABLE
order by n;
quit;
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用SQL passthrough使用DB2 syntax(FETCH FIRST 10 ROWS ONLY)编写查询,但这要求您将所有数据存储在数据库中,至少是暂时的.
Passthrough看起来像这样:
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;
Run Code Online (Sandbox Code Playgroud)
它需要更多的语法,无法访问您的sas数据集,所以如果outobs适合您,我会建议.
当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;
Run Code Online (Sandbox Code Playgroud)
在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 (
....
Run Code Online (Sandbox Code Playgroud)
使用libname连接时,请确保在加载数据库时使用READBUFF(我通常设置约5000个左右)或INSERTBUFF选项(1000或更多).
要查看是否发生了隐式传递,请设置sastrace选项:
option sastrace=',,,ds' sastraceloc=saslog nostsuffix;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66331 次 |
| 最近记录: |