#1
|
|||
|
|||
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. |
#2
|
|||
|
|||
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. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|