Pregunta

¿Hay alguna ventaja de utilizar el servicio Passthrough de SQL junto con SAS?

¿Fue útil?

Solución

Aunque esta pregunta es demasiado amplia, puedo proporcionar una respuesta demasiado amplia.

El SQL de paso en SAS le permite comunicarse directamente con una base de datos. Esto se vuelve muy ventajoso cuando está utilizando funciones específicas de la base de datos. Un ejemplo serían las funciones estadísticas de Oracle. No tiene que preocuparse por cómo SAS manejará su codificación o traducirá su SQL.

Además, también ha sido un beneficio para nosotros que Pass-through SQL requiera muy poco procesamiento en el lado SAS. Si tiene una caja SAS extremadamente ocupada, puede optar por enviar la lógica de procesamiento directamente a la base de datos. Esto es posible sin utilizar Pass-through SQL, pero tiene un mayor grado de control cuando lo utiliza.

Esta no es una lista exhaustiva de beneficios, solo algunas ventajas de alto nivel para usar SQL de paso. Si tiene un caso de uso más concreto, podemos analizar las diferencias específicas en las técnicas de codificación.

Otros consejos

PROC SQL intentará pasar la mayor cantidad de lógica posible a la base de datos, pero hay varias veces que no puede. El uso de funciones SAS que no tienen equivalente en la base de datos (o en el motor SAS / ACCESS para la base de datos), evitará pasar toda la consulta a la base de datos. Cuando la consulta no se pasa completamente a la base de datos, los datos se extraen en SAS y se procesan allí. Cuanto más complicado sea su SQL, es más probable que termine siendo procesado en SAS. Aquí hay un caso que hace una diferencia más grande de lo que podría darse cuenta.

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

Esto en realidad (al menos a través de SAS 9.1.3) extraerá todos los datos que coincidan con flag = 1 a SAS y luego los volverá a cargar en la base de datos. Si se trata de millones de filas, realmente se ralentiza.

Encontraría un paso explícito mucho más rápido en este caso.

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;

Recientemente hice un ejemplo usando Oracle y una tabla con aproximadamente 250,000 filas. La primera forma tomó 20 segundos y la segunda a 2 segundos.

Si no utiliza la transferencia, debe importar todos los registros (que necesita para el procesamiento) de la base de datos a sas. Al utilizar el paso a través, puede realizar algún procesamiento en el lado de la base de datos y traer solo los registros resultantes a sas. La diferencia (en términos de tiempo de procesamiento y uso de la red) puede variar mucho, de pequeña a enorme, dependiendo de lo que haga.

Hay ventajas de usar passthrough, pero depende de lo que intentes lograr. En general, utilizo proc sql estándar sin el paso al hacer consultas. Recientemente, sin embargo, lo he usado para generar algunos procesos almacenados.

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;

Claramente, eso no es algo que se pueda hacer fuera del paso (al menos no que yo sepa). Entonces sí ... todo depende de lo que intentes lograr.

En pocas palabras, las declaraciones de paso de SQL le dan más control sobre lo que se envía a la base de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top