Condividi tramite


Elaborazione di istruzioni SQL

L'elaborazione di una singola istruzione SQL rappresenta la modalità più semplice di esecuzione delle istruzioni SQL in SQL Server. Per illustrare il processo di base, viene utilizzata la procedura di elaborazione di una singola istruzione SELECT che fa riferimento esclusivamente a tabelle di base locali, non a viste o tabelle remote.

Ottimizzazione delle istruzioni SELECT

Un'istruzione SELECT non definisce esattamente la procedura da eseguire nel server database per recuperare i dati richiesti. Il server database deve pertanto analizzare l'istruzione per determinare il metodo più efficace per l'estrazione dei dati. Tale procedura, denominata ottimizzazione dell'istruzione SELECT, viene eseguita dal componente Query Optimizer. I dati di input per Query Optimizer sono costituiti dalla query, dallo schema del database (definizioni di tabella e indice) e dalle statistiche del database. L'output di Query Optimizer è un piano di esecuzione della query, talvolta definito piano di query o semplicemente piano. La descrizione dettagliata del contenuto di un piano di query è riportata più avanti in questo argomento.

I dati di input e di output di Query Optimizer durante l'ottimizzazione di una singola istruzione SELECT sono illustrati nel diagramma seguente:

Ottimizzazione di query di un'istruzione SELECT

Un'istruzione SELECT definisce soltanto gli elementi seguenti:

  • Il formato del set di risultati. Questo elemento viene nella maggior parte dei casi specificato nell'elenco di selezione. Altre clausole, ad esempio ORDER BY e GROUP BY, possono tuttavia influire sul formato finale del set di risultati.

  • Le tabelle che contengono i dati di origine. Questo elemento viene specificato nella clausola FROM.

  • La relazione logica tra le tabelle ai fini dell'istruzione SELECT. Questo elemento viene definito nelle specifiche di join, incluse nella clausola WHERE oppure in una clausola ON che segue una clausola FROM.

  • Condizioni che le righe delle tabelle di origine devono soddisfare per essere incluse nel risultato dell'istruzione SELECT. Queste condizioni vengono specificate nelle clausole WHERE e HAVING.

Il piano di esecuzione di una query è costituito dalla definizione degli elementi seguenti:

  • La sequenza di accesso alle tabelle di origine.

    In genere il server database può utilizzare molte sequenze diverse per accedere alle tabelle di base e quindi compilare il set di risultati. Ad esempio, se l'istruzione SELECT fa riferimento a tre tabelle, il server database può accedere innanzitutto a TableA, utilizzare i dati di TableA per estrarre le righe corrispondenti da TableB, quindi utilizzare i dati di TableB per estrarre i dati da TableC. Di seguito vengono indicate le altre sequenze di accesso alle tabelle utilizzabili dal server database:

    TableC, TableB, TableA oppure

    TableB, TableA, TableC oppure

    TableB, TableC, TableA oppure

    TableC, TableA, TableB

  • I metodi utilizzati per estrarre i dati da ogni tabella.

    Per accedere ai dati di ogni tabella sono in genere disponibili metodi diversi. Se sono necessarie solo alcune righe con valori di chiave specifici, il server database può utilizzare un indice. Se sono necessarie tutte le righe della tabella, il server database può ignorare gli indici ed eseguire un'analisi di tabella. Se sono necessarie tutte le righe di una tabella, ma l'indice contiene colonne chiave incluse in una clausola ORDER BY, è consigliabile eseguire l'analisi dell'indice anziché della tabella per evitare che il set di risultati venga ordinato separatamente. Se una tabella è di dimensioni molto ridotte, l'analisi della tabella può rappresentare il metodo più efficiente per quasi tutti gli accessi alla tabella.

Il processo di scelta di un piano di esecuzione è denominato ottimizzazione. Query Optimizer è uno dei principali componenti di un sistema di database SQL. L'overhead generato dall'utilizzo di Query Optimizer per l'analisi della query e la scelta di un piano è ampiamente compensato dall'efficienza del piano di esecuzione scelto. Si supponga, ad esempio, che il progetto di costruzione di una casa venga assegnato a due imprese edili diverse. Se un'impresa dedica alcuni giorni alla pianificazione della costruzione della casa e l'altra impresa inizia immediatamente la costruzione senza alcuna pianificazione, è molto probabile che l'impresa che ha pianificato il progetto termini la costruzione per prima.

Query Optimizer di SQL Server è un ottimizzatore basato sui costi. A ogni piano di esecuzione possibile corrisponde un costo in termini di quantità di risorse del computer utilizzate. Query Optimizer analizza i piani possibili e sceglie il piano con il costo stimato minore. Per alcune istruzioni SELECT complesse i piani di esecuzione possibili sono migliaia. In questi casi, Query Optimizer non analizza tutte le combinazioni possibili, ma utilizza algoritmi complessi per individuare rapidamente un piano di esecuzione il cui costo si avvicini il più possibile al costo minimo teorico.

Query Optimizer di SQL Server non sceglie esclusivamente il piano di esecuzione con il costo minore in termini di risorse, ma individua il piano che restituisce più rapidamente i risultati all'utente con un costo ragionevole in termini di risorse. Ad esempio, l'esecuzione parallela di una query in genere utilizza una quantità di risorse maggiore rispetto all'esecuzione seriale, ma consente di completare la query più rapidamente. Query Optimizer di SQL Server utilizzerà un piano di esecuzione parallela per restituire i risultati, a condizione che tale piano non aumenti il carico sul server.

Per la stima dei costi in termini di risorse relativi ai diversi metodi di estrazione delle informazioni da una tabella o da un indice, Query Optimizer utilizza le statistiche di distribuzione. Le statistiche di distribuzione vengono registrate per le colonne e gli indici e indicano la selettività dei valori di un indice o di una colonna. Ad esempio, in una tabella che rappresenta automobili, molte automobili vengono prodotte dallo stesso costruttore, ma a ciascuna è assegnato un numero di identificazione univoco. L'indice dei numeri di identificazione dei veicoli è quindi più selettivo rispetto all'indice dei produttori. Se le statistiche dell'indice non sono aggiornate, è possibile che Query Optimizer non scelga la soluzione migliore per lo stato corrente della tabella. Per ulteriori informazioni sull'aggiornamento delle statistiche dell'indice, vedere Utilizzo di statistiche per migliorare le prestazioni di esecuzione delle query.

Query Optimizer è un componente importante perché consente al server database di adattarsi in modo dinamico alle condizioni variabili del database senza fare ricorso all'intervento di un programmatore o di un amministratore di database. In questo modo i programmatori possono concentrarsi sulla descrizione del risultato finale della query. A ogni esecuzione dell'istruzione, Query Optimizer compila un piano di esecuzione efficace per lo stato corrente del database.

Elaborazione di un'istruzione SELECT

Di seguito viene illustrata la procedura di base necessaria per elaborare una singola istruzione SELECT in SQL Server:

  1. Il parser esegue l'analisi dell'istruzione SELECT e la suddivide in unità logiche, quali parole chiave, espressioni, operatori e identificatori.

  2. Viene compilato un albero della query, talvolta denominata sequenza logica, che descrive i passaggi logici necessari per convertire i dati di origine nel formato necessario per il set di risultati.

  3. Query Optimizer analizza le diverse modalità di accesso alle tabelle di origine e seleziona le serie di passaggi che restituiscono i risultati con maggior rapidità e con minor impiego di risorse. L'albero della query viene aggiornato in modo da registrare la serie esatta di passaggi. La versione finale ottimizzata dell'albero della query è denominato piano di esecuzione.

  4. Il motore relazionale avvia l'esecuzione del piano di esecuzione. Man mano che vengono elaborati i passaggi che richiedono i dati delle tabelle di base, il motore relazionale richiede al motore di archiviazione di passare i dati dei set di righe richiesti dal motore relazionale stesso.

  5. Il motore relazionale elabora i dati restituiti dal motore di archiviazione nel formato definito per il set di risultati e restituisce il set di risultati al client.

Elaborazione di altre istruzioni

La procedura di base descritta per l'elaborazione di un'istruzione SELECT è valida anche per altre istruzioni SQL, ad esempio INSERT, UPDATE e DELETE. Le istruzioni UPDATE e DELETE devono definire il set di righe da modificare o eliminare utilizzando un processo di identificazione delle righe corrispondente a quello che consente di identificare le righe di origine che formano il set di risultati di un'istruzione SELECT. Le istruzioni UPDATE e INSERT possono includere istruzioni SELECT incorporate che forniscono i valori dei dati da aggiornare o da inserire.

Anche le istruzioni DDL (Data Definition Language), quali CREATE PROCEDURE o ALTER TABLE, vengono risolte in una serie di operazioni relazionali eseguite sulle tabelle del catalogo di sistema e in alcuni casi, ad esempio con ALTER TABLE ADD COLUMN, sulle tabelle di dati.