query_hint (Transact-SQL)

Data aggiornamento: 15 settembre 2007

Specifica che l'hint per la query indicato deve essere utilizzato in tutta la query. L'hint per la query influisce su tutti gli operatori dell'istruzione. Se la query principale include l'operatore UNION, la clausola OPTION può essere specificata solo nell'ultima query che prevede un'operazione di tipo UNION. Gli hint per la query vengono specificati come parte della clausola OPTION. Se in seguito alla presenza di uno o più hint per la query Query Optimizer non genera un piano valido, viene generato l'errore 8622.

ms181714.note(it-it,SQL.90).gifImportante:
Poiché Query Optimizer di SQL Server 2005 in genere seleziona il piano di esecuzione migliore per una query, gli hint, compreso <query_hint>, devono essere utilizzati solo se strettamente necessario e sempre da sviluppatori e amministratori di database esperti.

Si applica a:

DELETE

INSERT

SELECT

UPDATE

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

<query_hint > ::= 
{ { HASH | ORDER } GROUP 
  | { CONCAT | HASH | MERGE } UNION 
  | { LOOP | MERGE | HASH } JOIN 
  | FAST number_rows 
  | FORCE ORDER 
  | MAXDOP number_of_processors 
  | OPTIMIZE FOR ( @variable_name = literal_constant [ , ...n ] ) 
  | PARAMETERIZATION { SIMPLE | FORCED }
  | RECOMPILE
  | ROBUST PLAN 
  | KEEP PLAN 
  | KEEPFIXED PLAN
  | EXPAND VIEWS 
  | MAXRECURSION number 
  | USE PLAN N'xml_plan'
} 

Argomenti

  • { HASH | ORDER } GROUP
    Specifica che nelle funzioni di aggregazione elencate nella clausola GROUP BY, DISTINCT o COMPUTE della query devono essere utilizzate operazioni di hashing o di ordinamento.
  • { MERGE |HASH |CONCAT } UNION
    Specifica che per eseguire tutte le operazioni UNION vengono eseguite operazioni di merge, hashing o concatenamento dei set UNION. Se viene specificato più di un hint UNION, Query Optimizer seleziona la strategia meno onerosa tra gli hint specificati.

    [!NOTA] Se nella clausola FROM viene specificato un <joint_hint> anche per una coppia di tabelle unite in join, tale <join_hint> risulta prioritario rispetto a quelli specificati nella clausola OPTION.

  • { LOOP | MERGE | HASH } JOIN
    Specifica che tutte le operazioni JOIN vengono eseguite da LOOP JOIN, MERGE JOIN o HASH JOIN nell'intera query. Se vengono specificati più hint di join, Query Optimizer seleziona la strategia di join meno onerosa per i join consentiti.

    Se nella stessa query un hint di join viene specificato anche per una particolare coppia di tabelle, tale hint risulta prioritario rispetto all'unione in join delle due tabelle. Gli hint per la query devono essere comunque rispettati. L'hint di join della coppia di tabelle pertanto consente di limitare solo la selezione dei metodi di join consentiti nell'hint per la query. Per ulteriori informazioni, vedere Hint (Transact-SQL).

  • FAST number_rows
    Specifica che la query è ottimizzata per il recupero rapido delle prime righe specificate in number_rows. (numero intero non negativo). Dopo la restituzione del numero di righe definito da number_rows, l'esecuzione della query continua e viene generato il set di risultati completo.
  • FORCE ORDER
    Specifica che l'ordine di join indicato dalla sintassi della query viene conservato durante l'ottimizzazione della query.

    [!NOTA] L'utilizzo dell'hint FORCE ORDER non ha alcun effetto sulla possibile inversione dei ruoli in Query Optimizer. Per ulteriori informazioni, vedere Informazioni sugli hash join.

    Per ulteriori informazioni su come Query Optimizer di SQL Server applica l'hint FORCE ORDER quando una query include una vista, vedere Risoluzione delle viste.

  • MAXDOP number
    Prioritario rispetto all'opzione di configurazione max degree of parallelism della stored procedure sp_configure, ma per la query che specifica tale opzione. L' hint per la query di MAXDOP può superare il valore configurato con sp_configure. Quando si utilizza l'hint per la query MAXDOP sono valide tutte le regole semantiche utilizzate con l'opzione di configurazione max degree of parallelism. Per ulteriori informazioni, vedere Opzione max degree of parallelism.
  • @variable_name
    Nome di una variabile locale utilizzata in una query alla quale è possibile assegnare un valore da utilizzare con l'hint per la query OPTIMIZE FOR.
  • literal_constant
    Valore letterale costante da assegnare a @variable_name per l'utilizzo con l'hint per la query OPTIMIZE FOR. literal_constant viene utilizzato solo durante l'ottimizzazione della query e non come valore di @variable_name durante l'esecuzione della query stessa. literal_constant può essere di un tipo di dati di sistema qualsiasi di SQL Server che possa essere espresso come costante letterale. Il tipo di dati di literal_constant deve supportare la conversione implicita nel tipo di dati a cui @variable_name fa riferimento nella query.
  • ,…n
    Indica che a più nomi @variable_name è possibile assegnare un valore literal_constant da utilizzare assieme all'hint per la query OPTIMIZE FOR.
  • PARAMETERIZATION { SIMPLE | FORCED }
    Specifica le regole di parametrizzazione applicate da Query Optimizer di SQL Server alla query durante la compilazione di questa.

    ms181714.note(it-it,SQL.90).gifImportante:
    L'hint per la query PARAMETERIZATION può essere specificata solo all'interno di una guida di piano e non direttamente all'interno di una query.

    SIMPLE specifica l'utilizzo della Parametrizzazione semplice. FORCED specifica l'utilizzo della Parametrizzazione forzata. L'hint per la query PARAMETERIZATION viene utilizzato per sostituire l'impostazione corrente dell'opzione SET dell'hint di database PARAMETERIZATION all'interno di una guida di piano. Per ulteriori informazioni, vedere Definizione delle funzionalità di parametrizzazione delle query tramite guide di piano.

  • RECOMPILE
    Imposta il Motore di database di SQL Server 2005 in modo che elimini il piano generato dalla query in seguito alla sua esecuzione e obbliga Query Optimizer a ricompilare il piano di query alla successiva esecuzione della stessa query. Se RECOMPILE viene omesso, il Motore di database inserisce i piani di query nella cache e li riutilizza. Durante la compilazione dei piani di query, l'hint per la query RECOMPILE utilizza i valori correnti delle variabili locali incluse nella query e, se la query è contenuta in una stored procedure, i valori correnti vengono passati ai parametri.

    RECOMPILE rappresenta una valida alternativa alla creazione di una stored procedure che utilizza la clausola WITH RECOMPILE quando è necessario ricompilare solo un subset di query all'interno della stored procedure, anziché l'intera stored procedure. Per ulteriori informazioni, vedere Ricompilazione di stored procedure. RECOMPILE risulta utile anche durante la creazione delle guide di piano. Per ulteriori informazioni, vedere Ottimizzazione delle query nelle applicazioni distribuite tramite le guide di piano.

  • ROBUST PLAN
    Impone in Query Optimizer l'applicazione di un piano che funziona anche con dimensioni di riga massime, eventualmente a scapito delle prestazioni. Quando la query viene elaborata, è possibile che tabelle e operatori intermedi debbano archiviare ed elaborare righe con dimensioni maggiori rispetto a qualsiasi riga di input. Talvolta le righe possono essere talmente estese che l'operatore specificato non è in grado di elaborarle. In questi casi il Motore di database genera un errore durante l'esecuzione della query. Grazie alla clausola ROBUST PLAN i piani di query in cui potrebbe verificarsi questo problema vengono ignorati da Query Optimizer.

    Se non è possibile implementare tale piano, viene restituito un errore anziché posticipare il rilevamento dell'errore fino all'esecuzione della query. Le righe possono includere colonne di lunghezza variabile. Nel Motore di database è consentito definire righe con dimensioni massime superiori alla capacità di elaborazione del Motore di database. In un'applicazione tuttavia vengono in genere archiviate righe le cui dimensioni effettive rientrano nei limiti delle capacità di elaborazione del Motore di database. Se nel Motore di database viene rilevata una riga di lunghezza eccessiva, viene restituito un errore di esecuzione.

  • KEEP PLAN
    Impone in Query Optimizer l'impostazione di una soglia di ricompilazione stimata meno restrittiva per le query. La soglia di ricompilazione stimata è il punto fino a cui una query viene automaticamente ricompilata quando in una tabella è stato apportato il numero stabilito di modifiche a livello di colonne indicizzate mediante l'esecuzione delle istruzioni UPDATE, DELETE o INSERT. Specificando KEEP PLAN è possibile assicurarsi che una query non venga ricompilata troppo frequentemente in caso di aggiornamenti multipli di una tabella.
  • KEEPFIXED PLAN
    Impedisce a Query Optimizer di ricompilare una query in seguito a modifiche alle statistiche. Se si specifica KEEPFIXED PLAN, una query viene ricompilata solo se lo schema delle tabelle sottostanti viene modificato oppure se in tali tabelle si esegue sp_recompile.
  • EXPAND VIEWS
    Specifica che le viste indicizzate vengono espanse e che in Query Optimizer non viene presa in considerazione alcuna vista indicizzata per la sostituzione di una parte della query. Una vista viene espansa quando il nome della vista viene sostituito dalla definizione di tale vista nel testo della query.

    Con questo hint per la query viene praticamente disabilitato l'utilizzo diretto di viste indicizzate e indici di viste indicizzate nel piano di query.

    La vista indicizzata non viene espansa solo se nella sezione SELECT della query viene fatto riferimento diretto alla vista e se viene specificato l'hint WITH (NOEXPAND) o WITH (NOEXPAND, INDEX( index_val [ ,...n ] ) ). Per ulteriori informazioni sull'hint per la query WITH (NOEXPAND), vedere FROM (Transact-SQL).

    L'hint influisce solo sulle viste nella sezione SELECT delle istruzioni, comprese le sezioni delle istruzioni INSERT, UPDATE e DELETE.

  • MAXRECURSION number
    Specifica il numero massimo di ricorsioni consentite per la query corrente. number è un numero intero non negativo compreso tra 0 e 32767. Se è specificato 0, non viene applicato alcun limite. Se questa opzione viene omessa, il limite predefinito per il server è 100.

    Se durante l'esecuzione della query viene raggiunto il valore specificato o predefinito per il limite MAXRECURSION, la query viene terminata e viene restituito un errore.

    A causa di questo errore, verrà eseguito il rollback di tutti gli effetti dell'istruzione. Se l'istruzione è un'istruzione SELECT, è possibile che vengano restituiti risultati parziali oppure nessun risultato. È possibile che eventuali risultati parziali non includano tutte le righe nei livelli di ricorsione che superano il livello di ricorsione massimo specificato.

    Per ulteriori informazioni, vedere WITH common_table_expression (Transact-SQL).

  • USE PLAN N**'xml_plan'**
    Impone in Query Optimizer l'utilizzo di un piano di query esistente per una query specificata da 'xml_plan'. Per ulteriori informazioni, vedere Definizione dei piani di query tramite l'utilizzo forzato. USE PLAN non può essere specificato nelle istruzioni INSERT, UPDATE o DELETE.

Osservazioni

Gli hint per la query non possono essere specificati in un'istruzione INSERT, eccetto quando una clausola SELECT viene utilizzata all'interno dell'istruzione.

È possibile specificare gli hint per la query solo nella query di livello principale e non nelle subquery.

Esempi

A. Utilizzo di MERGE JOIN

Nell'esempio seguente viene specificato che l'operazione JOIN nella query viene eseguita da MERGE JOIN.

USE AdventureWorks;
GO
SELECT * 
FROM Sales.Customer AS c
INNER JOIN Sales.CustomerAddress AS ca
ON c.CustomerID = ca.CustomerID
WHERE TerritoryID = 5
OPTION (MERGE JOIN);
GO

B. Utilizzo di OPTIMIZE FOR

Nell'esempio seguente Query Optimizer viene impostato in modo da utilizzare il valore 'Seattle' per la variabile locale @city_name durante l'ottimizzazione della query.

DECLARE @city_name nvarchar(30)
SET @city_name = 'Ascheim'
SELECT * FROM Person.Address
WHERE City = @city_name
OPTION ( OPTIMIZE FOR (@city_name = 'Seattle') );
GO

C. Utilizzo di MAXRECURSION

È possibile utilizzare MAXRECURSION per evitare che un'espressione di tabella comune (CTE) ricorsiva non corretta provochi un ciclo infinito. Nell'esempio seguente viene creato intenzionalmente un ciclo infinito e viene utilizzato l'hint MAXRECURSION per limitare a due il numero di livelli di ricorsione.

USE AdventureWorks;
GO
--Creates an infinite loop
WITH cte (EmployeeID, ManagerID, Title) as
(
    SELECT EmployeeID, ManagerID, Title
    FROM HumanResources.Employee
    WHERE ManagerID IS NOT NULL
  UNION ALL
    SELECT cte.EmployeeID, cte.ManagerID, cte.Title
    FROM cte 
    JOIN  HumanResources.Employee AS e 
        ON cte.ManagerID = e.EmployeeID
)
--Uses MAXRECURSION to limit the recursive levels to 2
SELECT EmployeeID, ManagerID, Title
FROM cte
OPTION (MAXRECURSION 2);
GO

Dopo la correzione dell'errore del codice, l'hint MAXRECURSION non è più necessario.

D. Utilizzo di UNION

Nell'esempio seguente viene utilizzato l'hint per la query MERGE UNION.

USE AdventureWorks ;
GO
SELECT *
FROM HumanResources.Employee e1
UNION
SELECT *
FROM HumanResources.Employee e2
OPTION (MERGE UNION) ;
GO

E. Utilizzo di HASH GROUP e FAST

Nell'esempio seguente vengono utilizzati gli hint per la query HASH GROUP e FAST.

USE AdventureWorks ;
GO
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (HASH GROUP, FAST 10) ;
GO

F. Utilizzo di MAXDOP

Nell'esempio seguente viene utilizzato l'hint per la query MAXDOP.

USE AdventureWorks ;
GO
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (MAXDOP 2);
GO

Vedere anche

Riferimento

Hint (Transact-SQL)

Guida in linea e informazioni

Assistenza su SQL Server 2005

Cronologia modifiche

Versione Cronologia

15 settembre 2007

Contenuto modificato:
  • L' hint per la query di MAXDOP non ha nessun effetto quando supera il valore configurato con sp_configure.

17 luglio 2006

Nuovo contenuto:
  • Aggiunta degli esempi da C a F.