El otro día Fernando comentó que los cruces de tablas más rápidos entre tablas grandes y tablas pequeñas son las sentencias condicionales sobre listas. Tiene razón. Es una práctica muy habitual en SAS cuando leemos tablas de Oracle la ralización de listas, esto derivará en otro truco SAS en breves días. El caso es que me gustaría que probárais este código:
data grande;
do i=1 to 20000000;
idcliente=int(ranuni(0)*1000000);
drop i;
output;
end;
run;
*CONJUNTO DE DATOS PEQUEÑO, NO TIENE
REGISTROS DUPLICADOS;
data pequenio;
do i=1 to 2000000;
idcliente=int(ranuni(34)*1000000);
drop i;
if mod(idcliente,1132)=0 then output;
end;
run;
proc sort data=pequenio nodupkey; by idcliente;quit;
*;
proc sql noprint;
select idcliente into:lista separated by " "
from pequenio ;
quit;
*;
data machea5;
set grande;
if idcliente in (&lista.);
run;
Bueno, el tiempo de ejecución de este cruce es de 3 segundos. Mejora a las soluciones planteadas el otro día y sobre todo es un código fácil, muy fácil. Se trata de crear listas de macrovariables y realizar un paso data con una sentencia condicional. Tiene un problema, el tamaño máximo que nos permite una macrovariable. Y en este punto continúa el truco SAS. ¿Cúal es el tamaño máximo que puede tener una macrovariable? 64K, 65534 characters. Tenemos que evitar a toda costa este error: ERROR: The length of the value of the macro variable LISTA (70356) exceeds the maximum length (65534). The value has been truncated to 65534 characters. Para evitar este problema podemos realizar el siguiente planteamiento: 65.000/la longitud del campo de cruce, en el caso del ejemplo: 65.000/8 = 8.000 más o menos. Hacemos una prueba: