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構文をベンダー固有のキーワードに変換する努力をしたくなかったのでしょうか?回避策はありませんか?
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;
proc sql
でoutobs
オプションを使用しようとしましたか?
例えば、
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
が機能する場合は、それをお勧めします。