Thursday, November 02, 2006

FOR ALL ENTRIES vs. INNER JOIN


Mucha gente se pregunta...Que es más rápido de ejecutar...Un FOR ALL ENTRIES o un INNER JOIN? Pues bueno, para que queden dudas, he hecho un pequeño programa para medir el tiempo de ejecución entre dos tablas BKPF y BSAK.

REPORT Z_DUMMY_ATG NO STANDARD PAGE HEADING.

TABLES: BKPF, BSEG.

DATA: T_BKPF TYPE STANDARD TABLE OF BKPF
WITH HEADER LINE,
T_BSAK TYPE STANDARD TABLE OF BSAK
WITH HEADER LINE.

DATA: RT_STR TYPE I,
RT_END TYPE I,
RUN_TIME1 TYPE P DECIMALS 2,
RUN_TIME2 TYPE P DECIMALS 2.

SELECT *
INTO TABLE T_BKPF
FROM BKPF.

IF NOT T_BKPF[] IS INITIAL.
GET RUN TIME FIELD RT_STR.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE T_BSAK
FROM BSAK
FOR ALL ENTRIES IN T_BKPF
WHERE BELNR EQ T_BKPF-BELNR.
GET RUN TIME FIELD RT_END.
RUN_TIME1 = ( RT_END - RT_STR ) / 1000000 .
ENDIF.

WRITE: 'Runtime para FOR ALL ENTRIES', RUN_TIME1.

CLEAR: T_BKPF,T_BSAK.
REFRESH: T_BKPF,T_BSAK.

GET RUN TIME FIELD RT_STR.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE T_BSAK
FROM ( BKPF INNER JOIN BSAK
ON BKPF~BELNR = BSAK~BELNR ).

GET RUN TIME FIELD RT_END.
RUN_TIME2 = ( RT_END - RT_STR ) / 1000000 .

WRITE:/ 'Runtime para JOIN', RUN_TIME2.

Analicemos los resultados...

Prueba 1:
---------
Runtime para FOR ALL ENTRIES 0.12
Runtime para JOIN 0.02

Prueba 2:
---------
Runtime para FOR ALL ENTRIES 0.10
Runtime para JOIN 0.01

Prueba 3:
---------
Runtime para FOR ALL ENTRIES 0.11
Runtime para JOIN 0.02

Claramente, el INNER JOIN supera al FOR ALL ENTRIES...Y por mucho...
Saludos,

Blag.

8 comments:

Alejo said...

muy útil. La información que estaba buscando.
Gracias.

Anonymous said...

Utilísimo. Muchas gracias. Voy a implementar una mejora en proceso de larga duración gracias a esta entrada.

Anonymous said...

Se puede hacer el join a mas de 2 tablas sin perder la performans.
Gracias por la respuesta

Alvaro "Blag" Tejada Galindo said...

Un Inner Join a más de 2 tablas no afecta el performance, siempre y cuando se utilicen correctamente las llaves y los indices.

Saludos,

Blag.

Anonymous said...

Hola, quede confundida, pq recién lei un artículo que decía lo contrario .. http://scn.sap.com/message/13610486

gracias de todos modos.

Alvaro "Blag" Tejada Galindo said...

Bueno...no puedo leer el articulo porque me manda a la pagina principal...en realidad, utilizar uno u otro depende del tipo de consulta que tengas que hacer...en mis pruebas, el Inner Join gano, pero en otro tipo de pruebas puede ganar el FOR ALL ENTRIES...

En programacion nada esta escrito en piedra, asi que cada uno puede tomar su propia desicion basado en sus propias pruebas -:)

Saludos,

Blag.

Unknown said...

Buen Post, estaba buscando como medir consultas y performance.
Con la Tx SE30 se podría aportar
más información de en donde se ralentiza más el "FOR ALL ENTRIES".

A este tipo de "Test" deben agregarseles las configuraciones de los servidores, ¿si el motor SQL se encuentra remoto o no?, ¿que motor usa?, ¿donde esta alojado el sistema?.. Todo esto es necesario para poder comparar estos resultados con los de algún otro compañero.

Todo depende de que servidor tiene más carga o más potencia para ver cuando es conveniente usar un método o el otro.

Saludos.

Alvaro "Blag" Tejada Galindo said...

Rafael:

Tienes razon...este es un post bastante antiguo asi que no me acuerdo mucho...pero creo que lo hice con el NetWeaver Sneak Preview...asi que el sistema era local, con MaxDB...tanto el For All Entries como el Inner Join corrieron bajo el mismo servidor -:)

Saludos,

Blag.