SAS と共に SQL パススルー機能を使用する利点はありますか?
5 に答える
この質問は範囲が広すぎますが、範囲が広すぎる回答を提供できます。
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 秒かかりました。
パススルーを使用することには利点がありますが、何を達成しようとしているかによって異なります。通常、クエリを実行するときは、パススルーなしで標準の 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;
明らかに、これはパススルー以外で実行できるものではありません (少なくとも私が知っていることではありません)。そうそう...それはすべて、あなたが達成しようとしていることに依存します.
パススルーを使用しない場合は、(処理に必要な) すべてのレコードをデータベースから sas にインポートする必要があります。パススルーを使用することで、データベース側で何らかの処理を行い、結果のレコードのみを sas に持ち込むことができます。その違い (処理時間とネットワーク使用量の点で) は、何をするかによって、小さなものから大きなものまで、非常に大きくなる可能性があります。
簡単に言うと、SQL パススルー ステートメントを使用すると、データベースに送信される内容をより詳細に制御できます。