sql >> Databasteknik >  >> RDS >> Oracle

Varför exekveringstiden för lagrad oracle-procedur ökar kraftigt beroende på hur den exekveras?

Försök att hämta nls-parametrar från dina olika fall (ides eller java-program) de måste vara olika

select * from NLS_SESSION_PARAMETERS

Ställ sedan in variablerna i din butiksprocedure så att de blir lika från det snabbaste fallet.

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

När du SP har alla nls parametrar. Det kommer att gå snabbt.

Jag hittade nyligen ett liknande fall i Alter session saktar ner frågan genom Hibernate. men i deras fall ändrade de parametrarna och blev sedan långsamma.

Jag undersökte och fann att parametrarna NLS_COMP och NLS_SORT kan påverka hur oracle använder exekveringsplan för sträng (när den jämför eller beställer)

När NLS_COMP definieras som LINGUISTIC kommer det att använda språket som definieras i NLS_SORT.

till exempel, om NLS_COMP =LINGUISTIC och NLS_SORT=BINARI_AI din fråga

select * from table where string_column like 'HI%'

internt kommer det att göra

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

så om du inte har ett index för NLSSORT(kolumn,'BINARI_AI') kommer det att gå väldigt långsamt.

att veta att NLS_SORT=BINARY_AI kommer att göra din beställning och jämförelser okänslig för accent och skiftläge.




  1. SQL-serverfråga för att få listan över kolumner i en tabell tillsammans med datatyper, NOT NULL och PRIMÄRNYCKEL-begränsningar

  2. Fyra vanliga myter om molnteknik

  3. Fråga efter arrayelement i JSON-typ

  4. Hur kan jag skapa en begränsning för att kontrollera om ett e-postmeddelande är giltigt i postgres?