Parametrizzazione semplice
In SQL Server l'utilizzo di parametri o di marcatori di parametro nelle istruzioni Transact-SQL consente di aumentare la capacità del motore relazionale di trovare una corrispondenza tra le nuove istruzioni SQL e i piani di esecuzione esistenti compilati in precedenza.
Nota sulla protezione |
---|
L'utilizzo di parametri o indicatori di parametro per includere i valori digitati dagli utenti finali offre una protezione maggiore rispetto al concatenamento dei valori in una stringa eseguita utilizzando un metodo API di accesso ai dati, l'istruzione EXECUTE o la stored procedure sp_executesql. |
Se un'istruzione SQL viene eseguita senza parametri, in SQL Server l'istruzione viene parametrizzata internamente per aumentare la possibilità di trovare una corrispondenza con un piano di esecuzione esistente. Questo processo viene definito parametrizzazione semplice. In SQL Server 2000 il processo è definito parametrizzazione automatica.
Si consideri l'istruzione seguente:
SELECT * FROM AdventureWorks.Production.Product
WHERE ProductSubcategoryID = 1;
Il valore 1 alla fine dell'istruzione può essere specificato come parametro. Tramite il motore relazionale viene creato il piano di esecuzione per questo batch come se fosse stato specificato un parametro al posto del valore 1. Grazie a questa semplice parametrizzazione, in SQL Server viene riconosciuto che le due istruzioni seguenti generano essenzialmente lo stesso piano di esecuzione e il primo piano viene riutilizzato per la seconda istruzione:
SELECT * FROM AdventureWorks.Production.Product
WHERE ProductSubcategoryID = 1;
SELECT * FROM AdventureWorks.Production.Product
WHERE ProductSubcategoryID = 4;
Durante l'elaborazione di istruzioni SQL complesse, è possibile che il motore relazionale incontri difficoltà nel determinare le espressioni che è possibile parametrizzare. Per aumentare la capacità del motore relazionale di trovare una corrispondenza tra istruzioni SQL complesse e piani di esecuzione esistenti e inutilizzati, è necessario specificare esplicitamente i parametri utilizzando la stored procedure sp_executesql o gli indicatori di parametro. Per ulteriori informazioni, vedere Parametri e riutilizzo del piano di esecuzione.
[!NOTA]
Quando vengono utilizzati gli operatori aritmetici +, -, *, / o % per eseguire una conversione implicita o esplicita di valori costanti int, smallint, tinyint o bigint in tipi di dati float, real, decimal o numeric, in SQL Server vengono applicate regole specifiche per calcolare il tipo e la precisione dei risultati dell'espressione. Queste regole, tuttavia, variano in base al fatto che la query includa o meno parametri. Espressioni simili nelle query possono pertanto in alcuni casi generare risultati diversi. Per ulteriori informazioni, vedere int, bigint, smallint e tinyint (Transact-SQL).
In base al comportamento predefinito della parametrizzazione semplice, in SQL Server viene parametrizzato un numero relativamente piccolo di query. È tuttavia possibile fare in modo che tutte le query in un database vengano parametrizzate, rispettando determinate limitazioni, impostando l'opzione PARAMETERIZATION del comando ALTER DATABASE su FORCED. In questo modo, è possibile migliorare le prestazioni dei database in cui viene eseguito un numero elevato di query simultanee riducendo la frequenza di compilazione delle query. Per ulteriori informazioni, vedere Parametrizzazione forzata.
In alternativa, è possibile specificare la parametrizzazione di una singola query e di tutte le altre con sintassi equivalente ma che differiscono solo per i valori dei parametri. Per ulteriori informazioni, vedere Definizione delle funzionalità di parametrizzazione delle query tramite guide di piano.