Oracle
 sql >> Database >  >> RDS >> Oracle

Perché il tempo di esecuzione della stored procedure Oracle è notevolmente aumentato a seconda di come viene eseguito?

Prova a ottenere i parametri nls dai tuoi casi diversi (programmi ide o java) devono essere diversi

select * from NLS_SESSION_PARAMETERS

Quindi all'interno della procedura del tuo negozio imposta le variabili per renderle uguali dal caso più veloce.

  execute immediate 'alter session set NLS_SORT=''SPANISH''';

Una volta che SP hai tutti i parametri nls. Funzionerà velocemente.

Di recente ho riscontrato che un caso simile in Alter session rallenta la query tramite Hibernate . ma nel loro caso cambiano i parametri e poi diventano lenti.

Ho studiato e scoperto che i parametri NLS_COMP e NLS_SORT possono influenzare il modo in cui Oracle utilizza il piano di esecuzione per stringa (quando si confronta o ordina)

Quando NLS_COMP è definito come LINGUISTICO, utilizzerà la lingua definita in NLS_SORT.

ad esempio, se NLS_COMP =LINGUISTIC e NLS_SORT=BINARI_AI la tua query è

select * from table where string_column like 'HI%'

internamente lo farà

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

quindi se non hai un indice per NLSSORT(colonna,'BINARI_AI') sarà molto lento.

sapendo che NLS_SORT=BINARY_AI renderà insensibili all'accento e alle maiuscole i tuoi ordini e confronti.