質問

SASとともにSQLパススルー機能を使用する利点はありますか?

役に立ちましたか?

解決

この質問は非常に広範ですが、過度に幅広い回答を提供できます。

SASのパススルーSQLを使用すると、データベースと直接通信できます。これは、データベース固有の機能を使用している場合に非常に有利になります。例は、Oracleの統計関数です。 SASがコーディングを処理する方法やSQLを変換する方法について心配する必要はありません。

さらに、パススルーSQLがSAS側でほとんど処理を必要としないことも、私たちにとって利点でした。非常に忙しいSASボックスがある場合は、処理ロジックをデータベースに直接送信することを選択できます。これは、パススルーSQLを使用しなくても可能ですが、それを利用する場合、より高度な制御が可能です。

これは決して利点の完全なリストではなく、単にパススルーSQLを使用することによるいくつかの高レベルの特典です。より具体的なユースケースがある場合は、コーディング手法の具体的な違いについて説明できます。

他のヒント

PROC SQLは、できる限り多くのロジックをデータベースに渡そうとしますが、できない場合があります。データベース(またはデータベースのSAS / ACCESSエンジン)に同等の機能を持たないSAS関数を使用すると、クエリ全体がデータベースに渡されなくなります。クエリがデータベースに完全に渡されない場合、データはSASに取り込まれ、そこで処理されます。 SQLが複雑になるほど、最終的にSASで処理される可能性が高くなります。ここに、あなたが気づくよりも大きな違いをもたらすケースがあります。

libname db <database> path=dbserver user=... password=...;
proc sql;
   create table db.new as
   select * from db.largedata where flag=1;
quit;

これにより、実際には(少なくともSAS 9.1.3を介して)flag = 1に一致するすべてのデータがSASにプルダウンされ、データベースにロードされます。これは数百万行で、本当に遅くなります。

この場合、明示的なパススルーがはるかに高速になります。

proc sql;
   connect dbase (server=dbserver user=... password=...);
   execute (create table db.new as
   select * from db.largedata where flag=1) as dbase;
   disconnect dbase;
quit;

最近、Oracleと約250,000行のテーブルを使用した例を行いました。最初の方法では20秒かかり、2番目の方法では2秒かかりました。

パススルーを使用しない場合、データベースからすべてのレコード(処理に必要なレコード)をsasにインポートする必要があります。パススルーを使用すると、データベース側で処理を実行し、結果のレコードのみをsasに引き継ぐことができます。処理時間とネットワーク使用量の違いは、何をするかに応じて、非常に小さなものから巨大なものまであります。

パススルーを使用することには利点がありますが、何を達成しようとしているかによって異なります。一般に、クエリを実行するときは、パススルーなしで標準のproc sqlを使用します。ただし、最近、いくつかのストアドプロシージャを生成するために使用しました。

proc sql;
    connect to mysql(user = 'xxxxx' pass = 'xxxxx' server = 'localhost');
        execute(set @id = &id.) by mysql;
        execute(select (@lit:=image_text) from quality.links_image_text where image_id = @id) by mysql;
        execute(set @lidx = locate('ninja',@lit)) by mysql;
        execute(set @lidx2 = locate(' ',@lit,@lidx)) by mysql;
        execute(set @lidxd = @lidx2 - @lidx) by mysql;
        execute(set @lf = substr(@lit,@lidx,@lidxd)) by mysql;

        create table asdf as
        select &id. as id, a as ws from connection to mysql
        (select @lf as a)
        ;
    disconnect from mysql;
quit;

明らかに、それはパススルー以外で実行できることではありません(少なくとも私が知っていることはそうではありません)。だから...それはすべてあなたが何を達成しようとしているのかに依存します。

簡単に言えば、SQLパススルーステートメントを使用すると、データベースに送信されるものをより詳細に制御できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top