Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Warum wird die Ausführungszeit für gespeicherte Oracle-Prozeduren stark erhöht, je nachdem, wie sie ausgeführt wird?

Versuchen Sie, nls-Parameter aus Ihren verschiedenen Fällen (Ide- oder Java-Programme) zu erhalten, sie müssen unterschiedlich sein

select * from NLS_SESSION_PARAMETERS

Setzen Sie dann innerhalb Ihrer Speicherprozedur die Variablen so, dass sie vom schnellsten Fall aus gleich sind.

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

Sobald Sie SP alle nls Parameter haben. Es läuft schnell.

Ich habe erst kürzlich einen ähnlichen Fall in Alter session slows down the query through Hibernate gefunden. aber in ihrem Fall ändern sie die Parameter und wurden dann langsam.

Ich habe untersucht und festgestellt, dass die Parameter NLS_COMP und NLS_SORT beeinflussen können, wie Oracle den Ausführungsplan für Zeichenfolgen verwendet (beim Vergleichen oder Bestellen)

Wenn NLS_COMP als LINGUISTIC definiert ist, verwendet es die in NLS_SORT definierte Sprache.

zum Beispiel, wenn NLS_COMP =LINGUISTIC und NLS_SORT=BINARI_AI Ihre Abfrage ist

select * from table where string_column like 'HI%'

intern wird es tun

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

wenn Sie also keinen Index für NLSSORT(column,'BINARI_AI') haben, wird es sehr langsam sein.

wissend, dass NLS_SORT=BINARY_AI Ihre Reihenfolge und Vergleiche akzent- und case-unabhängig macht.