MUNDOSAP

MUNDOSAP (foro/index.php)
-   Programación ABAP IV (foro/forumdisplay.php?f=4)
-   -   Optimizar consulta sql (foro/showthread.php?t=76198)

migconman 08/09/16 14:14:22

Optimizar consulta sql
 
Hola a todos, tengo un inner join que me pidieron optimizar pero la tabla 'equi' tiene aprox. 9 millones de registros y la tabla 'zmmt_est_seruni' 12millones aprox.

SELECT a~equnr a~sernr a~kunde
INTO TABLE it
FROM equi AS a INNER JOIN zmmt_est_seruni AS b
ON a~sernr = b~sernr
AND a~equnr = b~equnr "add
WHERE a~erdat >= '20050701'
AND b~bwart IN ('X78', '241', 'X05')
AND a~kunde <> space
order by a~sernr a~kunde.

CAMPOS CLAVE:
EQUI: EQUNR
zmmt_est_seruni : SERNR

LA CONSULTA DEMORA APROX. 20 MINUTOS.. NO DA TIME OUT NI NADA, EL SOLO EL TIEMPO DE ESPERA.
Gracias por la ayuda.

Anthony Martinez 13/09/16 21:02:24

una opcion
 
hola migconman, te envio el codigo que podrias reemplazar y probar para que obtengas el mismo resultado en menos tiempo, me comentas como te fue:


REPORT zprueba019.

DATA: ra_matnr TYPE RANGE OF mara-matnr.

TYPES: BEGIN OF gty_equi,
equnr TYPE equi-equnr,
erdat TYPE equi-erdat,
matnr TYPE equi-matnr,
sernr TYPE equi-sernr,
kunde TYPE equi-kunde,
END OF gty_equi.

TYPES: BEGIN OF gty_mmt_est_seruni,
sernr TYPE zmmt_est_seruni-sernr,
equnr TYPE zmmt_est_seruni-equnr,
END OF gty_mmt_est_seruni.

DATA: lt_equi TYPE STANDARD TABLE OF gty_equi,
lt_mmt_est_seruni TYPE STANDARD TABLE OF zmmt_est_seruni.

FIELD-SYMBOLS: <fs_equi> LIKE LINE OF lt_equi.

*Realizas tu consulta en la tabla EQUI usando el comodin HINTS para utilizar el indice de esa tabla
SELECT equnr erdat matnr sernr kunde
INTO TABLE lt_equi
FROM equi
WHERE sernr NE space
AND matnr IN ra_matnr
%_HINTS ORACLE 'INDEX("EQUI" "EQUI~A")'.
IF lt_equi[] IS NOT INITIAL.
DELETE lt_equi WHERE erdat LT '20050701'.
DELETE lt_equi WHERE kunde EQ space.

SELECT sernr equnr
INTO TABLE lt_mmt_est_seruni
FROM zmmt_est_seruni
FOR ALL ENTRIES IN lt_equi
WHERE sernr EQ lt_equi-sernr
AND equnr EQ lt_equi-equnr
AND bwart IN ('X78', '241', 'X05').

SORT lt_mmt_est_seruni BY sernr equnr.
LOOP AT lt_equi ASSIGNING <fs_equi>.
READ TABLE lt_mmt_est_seruni
WITH KEY sernr = <fs_equi>-sernr
equnr = <fs_equi>-equnr
BINARY SEARCH
TRANSPORTING NO FIELDS.
IF sy-subrc NE 0.
MOVE 'X' TO <fs_equi>-flag.
ENDIF.
ENDLOOP.
* Despues que borres los registros marcados de esta tabla interna tendras los registros que necesitas en tu inner join inicial
DELETE lt_equi WHERE flag EQ 'X'.
SORT lt_equi BY equnr sernr kunde.
ENDIF.


Husos Horarios son GMT. La hora en este momento es 16:17:54.

www.mundosap.com 2006 - Spain
software crm, crm on demand, software call center, crm act, crm solutions, crm gratis, crm web