2009-03-11 14 views
3

SASと一緒にSQLパススルー機能を使用する利点はありますか?SASでのSQl PAssthrough

+0

回答には十分な情報がありません –

答えて

4

この質問は過度に広がっていますが、私は過度に広い回答を提供することができます。

SASのパススルーSQLを使用すると、データベースと直接通信できます。これは、データベース固有の機能を使用する場合に非常に有利になります。たとえば、Oracleの統計関数がその例です。 SASがコーディングをどのように処理するか、SQLをどのように翻訳するか心配する必要はありません。

また、パススルーSQLはSAS側で処理する必要がほとんどありません。 SASボックスが非常に混雑している場合は、処理ロジックを直接データベースに送信することができます。これはパススルーSQLを使用せずに可能ですが、使用する際にはより高度な制御が可能です。

これは決して網羅的なメリットのリストではなく、パススルーSQLを使用するためのいくつかの高いレベルの特典です。より具体的なユースケースがある場合は、コーディングテクニックの具体的な相違点について説明します。

2

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

4

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スルー)SASへダウンフラグ= 1と一致するすべてのデータをプルし、再びデータベースにロードします。これは本当に減速する数百万行です。

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

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秒でした。

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; 

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

+0

+1興味深い使い方は... –

0

簡単に言えば、SQLパススルー文を使用すると、データベースに送信される内容をより詳細に制御できます。

関連する問題