Optimizar consulta sql

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • migconman
    Junior Member
    • may
    • 25

    #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.
  • Anthony Martinez
    Member
    • nov
    • 30

    #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.

    Comentario

    Trabajando...