Ogni query SQL inviata a un server deve passare attraverso tre (quattro – in caso di SELEZIONE) fasi. Prima di tutto, Oracle cercherà un hash SQL corrispondente nella cache della libreria. Se l’hash viene trovato, recupererà semplicemente il piano di spiegazione associato e lo eseguirà. In caso contrario, viene invocato un hard parse – > che significa che i seguenti passaggi devono essere eseguiti.
- ANALISI
- controllo della sintassi
- semantica di controllo
- privilegi di controllo
- BIND
- sostituire bind/host variabili con i valori effettivi
- EXEC
- effettiva esecuzione sulla base di un piano di spiegare
- FETCH (SELEZIONARE solo istruzioni)
- restituisce un set di risultati di un utente
mi spiego ogni fase nel seguente esempio.
Hai eseguito questa query:
SELECT *FROM employee;
Il processo del server genererà un hash per la query SQL problemi. L’hash è un valore esadecimale generato in base al testo della query SQL. Ecco che arriva la parte molto importante!! Anche il minimo cambiamento (maiuscolo/minuscolo e viceversa; aggiunta / rimozione di uno spazio; …) cambierà l’hash e quindi potrebbe generare un’analisi difficile (più sull’analisi dura vs analisi morbida sotto). Devi stare molto attento e cercare di attenersi a un solo codice – ecco perché le procedure funzionano meglio (in cima a quello – usano principalmente variabili di bind che generano query identiche agli occhi di Oracle).
Si può facilmente verificare sul proprio eseguendo la query sotto:
-- first run this querySELECT * FROM dual;-- then run this one again with all uppercase lettersSELECT * FROM DUAL;-- check the sql hashes SELECT sql_id, sql_text, hash_valueFROM v$sqlWHERE 1=1AND lower(sql_text) LIKE '%select%from dual%'; sql_id | sql_text | hash_value--------------------------------------------------0x735fvggtnu6 | SELECT * FROM DUAL | 37411111103vyt9wdmca69b | SELECT * FROM dual | 1724193067-- As you can see Oracle evaluated it as two different queries.
Una volta generato l’hash, Oracle controlla se questa query è già stata eseguita in questa istanza. Come? Controllando se l’hash esiste già nell’area SQL.
Supponendo che questa query non sia ancora disponibile, verrà creata un’area SQL con il valore hash per questa query e l’Oracle avvierà la prima fase dell’elaborazione delle query e cioè l’ANALISI.
- Durante il controllo della sintassi Oracle controllerà la query se è sintatticamente corretta (SELECT invece di SELECT; l’ordine corretto dei comandi- > SELECT * FROM table ORDER BY col1 WHERE col2 = ‘John’; etc).
- Il passo successivo è semantica controlla dove Oracle verifica se i nomi delle colonne e nomi di oggetti sono corretti. Come? Verificandoli con Data Dictionary Cache
- Nell’ultimo passaggio della fase di ANALISI, Oracle verifica se l’utente/applicazione dispone delle autorizzazioni corrette per accedere agli oggetti interrogati.
Una volta terminato, l’area SQL è valida e un altro strumento in Oracle chiamato OPTIMIZER genererà un piano di esecuzione, il che significa che l’OTTIMIZZATORE deciderà come verrà eseguita la query. Dopo aver selezionato il piano di esecuzione ottimale, Oracle associa tutte le variabili e procede al terzo passaggio: Esecuzione.
Cosa succederà qui? Oracle leggerà i blocchi di dati relativi agli oggetti interrogati e li porterà nella cache del buffer (se non sono ancora stati presentati. Se sono lì, Oracle non li leggerà di nuovo!). Questo processo genererà I / O (che, come ho detto nell’articolo Architettura di calcolo, è molto lento rispetto alla lettura dalla memoria). Mi fermerò qui per un po ‘ e sottolineare la generazione di I/O. Nel caso di soft parse, tutti i dati vengono letti dalla memoria (buffer cache) che è molto più veloce di leggerli da un disco. Ecco perché devi sforzarti di riciclare/riutilizzare le tue domande il più possibile. Ogni modifica di una query genererà un nuovo hash e quindi molto probabilmente genererà I/O. Tutto questo è ancora gestito dal processo del server.
Ora, che i dati sono già nella memoria (buffer cache) viene elaborata l’istruzione SELECT e viene attivata la fase finale (FETCH) e il set di risultati viene restituito all’utente.
Se la stessa query viene eseguita di nuovo, l’hash viene generato e poiché l’area SQL per quell’hash esiste già, la fase di ANALISI viene saltata e vengono eseguiti solo EXEC e FETCH.