在PROC SQL限制结果(Limiting results in PROC SQL)

2019-06-26 16:10发布

我试图用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语法转换为供应商特定关键字的努力? 有没有解决办法?

Answer 1:

当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;


Answer 2:

您是否尝试过使用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为你的作品,我会建议。



文章来源: Limiting results in PROC SQL
标签: sas proc-sql