rapporto di cenere Oracle
-
16-10-2019 - |
Domanda
Di recente, mi è stato consegnato un rapporto cenere da DBA .
Per me questo rapporto è come francese. Non ho idea di cosa si tratta e che cosa tutto è scritto in questa relazione. Qualcuno può per favore mi guida nella lettura e mi spiegare quello che tutte le misure dovrei prendere per rendere la mia scuderia query e meno consumo di CPU. Inoltre, quale interrogazione sta prendendo più di CPU.
1. Si prega di raccomandare che cosa devo eseguire azioni.
2. Quale domanda sta consumando più del mio CPU e cosa devo fare per migliorarlo.
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.