web-dev-qa-db-ja.com

PROC SQLの結果を制限する

PROC SQLを使用して、何億ものレコードを持つDB2テーブルを照会しようとしています。開発段階では、これらのレコードの任意の小さなサブセット(1000など)でクエリを実行します。私はINOBSを使用して観測値を制限しようとしましたが、このパラメーターはSASが処理しているレコードの数を単に制限していると思います。 SASがデータベースから任意の数のレコードのみを取得するようにします(そして、それらすべてを処理します)。

自分でSQLクエリを記述している場合は、SELECT * FROM x FETCH FIRST 1000 ROWS ONLY ...(SQL ServerのSELECT TOP 1000 * FROM xと同等)を使用するだけです。しかし、PROC SQLにはこのようなオプションはないようです。レコードを取得するのに非常に長い時間がかかります。

質問:SASに指示して、レコード数をデータベースからの戻り値に任意に制限できます。

PROC SQLはANSI SQLを使用することを読みましたが、ANSI SQLには行制限キーワードの仕様はありません。おそらくSASは、そのSQL構文をベンダー固有のキーワードに変換する努力をしたくなかったのでしょうか?回避策はありませんか?

16
JDB

SASがSAS構文を介してデータベースと通信している場合、クエリの一部はDBMS言語に相当するものに変換できます。これは暗黙的なパススルーと呼ばれます。クエリのSASによって「後処理」されます。最終結果を生成します。SASバージョン、DBMSベンダーおよびDBMSバージョンに依存し、場合によっては一部の接続/ライブラリ名オプション、SAS構文の異なる部分は、SASとDBMSの間で互換性があり、考慮されているため、SASの代わりにDBMSによって実行されるように送信されます。

SAS SQLオプション-INOBSおよびOUTOBS-異なるバージョンのSASを介してMS SQLとOracleで多くの作業を行いましたが、TOP xxxタイプのクエリに変換されたものは見たことがありません、したがって、これはおそらくまだサポートされていませんが、クエリがDMBSデータのみに触れる場合(SAS dataなど)に結合しない場合)は、かなり実行可能です。

明示的なパススルーと呼ばれる特定の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;
7
vasja

proc sqloutobsオプションを使用しようとしましたか?

例えば、

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が機能する場合は、それをお勧めします。

28
stevepastelan