¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Cómo mejorar el rendimiento de selección de datos en SAP NW04 con Oracle DB

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 4 Vistas
0
Cargando...

¡Hola a todos!

Estoy trabajando con SAP NW04 con Oracle DB.

He creado un ODS que contiene varios millones de registros.

Ahora necesito seleccionar algunos datos de este ODS mediante un informe externo.

En este informe, debo seleccionar estos datos filtrando algunos campos clave y seleccionando algunos campos no clave.

Según esto, creé un índice en el ODS respetando los criterios de selección.

En resumen, esta es mi situación:

SELECT /bic/zcltt

/bic/zcbpa

/bic/zcacc

/bic/zczdn

/bic/zkiut

FROM /bic/azosu00

INTO TABLE l_t_inc_esr

FOR ALL ENTRIES IN i_act

WHERE /bic/zcltt <> espacio " Campo clave indexado

AND /bic/zcnpl <> espacio " Campo clave indexado

AND /bic/zcsut EN l_r_zsut " Campo clave indexado

AND /bic/zczdn >= i_act-z_dat_rp " Campo indexado

AND /bic/zczdn <= i_act-z_dat_ch " Campo indexado

AND /bic/zclpa <> 'H' " Campo indexado

AND /bic/zcbpa = i_act-/bic/zcbpa " Campo indexado

%_HINTS

ORACLE 'USE_CONCAT'

ORACLE 'INDEX("/BIC/AZOSU00" "/BIC/AZOSU0001")'.

Pero la selección tarda mucho tiempo.

Incluso si forcé la selección al índice /BIC/AZOSU0001 (contiene los 7 campos en la selección también, 3 de ellos son parte de la clave primaria en el ODS), el sistema intenta acceder con este índice, pero luego realiza un escaneo completo de la tabla.

¿Es posible que, en general, un índice no funcione con las condiciones de "NO IGUAL"?

¿Debería extraer todos los datos sin la condición "<>", luego filtrarlos en la tabla interna?

¿Por qué el optimizador no puede acceder al rango del índice correctamente?

Gracias de antemano.

Saludos

Alfonso

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Hola Stefan,

Disculpa por el malentendido... Estoy apurado...

Quiero decir:

2) Ejecuté la traza con el Trace ON en la transacción ST05 abierta en otra sesión.

3) la declaración FOR ALL ENTRIES quedó de la siguiente manera:

SELECT

/*+

USE_CONCAT INDEX("/BIC/AZOSU00" "/BIC/AZOSU0001")

*/

"/BIC/ZCLTT" , "/BIC/ZCBPA" , "/BIC/ZCACN" , "/BIC/ZCZDN" ,

"/BIC/ZCPRV" , "/BIC/ZNFAT" , "/BIC/ZCSUT" , "/BIC/ZKIUT"

FROM

"/BIC/AZOSU00"

WHERE

"/BIC/ZCLTT" <> :A0 AND "/BIC/ZCNPL" <> :A1 AND "/BIC/ZCSUT" IN (

:A2 , :A3 , :A4 , :A5 , :A6 , :A7 , :A8 , :A9 ) AND "/BIC/ZCZDN" >= :A10

AND "/BIC/ZCZDN" <= :A11 AND "/BIC/ZCLPA" <> :A12 AND

"/BIC/ZCBPA" = :A13

4) la explicación del acceso a la base de datos:

- INDEX FULL SCAN /BIC/AZOSU0001

( Costos Estimados = 26 , #Filas Estimadas = 1 )

Luego:

- TABLE ACCESS FULL /BIC/AZOSU00

Espero que esta explicación te ayude a resolver mi problema.

Gracias

Alfonso

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Alfonso,

Creo que me has malinterpretado.

1) Ok... sin histogramas

2) Me refiero a la ejecución si ejecutas la declaración en ST05 o con "set autotrace on" en sqlplus

3) No, me refiero a cuál es la declaración exacta que se ejecuta en la base de datos... la interfaz de la base de datos puede convertir los FOR ALL ENTRIES en IN-LISTs o en concatenación de OR.

4) Me refiero a los predicados de filtro y acceso del plan de explicación de Oracle

Todas mis preguntas se referían a la base de datos en sí misma, no a cosas lógicas.

Saludos

Stefan

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Stefan,

Gracias por tu respuesta.

Intento responder a tus preguntas ahora:

1) la tabla no contiene ningún histograma, es un simple ODS con todas las posiciones de la factura.

2) mi plan es extraer las posiciones de la factura filtradas para los clientes /bic/zcbpa y la fecha de registro /bic/zczdn incluida en el intervalo descrito desde ztlci_dat_rp y ztlci_dat_ch en el encabezado de la factura ODS (extraído anteriormente), incluyendo solo algunos tipos de documento en un rango.

3) como puedes ver en el código, el FOR ALL ENTRIES debe ejecutarse en condiciones completas DE Y, y hay algunos datos (que verifiqué) que cumplen con estas condiciones.

2) como expliqué en el punto 2, debo filtrar los datos en el ODS (datos activos) del Cliente y la fecha de registro de la tabla interna de encabezado de factura, y los tipos de documento de un rango l_r_zsut declarado "...TYPE RANGE OF /BIC/OIZSUT".

Espero que me puedas ayudar...

Gracias

Alfonso

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Alfonso,

>> ¿Por qué el optimizador no puede acceder correctamente al rango de índices?

1) ¿Tienen las columnas de la tabla histogramas?

2) ¿Cuál es el plan de ejecución?

3) ¿Se ejecuta la cláusula FOR ALL ENTRIES como una lista IN o como una concatenación OR?

4) ¿Son los índices índices de mapa de bits?

5) ¿Cuáles son los predicados de acceso y cuáles son los predicados de filtro?

Faltan muchos datos para poder ayudarte.

Saludos

Stefan

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?