Domanda

Ci sono dei vantaggi nell'usare la funzione SQL Passthrough insieme a SAS?

È stato utile?

Soluzione

Sebbene questa domanda sia eccessivamente ampia, posso fornire una risposta troppo ampia.

L'SQL pass-through in SAS consente di comunicare direttamente con un database. Questo diventa molto vantaggioso quando si utilizzano funzioni specifiche del database. Un esempio potrebbero essere le funzioni statistiche di Oracle. Non devi preoccuparti di come SAS gestirà la tua codifica o tradurrà il tuo SQL.

Inoltre, è stato anche un vantaggio per noi il fatto che SQL pass-through richieda pochissima elaborazione sul lato SAS. Se si dispone di una scatola SAS estremamente occupata, è possibile scegliere di inviare la logica di elaborazione direttamente al database. Ciò è possibile senza utilizzare Pass-through SQL, ma si ha un livello maggiore di controllo durante l'utilizzo.

Questo non è affatto un elenco esaustivo di vantaggi, semplicemente alcuni vantaggi di alto livello nell'uso di SQL pass-through. Se hai un caso d'uso più concreto, possiamo discutere le differenze specifiche nelle tecniche di codifica.

Altri suggerimenti

PROC SQL proverà a trasmettere la maggior parte della logica possibile al database, ma ci sono diverse volte in cui non è possibile. L'uso di funzioni SAS che non hanno equivalenti nel database (o nel motore SAS / ACCESS per il database), impedirà di passare l'intera query al database. Quando la query non viene completamente passata al database, i dati vengono trasferiti in SAS ed elaborati lì. Più complicato è il tuo SQL, più è probabile che finirà per essere elaborato in SAS. Ecco un caso che fa una differenza maggiore di quanto potresti immaginare.

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

Questo effettivamente (almeno attraverso SAS 9.1.3) estrarrà tutti i dati che corrispondono a flag = 1 in SAS e poi li caricherà nuovamente nel database. Si tratta di milioni di file che rallenta davvero.

In questo caso potresti trovare un passaggio esplicito molto più veloce.

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;

Di recente ho fatto un esempio usando Oracle e una tabella con circa 250.000 righe. Il primo modo ha impiegato 20 secondi e il secondo modo a 2 secondi.

Se non si utilizza il pass-through, è necessario importare tutti i record (necessari per l'elaborazione) dal database in sas. Utilizzando il pass-through, è possibile eseguire alcune elaborazioni sul lato database e trasferire in sas solo i record risultanti. La differenza (in termini di tempo di elaborazione e utilizzo della rete) può molto, da minuscola a enorme, a seconda di ciò che fai.

Ci sono vantaggi nell'uso del passthrough, ma dipende da cosa stai cercando di realizzare. In generale, utilizzo proc sql standard senza il passthrough quando faccio query. Di recente, tuttavia, l'ho usato per generare alcuni processi memorizzati.

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;

Chiaramente, non è qualcosa che può essere fatto al di fuori del passthrough (almeno non di cui io sia a conoscenza). Quindi sì ... tutto dipende da cosa stai cercando di realizzare.

In parole semplici, le istruzioni pass-through SQL offrono un maggiore controllo su ciò che viene inviato al database.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top