Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Por que o tempo de execução do procedimento armazenado do Oracle é muito aumentado dependendo de como ele é executado?


Tente obter parâmetros nls de seus diferentes cases (programas ide ou java) eles devem ser diferentes
select * from NLS_SESSION_PARAMETERS

Em seguida, dentro de seu procedimento de armazenamento, defina as variáveis ​​para torná-las iguais no caso mais rápido.
  execute immediate 'alter session set NLS_SORT=''SPANISH''';

Uma vez que você SP tenha todos os parâmetros nls. Vai correr rápido.

Recentemente, encontrei um caso semelhante na sessão Alter que diminui a velocidade da consulta por meio do Hibernate. mas no caso deles eles mudam os parâmetros e depois ficam lentos.

Eu investiguei e descobri que os parâmetros NLS_COMP y NLS_SORT podem afetar como o oracle usa o plano de execução para string (quando está comparando ou ordenando)

Quando NLS_COMP for definido como LINGUISTIC, ele usará a linguagem definida em NLS_SORT.

por exemplo, se NLS_COMP =LINGUISTIC e NLS_SORT=BINARI_AI sua consulta é
select * from table where string_column like 'HI%'

internamente vai fazer
select * from table where  
NLSSORT(string_column,'BINARI_AI') >= HEXTORAW('324242432')
NLSSORT(string_column,'BINARI_AI') >= HEXTORAW('675757576')

então se você não tiver um índice para NLSSORT(column,'BINARI_AI') será muito lento.

sabendo que NLS_SORT=BINARY_AI fará sua ordenação e comparações sem distinção entre acentos e maiúsculas.