Ottimizzazione delle Query (Parte II)
Pagina 2 di 3
Ottimizzazione della query
Lo scopo del processo di ottimizzazione della query e' produrre un "piano di esecuzione" il piu' possibile efficiente, basandosi su quanto e' specificato dall'albero della query.
Un "ottimizzatore" teoricamente puo' produrre un piano di esecuzione "ottimale" per ogni query, in realta' questo finira' per produrre un piano solamente accettabile per la maggioranza delle query. Questo perche' il numero di combinazioni possibili in una Join aumenta geometricamente e nello stesso modo aumenta la complessita' della query.
Senza l'utilizzo di tecniche di "pruning" o altri metodi euristici per limitare il numero di combinazioni valutate, il tempo richiesto per ottenere una reale ottimizzazione della query risulta assolutamente inaccettabile. In molti casi l'ottimizzatore sceglie una query meno efficiente (o totalmente inefficiente) perche' la selezione di una query piu' efficiente richiede piu' tempo che l'esecuzione della query inefficiente.
I vari database utilizzano di solito differenti tecniche di ottimizzazione per ottenere una certa efficienza nel piano di esecuzione.
Ottimizzazione euristica
Questo e' un meccanismo basato su regole specifiche per
produrre un piano di esecuzione efficiente. Dato che la query
ricevuta e' una struttura definita, ogni nodo
dell'albero viene mappato direttamente in una espressione
algebrica-relazionale. La funzione euristica e' quindi
applicata per ridurre l'espressione ai suoi termini di
base, ottenendo quindi una rappresentazione piu'
efficiente.
Utilizzando un'espressione algebrica si assicura anche che nessuna delle necessarie informazioni richieste per esaminare i dati verra' persa durante il processo.
Ottimizzazione sintattica
Questo tipo di ottimizzazione si appoggia pesantemente sulla
comprensione dell'utente sia del database sottostante,
sia della distribuzione dei dati tra le varie tabelle. In
soldoni, si fa' affidamento sul fatto che l'utente ha
gia' fatto delle scelte in base alle proprie conoscenze.
L'ottimizzatore cerca di migliorare l'efficienza
della query scegliendo gli indici appositi tra quelli
disponibili per ogni singola tabella.
Questo tipo di ottimizzazione e' estremamente efficiente quando si accede a dati in un'ambiente sostanzialmente statico e quando l'utente sa quello che sta' facendo. Ovviamente, se il database ed i suoi contenuti cambiano in maniera molto varia o se l'utente non sa esattamente cosa richiedere (la query non e' gia' ottimizzata di suo), i risultati possono essere pessimi.
Ottimizzazione "Cost-Based"
Per eseguire questo tipo di ottimizzazione,
l'ottimizzatore richiede informazioni specifiche relative
alle informazioni del database stesso. Queste informazioni
sono strettamente dipendenti dal sistema e possono includere
cose come la dimensione dei files, la struttura degli stessi,
la disponibilita' di indici, la percentuale di record da
recuperare da ogni tabella etc. etc.
Dato che lo scopo di ogni ottimizzazione e' quello di ridurre al minimo il numero di record estratti ed il tempo di estrazione, l'ottimizzazione cost-based utilizza le informazioni sulla struttura del database e la distribuzione dei dati per assegnare un "costo" stimato, in termini di tempo e numero di record da estrarre da ogni tabella, numero di accessi etc. per ogni operazione.
Valutando la somma totale di questi "costi" e' possibile selezionare la sequenza piu' efficiente di estrazione dei dati.
Ovviamente, i "costi" assegnati saranno piu' o meno validi a seconda delle informazioni che il sistema ha/mantiene sulla composizione delle tabelle, dei files etc. etc. Mantenere aggiornate queste informazioni occupa tempo e risorse, quindi ogni sistema memorizza un blocco di informazioni e poi lo aggiorna (ricostruendolo) di tanto in tanto. Se sul database vengono effettuate molte operazioni che coinvolgono la distruzione totale e la ricostruzione da zero di svariate tabelle, l'efficienza di questo metodo di ottimizzazione e' seriamente compromessa.
Ottimizzazione semantica
Questo tipo di ottimizzazione non e' ancora entrata nel
novero delle ottimizzazioni "standard" , ma e'
oggetto di ricerche. Questo metodo si basa sulla conoscenza
della struttura del sottostante database per ignorare o
eliminare parti della query che non ritornerebbero risultato
o non ritornerebbero risultati utili.
Selezione degli indici
Per ottimizzare una query, la maggior parte degli ottimizzatori verifica se nel database sono presenti degli indici utili per migliorare l'efficienza di accesso ai dati. Un indice e' considerato "utile" solo se inizia con le stesse colonne (campi) che sono contenute nella query. Questa deve essere una corrispondenza esatta.
Selezione delle Join
Quando gli indici sono stati scelti e tutte le clausole sono state associate ad un "costo di processo" , l'ottimizzatore esegue la selezione delle Join. Questo e' un tentativo di scegliere il migliore ordine per combinare le varie clausole.
L'ottimizzatore confronta vari ordinamenti delle clausole, quindi seleziona quello con il minor tempo di processo stimato.
La maggior parte dei database (compreso SQL Server), utilizza una ottimizzazione cost-based. Perche' ? Perche' e' molto piu' semplice da implementare piuttosto che una Euristica.
- Articolo precedente Ottimizzazione delle Query (Parte I)
- Articolo successivo Ottimizzazione delle Query (Parte III)