È stato utile?

Soluzione

inizierò col dire che un DBA Oracle dovrebbe sapere quale fosse il problema, cercando in rapporti di cenere e AWR. Senza report AWR è difficile sapere qual è il vero problema è qui. Tuttavia, io ti aiuterò con la prima query.

La query principale negli spettacoli Top SQL with Top Row Sources la query con l'sql_id di 8t441yd5bwygd esegue una scansione di tabella. È possibile visualizzare il testo della query nella sezione Complete List Of SQL Text.

Il problema principale è che c'è una clausola LIKE nella query, che utilizza anche la funzione lower() per convertire i dati della colonna in minuscolo, che viene poi confrontato con il :1 variabile di legatura, che è il valore passato nella query dall'applicazione.

Taglia verso il basso:

select * from PERSON_CARD where lower(PERSON_ID) like :1;

Per rispondere alla domanda correttamente abbiamo davvero bisogno di ulteriori informazioni per quanto riguarda i tipi di dati delle colonne coinvolte e possibili valori che possono essere passati nella clausola WHERE con l'applicazione, ma ci sono alcune possibilità.

La mia preoccupazione è che questo SQL (e, probabilmente, la progettazione dello schema) è generato da Hibernate, e che person_id è una stringa esadecimale UDID lunga piuttosto che un intero.

1) I dati nella colonna person_id è una stringa non Numero:

Se (e solo se) il valore di ingresso 1 contiene un solo carattere jolly alla fine della stringa (es: LIKE "foo%") è possibile creare un indice funzionale sulla colonna person_id:

create index person_card_pid_idx on person_card(lower(person_id));

Questo farà sì che un indice gamma di scansione, piuttosto che una scansione di tabella (spero!).

2) I dati nella colonna person_id è in realtà un numero intero che corrisponde esattamente al valore passato come: 1

2 possibilità qui. Se person_id non è già indicizzato nel database, aggiungere un indice. Se è già indicizzato, ottenere gli sviluppatori di modificare l'applicazione per utilizzare PERSON_ID=:1 invece di LIKE con una chiamata LOWER ().

3) I dati nella colonna person_id è una stringa non numero e il valore di 1 abbinamento contiene wildcard '%' all'inizio della stringa

Dovrete usare Oracle indici di testo.

scroll top