Avalados por :

Como melhorar o desempenho da seleção de dados no SAP NW04 com Oracle DB

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

Olá a todos!

Estou trabalhando com o SAP NW04 com Oracle DB.

Criei um ODS que contém vários milhões de registros.

Agora preciso selecionar alguns dados deste ODS através de um relatório externo.

Neste relatório, devo selecionar esses dados filtrando alguns campos-chave e selecionando alguns campos não chave.

Com base nisso, criei um índice no ODS respeitando os critérios de seleção.

Resumindo, esta é a minha situação:

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 <> espaço " Campo chave indexado

AND /bic/zcnpl <> espaço " Campo chave indexado

AND /bic/zcsut EM l_r_zsut " Campo chave 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")'.

Mas a seleção está demorando muito tempo.

Mesmo que eu tenha forçado a seleção no índice /BIC/AZOSU0001 (que contém os 7 campos na seleção também, 3 deles fazem parte da chave primária no ODS), o sistema tenta acessar com este índice, mas depois realiza uma varredura completa da tabela.

É possível que, de forma geral, um índice não funcione com as condições de "NÃO IGUAL"?

Devo extrair todos os dados sem a condição "<>", e depois filtrá-los na tabela interna?

Por que o otimizador não consegue acessar corretamente o intervalo do índice?

Obrigado antecipadamente.

Saudações

Alfonso

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

4 Respuestas

0
Cargando...

Olá Stefan,

Desculpe pelo mal-entendido... Estou com pressa...

Quero dizer:

2) Execute o trace com o Trace ON na transação ST05 aberta em outra sessão.

3) a declaração FOR ALL ENTRIES ficou da seguinte forma:

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) a explicação do acesso ao banco de dados:

- INDEX FULL SCAN /BIC/AZOSU0001

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

Em seguida:

- TABLE ACCESS FULL /BIC/AZOSU00

Espero que esta explicação ajude a resolver meu problema.

Obrigado

Alfonso

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

Olá Alfonso,

Acho que você me interpretou mal.

1) Ok... sem histogramas

2) Estou me referindo à execução se você executa a declaração no ST05 ou com "set autotrace on" no sqlplus

3) Não, estou me referindo a qual é a declaração exata que é executada no banco de dados... a interface do banco de dados pode converter os FOR ALL ENTRIES em IN-LISTs ou em concatenação de OR.

4) Estou me referindo aos predicados de filtro e acesso do plano de explicação do Oracle

Todas as minhas perguntas se referiam ao banco de dados em si, não a coisas lógicas.

Saudações

Stefan

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

Olá Stefan,

Obrigado pela sua resposta.

Vou tentar responder às suas perguntas agora:

1) A tabela não contém nenhum histograma, é um simples ODS com todas as posições da fatura.

2) Meu plano é extrair as posições da fatura filtradas para os clientes /bic/zcbpa e a data de registro /bic/zczdn incluída no intervalo descrito de ztlci_dat_rp e ztlci_dat_ch no cabeçalho do ODS da fatura (extraído anteriormente), incluindo apenas alguns tipos de documento em um intervalo.

3) Como pode ver no código, o FOR ALL ENTRIES deve ser executado em condições completas E, e existem alguns dados (que verifiquei) que atendem a essas condições.

2) Como expliquei no ponto 2, devo filtrar os dados no ODS (dados ativos) do Cliente e a data de registro da tabela interna do cabeçalho da fatura, e os tipos de documento de um intervalo l_r_zsut declarado "...TYPE RANGE OF /BIC/OIZSUT".

Espero que você possa me ajudar...

Obrigado

Alfonso

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

Olá Alfonso,

>> Por que o otimizador não consegue acessar corretamente o intervalo de índices?

1) As colunas da tabela têm histogramas?

2) Qual é o plano de execução?

3) A cláusula FOR ALL ENTRIES é executada como uma lista IN ou como uma concatenação OR?

4) Os índices são índices de mapa de bits?

5) Quais são os predicados de acesso e quais são os predicados de filtro?

Faltam muitos dados para poder ajudar você.

Saudações

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?