Prestazioni SQL dinamico in ODBC
Sebbene SQL statico funzioni bene in molte situazioni, esiste una classe di applicazioni in cui l'accesso ai dati non può essere determinato in anticipo. Ad esempio, supponiamo che un foglio di calcolo consenta all'utente di inserire una query, che il foglio di calcolo invia al DBMS per recuperare i dati. Il contenuto di questa query non può essere conosciuto dal programmatore al momento della scrittura del foglio di calcolo.
Esecuzione dinamica
Per risolvere questo problema, il foglio elettronico utilizza una forma di SQL incorporato chiamato SQL dinamico. A differenza delle istruzioni SQL statiche, che sono codificate nel programma, le istruzioni SQL dinamiche possono essere costruite in fase di esecuzione e inserite in una variabile host stringa. Vengono quindi inviati al sistema DBMS per l'elaborazione. Poiché il DBMS deve generare un piano di accesso in fase di esecuzione per le istruzioni SQL dinamiche, l'SQL dinamico è generalmente più lento dell'SQL statico. Quando un programma contenente istruzioni SQL dinamiche viene compilato, le istruzioni SQL dinamiche non vengono eliminate dal programma, come nel caso dell'SQL statico. Vengono invece sostituite da una chiamata di funzione che passa l'istruzione al DBMS; le istruzioni SQL statiche nello stesso programma vengono trattate normalmente.
Il modo più semplice per eseguire un'istruzione SQL dinamica è un'istruzione EXECUTE IMMEDIATE. Questa istruzione passa l'istruzione SQL al DBMS per la compilazione e l'esecuzione.
Uno svantaggio dell'istruzione EXECUTE IMMEDIATE è che DBMS deve eseguire ogni cinque passaggi dell'elaborazione di un'istruzione SQL ogni volta che viene eseguita l'istruzione . Il sovraccarico di questo processo può essere significativo se vengono eseguite molte istruzioni in modo dinamico, ed è uno spreco se tali istruzioni sono simili.
Esecuzione preparata
Per risolvere la situazione sopra descritta, SQL dinamico offre una forma di esecuzione ottimizzata chiamata esecuzione preparata, che utilizza i seguenti passaggi:
Il programma costruisce un'istruzione SQL in un buffer, come per l'istruzione EXECUTE IMMEDIATE. Al posto delle variabili host, un punto interrogativo (?) può essere sostituito a una costante in qualsiasi punto del testo dell'istruzione, per indicare che il valore della costante sarà fornito in seguito. Il punto interrogativo viene chiamato come marcatore di parametro.
Il programma passa l'istruzione SQL al DBMS con un'istruzione PREPARE, che richiede al DBMS di analizzare, convalidare e ottimizzare l'istruzione e di generare un piano di esecuzione. Il programma utilizza quindi un'istruzione EXECUTE (non un'istruzione EXECUTE IMMEDIATE) per eseguire l'istruzione PREPARE in un momento successivo. I valori dei parametri dell'istruzione vengono passati attraverso una struttura dati speciale chiamata SQL Data Area o SQLDA.
Il programma può utilizzare l'istruzione EXECUTE più volte, fornendo valori di parametro diversi a ogni esecuzione dell'istruzione dinamica.
L'esecuzione preparata non è ancora la stessa cosa di SQL statico. In SQL statico, i primi quattro passaggi dell'elaborazione di un'istruzione SQL avvengono in fase di compilazione. Nell'esecuzione preparata, questi passaggi avvengono ancora in fase di esecuzione, ma vengono eseguiti una sola volta. L'esecuzione del piano avviene solo quando viene chiamato EXECUTE. Questo comportamento aiuta a eliminare alcuni degli svantaggi in termini di prestazioni insiti nell'architettura di SQL dinamico.