domingo, 14 de octubre de 2018

proc sql vs data step

Con frecuencia trabajando con SAS nos planteamos la diferencia entre usar el procedimiento proc sql frente a un paso data (data step). Existen importantes diferencias en su plan de ejecución y es conveniente conocer cuál es más apropiado para cada caso.
El  paso data se ejecuta registro a registro utilizando el PDV (program data vector) , utiliza un buffer de entrada y de salida desde donde escribe a la tabla de salida.

Fuente: www.sas.com
En el proc sql primero se ejecuta el optimizador de queries, después de sube la tabla a memoria y después se realizan los cálculos sobre la tabla completa. El resultado se escribe en la tabla de salida

                                                                                                                         Fuente: www.sas.com
Es habitual plantearse en qué casos utilizar un proc sql y en qué casos utilizar un paso data. No existe una regla general, pero si existen casos en los que uno puede ser más eficiente que el otro.

PASO DATA:
  •  Pasos que generan múltiples tablas de salida
  •  Pasos de lectura de fichero externo
  •  Pasos que precisan operaciones por grupo (first, last) u operaciones en primera fila (_N_)
  •  Pasos con muchos campos calculados o lógica de negocio compleja
  •  Procesado de tablas grandes
  •  Pasos que precisen uso de arrays
  •  Pasos que precisan de una salida selectiva (if + output)
 PROC SQL:
  •  Cuando se necesiten generar un proceso "transportable“ o en un lenguaje más genérico
  •  Pasos conoperaciones de joins, salvo masivos (hash o format) o varias tablas de salidas (merge)
  •  Pasos que precisen de acceder directamente a BBDD
  •  Pasos que acceden a tablas del diccionario 
  •  Procesado de tablas pequeñas

2 comentarios:

  1. Buenos días, me parece muy interesante. Pero se pueden combinar??
    Es decir, yo necesito recorrer una tabla y para cada registro ejecutar varios insert y update encadenados.
    No soy capaz de hacerlo.
    la idea es:-
    data recorrejecuta;
    set tabla;
    %let campo1=campoorigen;
    proc sql;
    insert into tabla1 set valor=1 where campo=&campo1.;
    insert into tabla2 set valor=1 where campo=&campo1.;
    update tabla3 set valor=&campo1. where campo=&campo1.;
    run;

    MIL GRACIAS..

    ResponderEliminar
  2. Hola Javier,
    Entiendo que lo que quieres es ejecutar una serie de inserts y update para los valores que lees en una tabla que recorres con un paso data y quieres ejecutarlos para los valores de cada fila. Debes usar un sentencia llamada: call execute (https://support.sas.com/resources/papers/proceedings/proceedings/sugi30/027-30.pdf)

    Te pongo un ejemplo para tu caso:
    data _null_;
    set tabla;
    call execute('%operaciones_insert_update('||campoorigen||')');
    run;

    Tienes que crear la macro operaciones_insert_update que contiene las operaciones de insert, update a realizar

    %macro operaciones_insert_update(campo1);
    proc sql;
    insert into tabla1 set valor=1 where campo=&campo1.;
    insert into tabla2 set valor=1 where campo=&campo1.;
    update tabla3 set valor=&campo1. where campo=&campo1.;
    quit;
    %mend;

    Mira a ver si te sirve o lo debes adaptar un poco.
    Si tienes más dudas, escribe a: formacion@datademy.es
    www.datademy.es

    ResponderEliminar