Hint (Transact-SQL) - TabellaHints (Transact-SQL) - Table

SI APPLICA A: sìSQL Server sìDatabase SQL di Azure noAzure SQL Data Warehouse noParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Gli hint di tabella consentono di modificare il comportamento predefinito di Query Optimizer per la durata dell'istruzione DML (Data Manipulation Language) specificando un metodo di blocco, uno o più indici, un'operazione di elaborazione di query, quale un'analisi di tabella (Table Scan) o una ricerca nell'indice (Index Seek), oppure altre opzioni.Table hints override the default behavior of the query optimizer for the duration of the data manipulation language (DML) statement by specifying a locking method, one or more indexes, a query-processing operation such as a table scan or index seek, or other options. Gli hint di tabella sono specificati nella clausola FROM dell'istruzione DML e influiscono solo sulla tabella o sulla vista a cui viene fatto riferimento nella clausola.Table hints are specified in the FROM clause of the DML statement and affect only the table or view referenced in that clause.

Attenzione

Poiché Query Optimizer di SQL ServerSQL Server consente in genere di selezionare il piano di esecuzione migliore per una query, gli hint devono essere usati solo se strettamente necessari ed esclusivamente da sviluppatori e amministratori di database esperti.Because the SQL ServerSQL Server query optimizer typically selects the best execution plan for a query, we recommend that hints be used only as a last resort by experienced developers and database administrators.

Si applica a:Applies to:

DELETEDELETE

INSERTINSERT

SELECTSELECT

UPDATEUPDATE

MERGEMERGE

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax

WITH  ( <table_hint> [ [, ]...n ] )  
  
<table_hint> ::=   
[ NOEXPAND ] {   
    INDEX  ( index_value [ ,...n ] )   
  | INDEX =  ( index_value )      
  | FORCESEEK [( index_value ( index_column_name  [ ,... ] ) ) ]  
  | FORCESCAN  
  | FORCESEEK  
  | HOLDLOCK   
  | NOLOCK   
  | NOWAIT  
  | PAGLOCK   
  | READCOMMITTED   
  | READCOMMITTEDLOCK   
  | READPAST   
  | READUNCOMMITTED   
  | REPEATABLEREAD   
  | ROWLOCK   
  | SERIALIZABLE   
  | SNAPSHOT   
  | SPATIAL_WINDOW_MAX_CELLS = integer  
  | TABLOCK   
  | TABLOCKX   
  | UPDLOCK   
  | XLOCK   
}   
  
<table_hint_limited> ::=  
{  
    KEEPIDENTITY   
  | KEEPDEFAULTS   
  | HOLDLOCK   
  | IGNORE_CONSTRAINTS   
  | IGNORE_TRIGGERS   
  | NOLOCK   
  | NOWAIT  
  | PAGLOCK   
  | READCOMMITTED   
  | READCOMMITTEDLOCK   
  | READPAST   
  | REPEATABLEREAD   
  | ROWLOCK   
  | SERIALIZABLE   
  | SNAPSHOT   
  | TABLOCK   
  | TABLOCKX   
  | UPDLOCK   
  | XLOCK   
}   

ArgomentiArguments

WITH ( <table_hint> ) [ [, ]...n ]WITH ( <table_hint> ) [ [, ]...n ]
Con alcune eccezioni, gli hint di tabella sono supportati nella clausola FROM solo se vengono specificati con la parola chiave WITH.With some exceptions, table hints are supported in the FROM clause only when the hints are specified with the WITH keyword. Tali hint devono inoltre essere racchiusi tra parentesi.Table hints also must be specified with parentheses.

Importante

L'omissione della parola chiave WITH è una funzionalità deprecata: Questa funzionalità è in manutenzione e potrebbe essere rimossa in una delle prossime versioni di Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.Omitting the WITH keyword is a deprecated feature: Questa funzionalità è in manutenzione e potrebbe essere rimossa in una delle prossime versioni di Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Gli hint di tabella seguenti sono supportati con e senza la parola chiave WITH: NOLOCK, READUNCOMMITTED, UPDLOCK, REPEATABLEREAD, SERIALIZABLE, READCOMMITTED, TABLOCK, TABLOCKX, PAGLOCK, ROWLOCK, NOWAIT, READPAST, XLOCK, SNAPSHOT e NOEXPAND.The following table hints are allowed with and without the WITH keyword: NOLOCK, READUNCOMMITTED, UPDLOCK, REPEATABLEREAD, SERIALIZABLE, READCOMMITTED, TABLOCK, TABLOCKX, PAGLOCK, ROWLOCK, NOWAIT, READPAST, XLOCK, SNAPSHOT, and NOEXPAND. Se vengono specificati senza la parola chiave WITH, questi hint devono essere specificati da soli.When these table hints are specified without the WITH keyword, the hints should be specified alone. Ad esempioFor example:

FROM t (TABLOCK)  

Se l'hint viene specificato con un'altra opzione, è necessario usare la parola chiave WITH:When the hint is specified with another option, the hint must be specified with the WITH keyword:

FROM t WITH (TABLOCK, INDEX(myindex))  

Si consiglia di separare gli hint di tabella tramite virgole.We recommend using commas between table hints.

Importante

L'utilizzo di spazi al posto delle virgole per separare gli hint è una funzionalità deprecata: Questa funzionalità verrà rimossa a partire da una delle prossime versioni di Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. Non usare questa funzionalità in un nuovo progetto di sviluppo e modificare non appena possibile le applicazioni in cui è attualmente implementata.Do not use this feature in new development work, and modify applications that currently use this feature as soon as possible.Separating hints by spaces rather than commas is a deprecated feature: Questa funzionalità verrà rimossa a partire da una delle prossime versioni di Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. Non usare questa funzionalità in un nuovo progetto di sviluppo e modificare non appena possibile le applicazioni in cui è attualmente implementata.Do not use this feature in new development work, and modify applications that currently use this feature as soon as possible.

NOEXPANDNOEXPAND
Specifica che qualsiasi vista indicizzata non verrà espansa per accedere alle tabelle sottostanti quando Query Optimizer elabora la query.Specifies that any indexed views are not expanded to access underlying tables when the query optimizer processes the query. In Query Optimizer la vista viene gestita come una tabella con indici cluster.The query optimizer treats the view like a table with clustered index. L'hint NOEXPAND è applicabile solo alle viste indicizzate.NOEXPAND applies only to indexed views. Per altre informazioni, vedere Utilizzo di NOEXPAND.For more information, see Using NOEXPAND.

INDEX (index_value [,... n ] ) | INDEX = ( index_value)INDEX (index_value [,... n ] ) | INDEX = ( index_value)
La sintassi INDEX() consente di specificare i nomi o gli ID di uno o più indici che devono essere usati in Query Optimizer quando viene elaborata l'istruzione.The INDEX() syntax specifies the names or IDs of one or more indexes to be used by the query optimizer when it processes the statement. La sintassi alternativa INDEX = specifica un singolo valore di indice.The alternative INDEX = syntax specifies a single index value. È possibile specificare solo un hint per l'indice per ogni tabella.Only one index hint per table can be specified.

Se esiste un indice cluster, INDEX(0) attiva un'analisi degli indici cluster, mentre INDEX(1) esegue un'analisi o una ricerca degli indici cluster.If a clustered index exists, INDEX(0) forces a clustered index scan and INDEX(1) forces a clustered index scan or seek. Se non esiste alcun indice cluster, INDEX(0) attiva un'analisi di tabella, mentre INDEX(1) viene interpretato come errore.If no clustered index exists, INDEX(0) forces a table scan and INDEX(1) is interpreted as an error.

Se in un unico elenco di hint vengono usati più indici, gli indici duplicati vengono ignorati, mentre gli altri indici vengono usati per recuperare le righe della tabella.If multiple indexes are used in a single hint list, the duplicates are ignored and the rest of the listed indexes are used to retrieve the rows of the table. L'ordine degli indici nell'hint è significativo.The order of the indexes in the index hint is significant. Un hint con più indici impone inoltre il collegamento degli indici tramite operatore AND e Query Optimizer applica il numero massimo di condizioni possibili a ogni indice a cui viene effettuato l'accesso.A multiple index hint also enforces index ANDing, and the query optimizer applies as many conditions as possible on each index accessed. Se la raccolta di indici con hint non include tutte le colonne a cui la query fa riferimento, viene eseguita un'operazione di recupero delle colonne rimanenti dopo che tutte le colonne indicizzate sono state recuperate da Motore di database di SQL ServerSQL Server Database Engine.If the collection of hinted indexes do not include all columns referenced by the query, a fetch is performed to retrieve the remaining columns after the Motore di database di SQL ServerSQL Server Database Engine retrieves all the indexed columns.

Nota

Se in una tabella dei fatti in un join a stella viene usato un hint per l'indice che fa riferimento a più indici, l'hint per l'indice viene ignorato e verrà restituito un messaggio di avviso.When an index hint referring to multiple indexes is used on the fact table in a star join, the optimizer ignores the index hint and returns a warning message. Non è inoltre consentito il collegamento degli indici tramite OR per una tabella per la quale è stato specificato un hint per l'indice.Also, index ORing is not allowed for a table with an index hint specified.

Un hint di tabella può includere al massimo 250 indici non cluster.The maximum number of indexes in the table hint is 250 nonclustered indexes.

KEEPIDENTITYKEEPIDENTITY
Applicabile solo in un'istruzione INSERT se viene usata l'opzione BULK con OPENROWSET.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

Specifica che il valore o i valori Identity presenti nel file di dati importato devono essere usati per la colonna Identity.Specifies that identity value or values in the imported data file are to be used for the identity column. Se KEEPIDENTITY viene omesso, i valori Identity per questa colonna vengono verificati ma non importati e Query Optimizer assegna automaticamente valori univoci in base ai valori di inizializzazione e di incremento specificati in fase di creazione della tabella.If KEEPIDENTITY is not specified, the identity values for this column are verified but not imported and the query optimizer automatically assigns unique values based on the seed and increment values specified during table creation.

Importante

Se il file di dati non contiene valori per la colonna Identity nella tabella o nella vista, tale colonna deve essere ignorata, a meno che non sia l'ultima colonna della tabella.If the data file does not contain values for the identity column in the table or view, and the identity column is not the last column in the table, you must skip the identity column. Per altre informazioni, vedere Usare un file di formato per escludere un campo di dati (SQL Server).For more information, see Use a Format File to Skip a Data Field (SQL Server). Se una colonna Identity viene ignorata correttamente, Query Optimizer assegna automaticamente valori univoci per la colonna Identity nelle righe importate della tabella.If an identity column is skipped successfully, the query optimizer automatically assigns unique values for the identity column into the imported table rows.

Per un esempio di questo hint in un'istruzione INSERT ... SELECT * FROM OPENROWSET(BULK...), vedere Mantenere i valori Identity durante l'importazione bulk dei dati (SQL Server).For an example that uses this hint in an INSERT ... SELECT * FROM OPENROWSET(BULK...) statement, see Keep Identity Values When Bulk Importing Data (SQL Server).

Per altre informazioni sul controllo del valore Identity per una tabella, vedere DBCC CHECKIDENT (Transact-SQL).For information about checking the identity value for a table, see DBCC CHECKIDENT (Transact-SQL).

KEEPDEFAULTSKEEPDEFAULTS
Applicabile solo in un'istruzione INSERT se viene usata l'opzione BULK con OPENROWSET.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

Specifica l'inserimento di un valore predefinito per la colonna della tabella, se disponibile, al posto del valore NULL quando nel record di dati non è presente un valore per la colonna.Specifies insertion of a table column's default value, if any, instead of NULL when the data record lacks a value for the column.

Per un esempio di utilizzo di questo hint in un'istruzione INSERT ... SELECT * FROM OPENROWSET(BULK...), vedere Mantenere i valori Null o usare i valori predefiniti durante un'importazione bulk (SQL Server).For an example that uses this hint in an INSERT ... SELECT * FROM OPENROWSET(BULK...) statement, see Keep Nulls or Use Default Values During Bulk Import (SQL Server).

FORCESEEK [ (index_value(index_column_name [ ,... n ] )) ]FORCESEEK [ (index_value(index_column_name [ ,... n ] )) ]
Specifica che Query Optimizer deve usare solo un'operazione di ricerca nell'indice come percorso di accesso ai dati della tabella o della vista.Specifies that the query optimizer use only an index seek operation as the access path to the data in the table or view.

Nota

A partire da SQL Server 2008 R2SQL Server 2008 R2 SP1, è anche possibile specificare i parametri di indice.Starting with SQL Server 2008 R2SQL Server 2008 R2 SP1, index parameters can also be specified. In questo caso, in Query Optimizer vengono considerate solo le operazioni di ricerca nell'indice specificato, utilizzando almeno le colonne dell'indice specificate.In that case, the query optimizer considers only index seek operations through the specified index using at least the specified index columns.

index_valueindex_value
Nome o valore ID dell'indice.Is the index name or index ID value. Non è possibile specificare un ID di indice pari a 0 (heap).The index ID 0 (heap) cannot be specified. Per restituire l'ID o il nome dell'indice, eseguire una query sulla vista del catalogo sys.indexes.To return the index name or ID, query the sys.indexes catalog view.

index_column_nameindex_column_name
Nome della colonna dell'indice da includere nell'operazione di ricerca.Is the name of the index column to include in the seek operation. L'utilizzo di FORCESEEK con i parametri di indice è analogo all'utilizzo di FORCESEEK con un hint INDEX.Specifying FORCESEEK with index parameters is similar to using FORCESEEK with an INDEX hint. È tuttavia possibile ottenere un maggior controllo sul percorso di accesso usato da Query Optimizer specificando sia l'indice su cui eseguire la ricerca, sia le colonne dell'indice da prendere in considerazione durante l'operazione di ricerca.However, you can achieve greater control over the access path used by the query optimizer by specifying both the index to seek on and the index columns to consider in the seek operation. Se necessario, possono essere considerate ulteriori colonne.The optimizer may consider additional columns if needed. A esempio, se si specifica un indice non cluster, è possibile che in Query Optimizer vengano usate le colonne chiave dell'indice cluster oltre alle colonne specificate.For example, if a nonclustered index is specified, the optimizer may choose to use clustered index key columns in addition to the specified columns.

È possibile specificare l'hint FORCESEEK nei modi riportati di seguito.The FORCESEEK hint can be specified in the following ways.

SintassiSyntax EsempioExample DescrizioneDescription
Senza un indice o un hint INDEXWithout an index or INDEX hint FROM dbo.MyTable WITH (FORCESEEK) In Query Optimizer vengono considerate solo le operazioni di ricerca nell'indice per accedere alla tabella o alla vista in un indice rilevante.The query optimizer considers only index seek operations to access the table or view through any relevant index.
In combinazione con un hint INDEXCombined with an INDEX hint FROM dbo.MyTable WITH (FORCESEEK, INDEX (MyIndex)) In Query Optimizer vengono considerate solo le operazioni di ricerca nell'indice per accedere alla tabella o alla vista nell'indice specificato.The query optimizer considers only index seek operations to access the table or view through the specified index.
Con parametri mediante la specifica di un indice e colonne di indiceParameterized by specifying an index and index columns FROM dbo.MyTable WITH (FORCESEEK (MyIndex (col1, col2, col3))) In Query Optimizer vengono considerate solo le operazioni di ricerca nell'indice per accedere alla tabella o alla vista nell'indice specificato, utilizzando almeno le colonne dell'indice specificate.The query optimizer considers only index seek operations to access the table or view through the specified index using at least the specified index columns.

Quando si usa l'hint FORCESEEK (con o senza parametri di indice), è opportuno considerare le indicazioni generali riportate di seguito:When using the FORCESEEK hint (with or without index parameters), consider the following guidelines:

  • L'hint può essere specificato come hint di tabella o hint per la query.The hint can be specified as a table hint or as a query hint. Per altre informazioni sull'hint per la query, vedere Hint per la query (Transact-SQL).For more information about query hints, see Query Hints (Transact-SQL).
  • Per applicare FORCESEEK a una vista indicizzata, è necessario specificare anche l'hint NOEXPAND.To apply FORCESEEK to an indexed view, the NOEXPAND hint must also be specified.
  • L'hint può essere applicato al massimo una volta per ogni tabella o vista.The hint can be applied at most once per table or view.
  • Non è possibile specificare l'hint per un'origine dei dati remota.The hint cannot be specified for a remote data source. Se FORCESEEK viene specificato con un hint per l'indice, viene restituito l'errore 7377. L'errore 8180 viene invece restituito se FORCESEEK viene usato senza un hint per l'indice.Error 7377 is returned when FORCESEEK is specified with an index hint and error 8180 is returned when FORCESEEK is used without an index hint.
  • Se con FORCESEEK non viene trovato alcun piano, viene restituito l'errore 8622.If FORCESEEK causes no plan to be found, error 8622 is returned.

Quando si specifica FORCESEEK con parametri di indice, è opportuno considerare le indicazioni generali e le restrizioni riportate di seguito:When FORCESEEK is specified with index parameters, the following guidelines and restrictions apply:

  • Non è possibile specificare l'hint per una tabella che rappresenta la destinazione di un'istruzione INSERT, UPDATE o DELETE.The hint cannot be specified for a table that is the target of an INSERT, UPDATE, or DELETE statement.
  • Non è possibile specificare questo hint in combinazione con un hint INDEX o un altro hint FORCESEEK.The hint cannot be specified in combination with either an INDEX hint or another FORCESEEK hint.
  • È necessario specificare almeno una colonna, la quale deve corrispondere alla colonna chiave iniziale.At least one column must be specified and it must be the leading key column.
  • Sebbene sia possibile specificare ulteriori colonne di indice, non è possibile ignorare le colonne chiave.Additional index columns can be specified, however, key columns cannot be skipped. Ad esempio, se l'indice specificato contiene le colonne chiave a, b e c, la sintassi valida include FORCESEEK (MyIndex (a)) e FORCESEEK (MyIndex (a, b),For example, if the specified index contains the key columns a, b, and c, valid syntax would include FORCESEEK (MyIndex (a)) and FORCESEEK (MyIndex (a, b). mentre la sintassi non valida include FORCESEEK (MyIndex (c)) e FORCESEEK (MyIndex (a, c).Invalid syntax would include FORCESEEK (MyIndex (c)) and FORCESEEK (MyIndex (a, c).
  • L'ordine dei nomi di colonna specificato nell'hint deve corrispondere a quello delle colonne nell'indice a cui viene fatto riferimento.The order of column names specified in the hint must match the order of the columns in the referenced index.
  • Non è possibile specificare le colonne non incluse nella definizione della chiave dell'indice.Columns that are not in the index key definition cannot be specified. In un indice non cluster è ad esempio possibile specificare solo le colonne chiave dell'indice definite.For example, in a nonclustered index, only the defined index key columns can be specified. Le colonne chiave cluster incluse automaticamente nell'indice non possono essere specificate, sebbene possano essere usate da Query Optimizer.Clustered key columns that are automatically included in the index cannot be specified, but may be used by the optimizer.
  • Un indice columnstore con ottimizzazione per la memoria xVelocity non può essere specificato come parametro di indice.An xVelocity memory optimized columnstore index cannot be specified as an index parameter. Viene restituito l'errore 366.Error 366 is returned.
  • La modifica della definizione dell'indice, ad esempio l'aggiunta o la rimozione di colonne, può richiedere la modifica delle query che fanno riferimento a tale indice.Modifying the index definition (for example, by adding or removing columns) may require modifications to the queries that reference that index.
  • L'hint impedisce a Query Optimizer di prendere in considerazione gli eventuali indici spaziali o XML nella tabella.The hint prevents the optimizer from considering any spatial or XML indexes on the table.
  • Non è possibile specificare l'hint in combinazione con l'hint FORCESCAN.The hint cannot be specified in combination with the FORCESCAN hint.
  • Per gli indici partizionati, la colonna di partizionamento aggiunta in modo implicito da SQL ServerSQL Server non può essere specificata nell'hint FORCESEEK.For partitioned indexes, the partitioning column implicitly added by SQL ServerSQL Server cannot be specified in the FORCESEEK hint.

Attenzione

Se si specifica FORCESEEK con parametri, il numero di piani che possono essere considerati da Query Optimizer viene limitato più di quanto avvenga se si specifica FORCESEEK senza parametri.Specifying FORCESEEK with parameters limits the number of plans that can be considered by the optimizer more than when specifying FORCESEEK without parameters. Ciò potrebbe causare un errore Plan cannot be generated in più casi.This may cause a Plan cannot be generated error to occur in more cases. In una versione futura le modifiche interne a Query Optimizer potrebbero consentire di prendere in considerazione più piani.In a future release, internal modifications to the query optimizer may allow more plans to be considered.

FORCESCAN Si applica a: : da SQL Server 2008 R2SQL Server 2008 R2 SP1 a SQL Server 2017SQL Server 2017.FORCESCAN Applies to: SQL Server 2008 R2SQL Server 2008 R2 SP1 through SQL Server 2017SQL Server 2017. Specifica che Query Optimizer deve usare solo un'operazione di analisi dell'indice come percorso di accesso alla tabella o alla vista a cui viene fatto riferimento.Specifies that the query optimizer use only an index scan operation as the access path to the referenced table or view. L'hint FORCESCAN può essere utile per le query in cui, a causa della valutazione errata (in difetto) del numero di righe interessate da parte di Query Optimizer, viene eseguita un'operazione di ricerca anziché di analisi.The FORCESCAN hint can be useful for queries in which the optimizer underestimates the number of affected rows and chooses a seek operation rather than a scan operation. In questo caso, la quantità di memoria concessa per l'operazione è troppo ridotta, con conseguente calo delle prestazioni di query.When this occurs, the amount of memory granted for the operation is too small and query performance is impacted.

È possibile specificare FORCESCAN con o senza un hint INDEX.FORCESCAN can be specified with or without an INDEX hint. Quando viene specificato in combinazione con un hint per l'indice (INDEX = index_name, FORCESCAN), in Query Optimizer vengono presi in considerazione solo i percorsi di accesso all'analisi nell'indice specificato per accedere alla tabella a cui viene fatto riferimento.When combined with an index hint, (INDEX = index_name, FORCESCAN), the query optimizer considers only scan access paths through the specified index when accessing the referenced table. FORCESCAN può essere specificato con l'hint per l'indice INDEX(0) per forzare un'operazione di analisi delle tabelle nella tabella di base.FORCESCAN can be specified with the index hint INDEX(0) to force a table scan operation on the base table.

Per le tabelle e gli indici partizionati, FORCESCAN viene applicato dopo l'eliminazione delle partizioni tramite la valutazione del predicato della query.For partitioned tables and indexes, FORCESCAN is applied after partitions have been eliminated through query predicate evaluation. L'analisi viene pertanto applicata solo alle partizioni rimanenti, anziché all'intera tabella.This means that the scan is applied only to the remaining partitions and not to the entire table.

Per l'hint FORCESCAN sono applicate le restrizioni indicate di seguito:The FORCESCAN hint has the following restrictions:

  • Non è possibile specificare l'hint per una tabella che rappresenta la destinazione di un'istruzione INSERT, UPDATE o DELETE.The hint cannot be specified for a table that is the target of an INSERT, UPDATE, or DELETE statement.
  • Non è possibile usare l'hint con più hint per l'indice.The hint cannot be used with more than one index hint.
  • L'hint impedisce a Query Optimizer di prendere in considerazione gli eventuali indici spaziali o XML nella tabella.The hint prevents the optimizer from considering any spatial or XML indexes on the table.
  • Non è possibile specificare l'hint per un'origine dei dati remota.The hint cannot be specified for a remote data source.
  • Non è possibile specificare l'hint in combinazione con l'hint FORCESEEK.The hint cannot be specified in combination with the FORCESEEK hint.

HOLDLOCKHOLDLOCK
Equivale a SERIALIZABLE.Is equivalent to SERIALIZABLE. Per altre informazioni, vedere la sezione SERIALIZABLE di seguito in questo argomento.For more information, see SERIALIZABLE later in this topic. HOLDLOCK si applica solo alla tabella o alla vista per la quale è stato specificato e solo per la durata della transazione definita dall'istruzione in cui è usato.HOLDLOCK applies only to the table or view for which it is specified and only for the duration of the transaction defined by the statement that it is used in. Non è possibile usare HOLDLOCK in un'istruzione SELECT che include l'opzione FOR BROWSE.HOLDLOCK cannot be used in a SELECT statement that includes the FOR BROWSE option.

IGNORE_CONSTRAINTSIGNORE_CONSTRAINTS
Applicabile solo in un'istruzione INSERT se viene usata l'opzione BULK con OPENROWSET.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

Specifica che qualsiasi vincolo sulla tabella verrà ignorato dall'operazione di importazione bulk.Specifies that any constraints on the table are ignored by the bulk-import operation. Per impostazione predefinita, INSERT controlla i vincoli UNIQUE e CHECK e i vincoli di chiavi primarie ed esterne.By default, INSERT checks Unique Constraints and Check Constraints and Primary and Foreign Key Constraints. Se si specifica IGNORE_CONSTRAINTS per un'operazione di importazione bulk, l'istruzione INSERT deve ignorare tali vincoli in una tabella di destinazione.When IGNORE_CONSTRAINTS is specified for a bulk-import operation, INSERT must ignore these constraints on a target table. Si noti che non è possibile disabilitare i vincoli UNIQUE, PRIMARY KEY o NOT NULL.Note that you cannot disable UNIQUE, PRIMARY KEY, or NOT NULL constraints.

Se i dati di input contengono righe che violano i vincoli, potrebbe essere necessario disabilitare i vincoli CHECK e FOREIGN KEY.You might want to disable CHECK and FOREIGN KEY constraints if the input data contains rows that violate constraints. Disabilitando i vincoli CHECK e FOREIGN KEY, è possibile importare i dati e quindi usare istruzioni Transact-SQLTransact-SQL per pulire i dati.By disabling the CHECK and FOREIGN KEY constraints, you can import the data and then use Transact-SQLTransact-SQL statements to clean up the data.

Quando, tuttavia, i vincoli CHECK e FOREIGN KEY vengono ignorati, ogni vincolo ignorato nella tabella viene contrassegnato come is_not_trusted nella vista del catalogo sys.check_constraints o sys.foreign_keys dopo l'operazione.However, when CHECK and FOREIGN KEY constraints are ignored, each ignored constraint on the table is marked as is_not_trusted in the sys.check_constraints or sys.foreign_keys catalog view after the operation. A un certo punto sarà necessario controllare i vincoli nell'intera tabella.At some point, you should check the constraints on the whole table. Se la tabella non era vuota prima dell'operazione di importazione bulk, l'impegno per la riconvalida dei vincoli può essere superiore all'impegno per l'applicazione dei vincoli CHECK e FOREIGN KEY ai dati incrementali.If the table was not empty before the bulk import operation, the cost of revalidating the constraint may exceed the cost of applying CHECK and FOREIGN KEY constraints to the incremental data.

IGNORE_TRIGGERSIGNORE_TRIGGERS
Applicabile solo in un'istruzione INSERT se viene usata l'opzione BULK con OPENROWSET.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

Specifica che qualsiasi trigger definito sulla tabella verrà ignorato dall'operazione di importazione bulk.Specifies that any triggers defined on the table are ignored by the bulk-import operation. Per impostazione predefinita, l'istruzione INSERT applica i trigger.By default, INSERT applies triggers.

Usare l'argomento IGNORE_TRIGGERS solo se l'applicazione non dipende dai trigger e l'ottimizzazione delle prestazioni è un fattore importante.Use IGNORE_TRIGGERS only if your application does not depend on any triggers and maximizing performance is important.

NOLOCKNOLOCK
Equivale a READUNCOMMITTED.Is equivalent to READUNCOMMITTED. Per altre informazioni, vedere la sezione READUNCOMMITTED di seguito in questo argomento.For more information, see READUNCOMMITTED later in this topic.

Nota

Per le istruzioni UPDATE e DELETE: Questa funzionalità è in manutenzione e potrebbe essere rimossa in una delle prossime versioni di Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.For UPDATE or DELETE statements: Questa funzionalità è in manutenzione e potrebbe essere rimossa in una delle prossime versioni di Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

NOWAITNOWAIT
Imposta Motore di databaseDatabase Engine in modo che venga restituito un messaggio non appena viene rilevato un blocco nella tabella.Instructs the Motore di databaseDatabase Engine to return a message as soon as a lock is encountered on the table. NOWAIT equivale a specificare SET LOCK_TIMEOUT 0 per una tabella specifica.NOWAIT is equivalent to specifying SET LOCK_TIMEOUT 0 for a specific table. L'hint NOWAIT non funziona quando viene incluso anche l'hint TABLOCK.The NOWAIT hint does not work when the TABLOCK hint is also included. Per terminare una query senza attendere il momento in cui usare l'hint TABLOCK, anteporre invece SETLOCK_TIMEOUT 0; alla query.To terminate a query without waiting when using the TABLOCK hint, preface the query with SETLOCK_TIMEOUT 0; instead.

PAGLOCKPAGLOCK
Acquisisce i blocchi di pagina dove in genere vengono acquisiti i singoli blocchi su righe o chiavi oppure dove in genere viene acquisito un singolo blocco di tabella.Takes page locks either where individual locks are ordinarily taken on rows or keys, or where a single table lock is ordinarily taken. Per impostazione predefinita, viene usata la modalità di blocco appropriata per l'operazione specifica.By default, uses the lock mode appropriate for the operation. Se viene specificato nelle transazioni operative al livello di isolamento SNAPSHOT, i blocchi di pagina vengono acquisiti solo se PAGLOCK è combinato con altri hint di tabella che richiedono i blocchi, ad esempio UPDLOCK e HOLDLOCK.When specified in transactions operating at the SNAPSHOT isolation level, page locks are not taken unless PAGLOCK is combined with other table hints that require locks, such as UPDLOCK and HOLDLOCK.

READCOMMITTEDREADCOMMITTED
Specifica la conformità delle operazioni di lettura con le regole relative al livello di isolamento READ COMMITTED mediante l'utilizzo dei blocchi o del controllo delle versioni delle righe.Specifies that read operations comply with the rules for the READ COMMITTED isolation level by using either locking or row versioning. Se l'opzione di database READ_COMMITTED_SNAPSHOT è impostata su OFF, Motore di databaseDatabase Engine acquisisce blocchi condivisi durante la lettura dei dati e rilascia tali blocchi al completamento dell'operazione di lettura.If the database option READ_COMMITTED_SNAPSHOT is OFF, the Motore di databaseDatabase Engine acquires shared locks as data is read and releases those locks when the read operation is completed. Se l'opzione di database READ_COMMITTED_SNAPSHOT è impostata su ON, Motore di databaseDatabase Engine non acquisisce i blocchi e utilizza il controllo delle versioni delle righe.If the database option READ_COMMITTED_SNAPSHOT is ON, the Motore di databaseDatabase Engine does not acquire locks and uses row versioning. Per altre informazioni sui livelli di isolamento, vedere SET TRANSACTION ISOLATION LEVEL (Transact-SQL).For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

Nota

Per le istruzioni UPDATE e DELETE: Questa funzionalità è in manutenzione e potrebbe essere rimossa in una delle prossime versioni di Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.For UPDATE or DELETE statements: Questa funzionalità è in manutenzione e potrebbe essere rimossa in una delle prossime versioni di Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

READCOMMITTEDLOCKREADCOMMITTEDLOCK
Specifica la conformità delle operazioni di lettura con le regole relative al livello di isolamento READ COMMITTED mediante l'utilizzo dei blocchi.Specifies that read operations comply with the rules for the READ COMMITTED isolation level by using locking. Il Motore di databaseDatabase Engine acquisisce i blocchi condivisi durante la lettura dei dati e li rilascia al completamento dell'operazione di lettura, indipendentemente dall'impostazione dell'opzione di database READ_COMMITTED_SNAPSHOT.The Motore di databaseDatabase Engine acquires shared locks as data is read and releases those locks when the read operation is completed, regardless of the setting of the READ_COMMITTED_SNAPSHOT database option. Per altre informazioni sui livelli di isolamento, vedere SET TRANSACTION ISOLATION LEVEL (Transact-SQL).For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL). Non è possibile specificare questo hint in una tabella di destinazione di un'istruzione INSERT. Viene restituito l'errore 4140.This hint cannot be specified on the target table of an INSERT statement; error 4140 is returned.

READPASTREADPAST
Specifica che le righe bloccate da altre transazioni non devono essere lette dal Motore di databaseDatabase Engine.Specifies that the Motore di databaseDatabase Engine not read rows that are locked by other transactions. Se si specifica READPAST, vengono ignorati i blocchi a livello di riga ma non a livello di pagina.When READPAST is specified, row-level locks are skipped but page-level locks are not skipped. Il Motore di databaseDatabase Engine ignora pertanto le righe anziché bloccare la transazione corrente finché i blocchi non vengono rilasciati.That is, the Motore di databaseDatabase Engine skips past the rows instead of blocking the current transaction until the locks are released. Si supponga, ad esempio, che la tabella T1 contenga una sola colonna integer con i valori 1, 2, 3, 4, 5.For example, assume table T1 contains a single integer column with the values of 1, 2, 3, 4, 5. Se la transazione A modifica il valore da 3 a 8 senza eseguire il commit, l'istruzione SELECT * FROM T1 (READPAST) restituisce i valori 1, 2, 4, 5.If transaction A changes the value of 3 to 8 but has not yet committed, a SELECT * FROM T1 (READPAST) yields values 1, 2, 4, 5. READPAST è usato principalmente per ridurre la contesa tra blocchi durante l'implementazione di una coda processi che usa una tabella SQL ServerSQL Server.READPAST is primarily used to reduce locking contention when implementing a work queue that uses a SQL ServerSQL Server table. Un agente di lettura coda che utilizza l'argomento READPAST ignora le voci della coda bloccate da altre transazioni e passa alla successiva voce disponibile senza attendere il rilascio dei blocchi da parte delle altre transazioni.A queue reader that uses READPAST skips past queue entries locked by other transactions to the next available queue entry, without having to wait until the other transactions release their locks.

È possibile specificare l'argomento READPAST per qualsiasi tabella a cui viene fatto riferimento in un'istruzione UPDATE o DELETE e per qualsiasi tabella a cui viene fatto riferimento in una clausola FROM.READPAST can be specified for any table referenced in an UPDATE or DELETE statement, and any table referenced in a FROM clause. Se specificato in un'istruzione UPDATE, l'argomento READPAST viene applicato solo durante la lettura dei dati per l'identificazione dei record da aggiornare, indipendentemente dalla posizione in cui è stato specificato all'interno dell'istruzione.When specified in an UPDATE statement, READPAST is applied only when reading data to identify which records to update, regardless of where in the statement it is specified. Non è possibile specificare l'argomento READPAST per le tabelle nella clausola INTO di un'istruzione INSERT.READPAST cannot be specified for tables in the INTO clause of an INSERT statement. È possibile che le operazioni di aggiornamento o eliminazione che utilizzano l'argomento READPAST applichino blocchi durante la lettura delle chiavi esterne o delle viste indicizzate oppure durante la modifica degli indici secondari.Update or delete operations that use READPAST may block when reading foreign keys or indexed views, or when modifying secondary indexes.

L'argomento READPAST può essere specificato solo nelle transazioni operative ai livelli di isolamento READ COMMITTED o REPEATABLE READ.READPAST can only be specified in transactions operating at the READ COMMITTED or REPEATABLE READ isolation levels. Se viene specificato nelle transazioni operative al livello di isolamento SNAPSHOT, è necessario combinare READPAST con altri hint di tabella che richiedono i blocchi, ad esempio UPDLOCK e HOLDLOCK.When specified in transactions operating at the SNAPSHOT isolation level, READPAST must be combined with other table hints that require locks, such as UPDLOCK and HOLDLOCK.

L'hint di tabella READPAST non può essere specificato quando l'opzione di database READ_COMMITTED_SNAPSHOT è impostata su ON e una delle condizioni seguenti è vera:The READPAST table hint cannot be specified when the READ_COMMITTED_SNAPSHOT database option is set to ON and either of the following conditions is true:

  • Il livello di isolamento delle transazioni della sessione è READ COMMITTED.The transaction isolation level of the session is READ COMMITTED.
  • L'hint di tabella READCOMMITTED viene specificato anche nella query.The READCOMMITTED table hint is also specified in the query.

Per specificare l'hint READPAST in questi casi, rimuovere l'hint di tabella READCOMMITTED, se presente, e includere l'hint di tabella READCOMMITTEDLOCK nella query.To specify the READPAST hint in these cases, remove the READCOMMITTED table hint if present, and include the READCOMMITTEDLOCK table hint in the query.

READUNCOMMITTEDREADUNCOMMITTED
Indica che le letture dirty sono consentite.Specifies that dirty reads are allowed. Non viene acquisito alcun blocco condiviso per impedire alle altre transazioni di modificare i dati letti dalla transazione corrente. I blocchi esclusivi impostati dalle altre transazioni non impediscono alla transazione corrente di leggere i dati bloccati.No shared locks are issued to prevent other transactions from modifying data read by the current transaction, and exclusive locks set by other transactions do not block the current transaction from reading the locked data. Le letture dirty possono provocare un livello più alto di concorrenza a discapito della lettura delle modifiche dei dati per le quali le altre transazioni eseguiranno il rollback.Allowing dirty reads can cause higher concurrency, but at the cost of reading data modifications that then are rolled back by other transactions. Di conseguenza, è possibile che vengano generati errori per la transazione, che vengano forniti agli utenti dati di cui non è mai stato eseguito il commit oppure che gli utenti visualizzino i record due volte o che non li visualizzino affatto.This may generate errors for your transaction, present users with data that was never committed, or cause users to see records twice (or not at all).

Gli hint READUNCOMMITTED e NOLOCK sono applicabili soltanto a blocchi a livello di dati.READUNCOMMITTED and NOLOCK hints apply only to data locks. Tutte le query, incluse quelle con hint READUNCOMMITTED e NOLOCK, acquisiscono blocchi di stabilità dello schema (Sch-S) durante la compilazione e l'esecuzione.All queries, including those with READUNCOMMITTED and NOLOCK hints, acquire Sch-S (schema stability) locks during compilation and execution. Per questo motivo, le query vengono bloccate quando una transazione simultanea mantiene attivo un blocco di modifica dello schema sulla tabella.Because of this, queries are blocked when a concurrent transaction holds a Sch-M (schema modification) lock on the table. Ad esempio, un'operazione DDL (Data Definition Language) acquisisce un blocco Sch-M prima di modificare le informazioni dello schema della tabella.For example, a data definition language (DDL) operation acquires a Sch-M lock before it modifies the schema information of the table. Tutte le query simultanee che tentano di acquisire un blocco Sch-S, incluse quelle in esecuzione con hint READUNCOMMITTED o NOLOCK, vengono bloccate.Any concurrent queries, including those running with READUNCOMMITTED or NOLOCK hints, are blocked when attempting to acquire a Sch-S lock. Una query con blocco Sch-S blocca invece le transazioni simultanee che tentano di acquisire un blocco Sch-M.Conversely, a query holding a Sch-S lock blocks a concurrent transaction that attempts to acquire a Sch-M lock.

Non è possibile specificare READUNCOMMITTED e NOLOCK per le tabelle modificate da operazioni di inserimento, aggiornamento o eliminazione.READUNCOMMITTED and NOLOCK cannot be specified for tables modified by insert, update, or delete operations. Query Optimizer di SQL ServerSQL Server ignora gli hint READUNCOMMITTED e NOLOCK della clausola FROM applicata alla tabella di destinazione di un'istruzione UPDATE o DELETE.The SQL ServerSQL Server query optimizer ignores the READUNCOMMITTED and NOLOCK hints in the FROM clause that apply to the target table of an UPDATE or DELETE statement.

Nota

In una versione futura di SQL ServerSQL Server verrà rimosso il supporto per l'utilizzo degli hint READUNCOMMITTED e NOLOCK nella clausola FROM per la tabella di destinazione di un'istruzione UPDATE o DELETE.Support for use of the READUNCOMMITTED and NOLOCK hints in the FROM clause that apply to the target table of an UPDATE or DELETE statement will be removed in a future version of SQL ServerSQL Server. Evitare di usare questi hint in questo contesto nei nuovi progetti di sviluppo e pianificare la modifica delle applicazioni in cui sono attualmente usati.Avoid using these hints in this context in new development work, and plan to modify applications that currently use them.

È possibile ridurre al minimo la contesa tra blocchi proteggendo nello stesso tempo le transazioni da letture dirty di modifiche dei dati di cui non è stato eseguito il commit utilizzando una delle impostazioni seguenti:You can minimize locking contention while protecting transactions from dirty reads of uncommitted data modifications by using either of the following:

  • Livello di isolamento READ COMMITTED con l'opzione di database READ_COMMITTED_SNAPSHOT impostata su ON.The READ COMMITTED isolation level with the READ_COMMITTED_SNAPSHOT database option set ON.
  • Livello di isolamento SNAPSHOT.The SNAPSHOT isolation level.

Per altre informazioni sui livelli di isolamento, vedere SET TRANSACTION ISOLATION LEVEL (Transact-SQL).For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

Nota

Se si verificano errori 601 quando è specificata l'opzione READUNCOMMITTED, risolverli come errori di deadlock (1205), quindi provare a rieseguire l'istruzione.If you receive the error message 601 when READUNCOMMITTED is specified, resolve it as you would a deadlock error (1205), and retry your statement.

REPEATABLEREADREPEATABLEREAD
Specifica che viene eseguita un'analisi con la stessa semantica di blocco di una transazione eseguita con un livello di isolamento REPEATABLE READ.Specifies that a scan is performed with the same locking semantics as a transaction running at REPEATABLE READ isolation level. Per altre informazioni sui livelli di isolamento, vedere SET TRANSACTION ISOLATION LEVEL (Transact-SQL).For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

ROWLOCKROWLOCK
Specifica l'acquisizione dei blocchi di riga quando in genere vengono acquisiti i blocchi di pagina o i blocchi a livello di tabella.Specifies that row locks are taken when page or table locks are ordinarily taken. Se viene specificato nelle transazioni operative al livello di isolamento SNAPSHOT, i blocchi di riga vengono acquisiti solo se ROWLOCK è combinato con altri hint di tabella che richiedono i blocchi, ad esempio UPDLOCK e HOLDLOCK.When specified in transactions operating at the SNAPSHOT isolation level, row locks are not taken unless ROWLOCK is combined with other table hints that require locks, such as UPDLOCK and HOLDLOCK.

SERIALIZABLESERIALIZABLE
Equivale a HOLDLOCK.Is equivalent to HOLDLOCK. Rende i blocchi condivisi più restrittivi mantenendoli attivi fino al completamento di una transazione anziché rilasciarli non appena la tabella o la pagina dei dati richiesta non è più necessaria, indipendentemente dal completamento della transazione.Makes shared locks more restrictive by holding them until a transaction is completed, instead of releasing the shared lock as soon as the required table or data page is no longer needed, whether the transaction has been completed or not. L'analisi viene eseguita con la stessa semantica di una transazione eseguita con il livello di isolamento SERIALIZABLE.The scan is performed with the same semantics as a transaction running at the SERIALIZABLE isolation level. Per altre informazioni sui livelli di isolamento, vedere SET TRANSACTION ISOLATION LEVEL (Transact-SQL).For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

SNAPSHOTSNAPSHOT
Si applica a: SQL Server 2014 (12.x)SQL Server 2014 (12.x) tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017.

Alla tabella ottimizzata per la memoria si accede con isolamento SNAPSHOT.The memory-optimized table is accessed under SNAPSHOT isolation. SNAPSHOT può essere utilizzato solo con tabelle ottimizzate per la memoria (con tabelle basate su disco).SNAPSHOT can only be used with memory-optimized tables (not with disk-based tables). Per altre informazioni, vedere Introduzione alle tabelle con ottimizzazione per la memoria.For more information, see Introduction to Memory-Optimized Tables.

SELECT * FROM dbo.Customers AS c   
WITH (SNAPSHOT)   
LEFT JOIN dbo.[Order History] AS oh   
    ON c.customer_id=oh.customer_id;  

SPATIAL_WINDOW_MAX_CELLS = integerSPATIAL_WINDOW_MAX_CELLS = integer
Si applica a: SQL Server 2012 (11.x)SQL Server 2012 (11.x) tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017.
Specifica il numero massimo di celle da usare per la suddivisione a mosaico di un oggetto geografico o di geometria.Specifies the maximum number of cells to use for tessellating a geometry or geography object. Il valore di number deve essere compreso tra 1 e 8192.number is a value between 1 and 8192.

Questa opzione consente l'ottimizzazione dei tempi di esecuzione delle query raggiungendo un compromesso tra il tempo di esecuzione del filtro primario e secondario.This option allows for fine-tuning of query execution time by adjusting the tradeoff between primary and secondary filter execution time. Un numero maggiore riduce il tempo di esecuzione del filtro secondario, ma aumenta il tempo di esecuzione del filtro primario e un numero minore diminuisce tempo di esecuzione del filtro primario, ma aumenta l'esecuzione del filtro secondario.A larger number reduces secondary filter execution time, but increases primary execution filter time and a smaller number decreases primary filter execution time, but increase secondary filter execution. Per i dati spaziali più densi, un numero superiore dovrebbe dar luogo a un tempo di esecuzione più rapido fornendo un'approssimazione migliore del filtro primario e riducendo il tempo di esecuzione del filtro secondario.For denser spatial data, a higher number should produce a faster execution time by giving a better approximation with the primary filter and reducing secondary filter execution time. Per i dati di tipo sparse, un numero inferiore diminuirà il tempo di esecuzione del filtro primario.For sparser data, a lower number will decrease the primary filter execution time.

Questa opzione funziona per sia per le suddivisioni a mosaico della griglia automatiche che per quelle manuali.This option works for both manual and automatic grid tessellations.

TABLOCKTABLOCK
Specifica che il blocco acquisito deve essere applicato a livello di tabella.Specifies that the acquired lock is applied at the table level. Il tipo di blocco acquisito varia in base all'istruzione eseguita.The type of lock that is acquired depends on the statement being executed. Un'istruzione SELECT può ad esempio acquisire un blocco condiviso.For example, a SELECT statement may acquire a shared lock. Se si specifica TABLOCK, il blocco condiviso viene applicato all'intera tabella anziché a livello di riga o di pagina.By specifying TABLOCK, the shared lock is applied to the entire table instead of at the row or page level. Se si specifica anche HOLDLOCK, il blocco di tabella viene mantenuto attivo fino al termine della transazione.If HOLDLOCK is also specified, the table lock is held until the end of the transaction.

Quando si importano dati in un heap tramite l'istruzione INSERT INTO <target_table> SELECT <columns> FROM <source_table>, è possibile abilitare la registrazione ottimizzata e i blocchi per l'istruzione specificando l'hint TABLOCK per la tabella di destinazione.When importing data into a heap by using the INSERT INTO <target_table> SELECT <columns> FROM <source_table> statement, you can enable optimized logging and locking for the statement by specifying the TABLOCK hint for the target table. Il modello di recupero del database deve inoltre essere impostato sul modello con registrazione minima o con registrazione minima delle operazioni bulk.In addition, the recovery model of the database must be set to simple or bulk-logged. Per altre informazioni, vedere INSERT (Transact-SQL).For more information, see INSERT (Transact-SQL).

Se usato in combinazione con il provider di set di righe con lettura bulk OPENROWSET per importare dati in una tabella, TABLOCK consente a più client di caricare simultaneamente i dati nella tabella di destinazione ottimizzandone la registrazione e i blocchi.When used with the OPENROWSET bulk rowset provider to import data into a table, TABLOCK enables multiple clients to concurrently load data into the target table with optimized logging and locking. Per altre informazioni, vedere Prerequisiti per la registrazione minima nell'importazione bulk.For more information, see Prerequisites for Minimal Logging in Bulk Import.

TABLOCKXTABLOCKX
Specifica l'acquisizione di un blocco esclusivo sulla tabella.Specifies that an exclusive lock is taken on the table.

UPDLOCKUPDLOCK
Specifica che devono essere acquisiti blocchi di aggiornamento, i quali dovranno essere mantenuti attivi fino al completamento della transazione.Specifies that update locks are to be taken and held until the transaction completes. UPDLOCK acquisisce i blocchi di aggiornamento per le operazioni di lettura solo a livello di riga o di pagina.UPDLOCK takes update locks for read operations only at the row-level or page-level. Se UPDLOCK viene usato insieme a TABLOCK oppure se viene acquisito un blocco a livello di tabella per altri motivi, viene acquisito un blocco esclusivo (X).If UPDLOCK is combined with TABLOCK, or a table-level lock is taken for some other reason, an exclusive (X) lock will be taken instead.

Quando è specificato UPDLOCK, gli hint del livello di isolamento READCOMMITTED e READCOMMITTEDLOCK vengono ignorati.When UPDLOCK is specified, the READCOMMITTED and READCOMMITTEDLOCK isolation level hints are ignored. Se ad esempio il livello di isolamento della sessione è impostato su SERIALIZABLE e una query specifica (UPDLOCK, READCOMMITTED), l'hint READCOMMITTED viene ignorato e la transazione viene eseguita utilizzando il livello di isolamento SERIALIZABLE.For example, if the isolation level of the session is set to SERIALIZABLE and a query specifies (UPDLOCK, READCOMMITTED), the READCOMMITTED hint is ignored and the transaction is run using the SERIALIZABLE isolation level.

XLOCKXLOCK
Specifica che devono essere acquisiti blocchi esclusivi, i quali dovranno essere mantenuti attivi fino al completamento della transazione.Specifies that exclusive locks are to be taken and held until the transaction completes. Se specificato in combinazione con ROWLOCK, PAGLOCK o TABLOCK, i blocchi esclusivi vengono applicati al livello di granularità appropriato.If specified with ROWLOCK, PAGLOCK, or TABLOCK, the exclusive locks apply to the appropriate level of granularity.

RemarksRemarks

Gli hint di tabella vengono ignorati se il piano di query non accede alla tabella.The table hints are ignored if the table is not accessed by the query plan. Ciò si verifica se Query Optimizer non accede esplicitamente alla tabella oppure perché viene invece eseguito l'accesso a una vista indicizzata.This may be caused by the optimizer choosing not to access the table at all, or because an indexed view is accessed instead. In questo secondo caso è possibile impedire l'accesso a una vista indicizzata utilizzando l'hint per la query OPTION (EXPAND VIEWS).In the latter case, accessing an indexed view can be prevented by using the OPTION (EXPAND VIEWS) query hint.

Tutti gli hint di blocco vengono propagati a tutte le tabelle e viste a cui accede il piano di query, incluse tabelle e viste di riferimento in una vista.All lock hints are propagated to all the tables and views that are accessed by the query plan, including tables and views referenced in a view. SQL ServerSQL Server esegue inoltre le relative verifiche di consistenza dei blocchi.Also, SQL ServerSQL Server performs the corresponding lock consistency checks.

È possibile che gli hint di blocco ROWLOCK, UPDLOCK e AND XLOCK che acquisiscono blocchi a livello di riga applichino blocchi alle chiavi di indice anziché alle righe di dati effettive.Lock hints ROWLOCK, UPDLOCK, AND XLOCK that acquire row-level locks may place locks on index keys rather than the actual data rows. Se, ad esempio, una tabella include un indice non cluster e un'istruzione SELECT che utilizza un hint di blocco viene gestita da un indice di copertura, viene acquisito un blocco sulla chiave dell'indice di copertura anziché sulla riga di dati nella tabella di base.For example, if a table has a nonclustered index, and a SELECT statement using a lock hint is handled by a covering index, a lock is acquired on the index key in the covering index rather than on the data row in the base table.

Se una tabella include colonne calcolate in base a espressioni o funzioni che accedono a colonne in altre tabelle, gli hint di tabella non verranno usati su tali tabelle e non verranno propagati.If a table contains computed columns that are computed by expressions or functions accessing columns in other tables, the table hints are not used on those tables and are not propagated. Ad esempio, un hint di tabella NOLOCK è specificato in una tabella della queryFor example, a NOLOCK table hint is specified on a table in the query. che include colonne calcolate tramite una combinazione di espressioni e funzioni che accedono alle colonne di un'altra tabella.This table has computed columns that are computed by a combination of expressions and functions that access columns in another table. Le tabelle a cui le espressioni e le funzioni fanno riferimento non utilizzano l'hint di tabella NOLOCK durante l'accesso.The tables referenced by the expressions and functions do not use the NOLOCK table hint when accessed.

Per ogni tabella nella clausola FROM in SQL ServerSQL Server non è consentito impostare più di un hint di tabella appartenente a ognuno dei gruppi riportati di seguito.SQL ServerSQL Server does not allow for more than one table hint from each of the following groups for each table in the FROM clause:

  • Hint di granularità: PAGLOCK, NOLOCK, READCOMMITTEDLOCK, ROWLOCK, TABLOCK o TABLOCKX.Granularity hints: PAGLOCK, NOLOCK, READCOMMITTEDLOCK, ROWLOCK, TABLOCK, or TABLOCKX.
  • Hint del livello di isolamento: HOLDLOCK, NOLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE.Isolation level hints: HOLDLOCK, NOLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE.

Hint per l'indice filtratoFiltered Index Hints

È possibile usare un hint per l'indice filtrato come hint di tabella; se tuttavia tale indice non include tutte le righe selezionate dalla query, in Query Optimizer viene generato l'errore 8622.A filtered index can be used as a table hint, but will cause the query optimizer to generate error 8622 if it does not cover all of the rows that the query selects. Di seguito viene fornito un esempio di hint per l'indice filtrato non valido.The following is an example of an invalid filtered index hint. Nell'esempio viene creato l'indice filtrato FIBillOfMaterialsWithComponentID, che viene quindi usato come hint per l'indice per un'istruzione SELECT.The example creates the filtered index FIBillOfMaterialsWithComponentID and then uses it as an index hint for a SELECT statement. Il predicato dell'indice filtrato include righe di dati per gli elementi ComponentID 533, 324 e 753.The filtered index predicate includes data rows for ComponentIDs 533, 324, and 753. Anche il predicato della query include righe di dati per gli elementi ComponentID 533, 324 e 753, ma estende il set di risultati in modo da includere gli elementi ComponentID 855 e 924, non inclusi nell'indice filtrato.The query predicate also includes data rows for ComponentIDs 533, 324, and 753 but extends the result set to include ComponentIDs 855 and 924, which are not in the filtered index. In Query Optimizer l'hint per l'indice filtrato non può pertanto essere usato e viene generato l'errore 8622.Therefore, the query optimizer cannot use the filtered index hint and generates error 8622. Per altre informazioni, vedere Create Filtered Indexes.For more information, see Create Filtered Indexes.

IF EXISTS (SELECT name FROM sys.indexes  
    WHERE name = N'FIBillOfMaterialsWithComponentID'   
    AND object_id = OBJECT_ID(N'Production.BillOfMaterials'))  
DROP INDEX FIBillOfMaterialsWithComponentID  
    ON Production.BillOfMaterials;  
GO  
CREATE NONCLUSTERED INDEX "FIBillOfMaterialsWithComponentID"  
    ON Production.BillOfMaterials (ComponentID, StartDate, EndDate)  
    WHERE ComponentID IN (533, 324, 753);  
GO  
SELECT StartDate, ComponentID FROM Production.BillOfMaterials  
    WITH( INDEX (FIBillOfMaterialsWithComponentID) )  
    WHERE ComponentID in (533, 324, 753, 855, 924);  
GO  

In Query Optimizer non viene considerato alcun hint per l'indice se le opzioni SET non includono i valori necessari per gli indici filtrati.The query optimizer will not consider an index hint if the SET options do not have the required values for filtered indexes. Per altre informazioni, vedere CREATE INDEX (Transact-SQL).For more information, see CREATE INDEX (Transact-SQL).

Utilizzo di NOEXPANDUsing NOEXPAND

L'hint NOEXPAND è applicabile solo alle viste indicizzate,NOEXPAND applies only to indexed views. ovvero alle viste in cui è stato creato un indice cluster univoco.An indexed view is a view with a unique clustered index created on it. In Query Optimizer viene usato l'indice nella vista se in una query sono inclusi riferimenti a colonne disponibili sia in una vista indicizzata sia nelle tabelle di base e viene determinato che l'utilizzo della vista indicizzata rappresenta il metodo migliore per l'esecuzione della query.If a query contains references to columns that are present both in an indexed view and base tables, and the query optimizer determines that using the indexed view provides the best method for executing the query, the query optimizer uses the index on the view. Questa funzionalità viene chiamata corrispondenza della vista indicizzata.This functionality is called indexed view matching. Prima di SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1, l'uso automatico di una vista indicizzata in Query Optimizer è supportato solo in edizioni specifiche di SQL ServerSQL Server.Prior to SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1, automatic use of an indexed view by the query optimizer is supported only in specific editions of SQL ServerSQL Server. Per un elenco delle funzionalità supportate dalle edizioni di SQL ServerSQL Server, vedere Funzionalità supportate dalle edizioni di SQL Server 2016.For a list of features that are supported by the editions of SQL ServerSQL Server, see Features Supported by the Editions of SQL Server 2016.

Tuttavia, affinché Query Optimizer utilizzi le viste indicizzate oppure una vista indicizzata a cui viene fatto riferimento tramite l'hint NOEXPAND per l'esecuzione della corrispondenza, le opzioni SET seguenti devono essere impostate su ON.However, for the optimizer to consider indexed views for matching, or use an indexed view that is referenced with the NOEXPAND hint, the following SET options must be set to ON.

Nota

Database SQL di AzureAzure SQL Database supporta l'uso automatico di viste indicizzate senza specificare l'hint NOEXPAND.supports automatic use of indexed views without specifying the NOEXPAND hint.

ANSI_NULLSANSI_NULLS ANSI_WARNINGSANSI_WARNINGS CONCAT_NULL_YIELDS_NULLCONCAT_NULL_YIELDS_NULL
ANSI_PADDINGANSI_PADDING ARITHABORT1ARITHABORT1 QUOTED_IDENTIFIERQUOTED_IDENTIFIER

1 ARITHABORT viene impostata in modo implicito su ON se ANSI_WARNINGS è impostata su ON.1 ARITHABORT is implicitly set to ON when ANSI_WARNINGS is set to ON. Non sarà pertanto necessario modificare manualmente questa impostazione.Therefore, you do not have to manually adjust this setting.

L'opzione NUMERIC_ROUNDABORT deve invece essere impostata su OFF.Also, the NUMERIC_ROUNDABORT option must be set to OFF.

Per forzare l'utilizzo di un indice per una vista indicizzata in Query Optimizer, è necessario specificare l'opzione NOEXPAND.To force the optimizer to use an index for an indexed view, specify the NOEXPAND option. Questo hint può essere usato solo se la vista è specificata anche nella query.This hint can be used only if the view is also named in the query. In SQL ServerSQL Server non è disponibile un hint per forzare l'utilizzo di una vista indicizzata specifica in una query in cui tale vista non viene specificata direttamente nella clausola FROM. In Query Optimizer viene tuttavia valutata la possibilità di usare le viste indicizzate, anche se non sono presenti riferimenti diretti a tali viste all'interno della query.SQL ServerSQL Server does not provide a hint to force a particular indexed view to be used in a query that does not name the view directly in the FROM clause; however, the query optimizer considers using indexed views, even if they are not referenced directly in the query. SQL Server creerà automaticamente solo le statistiche relative a una vista indicizzata quando si usa un hint di tabella NOEXPAND.SQL Server will only automatically create statistics on an indexed view when a NOEXPAND table hint is used. L'omissione di questo hint può causare la generazione di avvisi del piano di esecuzione relativi alla perdita di statistiche che non possono essere risolti creando manualmente le statistiche.Omitting this hint can lead to execution plan warnings about missing statistics that cannot be resolved by creating statistics manually. Durante l'ottimizzazione della query SQL ServerSQL Server userà le statistiche della vista create automaticamente o manualmente quando la query fa riferimento alla vista direttamente e viene usato l'hint NOEXPAND.During query optimization SQL ServerSQL Server will use view statistics that were created automatically or manually when the query references the view directly and the NOEXPAND hint is used.

Utilizzo di un hint di tabella come hint per la queryUsing a Table Hint as a Query Hint

Gli hint di tabella possono anche essere specificati come hint per la query tramite la clausola OPTION (TABLE HINT).Table hints can also be specified as a query hint by using the OPTION (TABLE HINT) clause. È consigliabile usare un hint di tabella come hint per la query solo nel contesto di una guida di piano.We recommend using a table hint as a query hint only in the context of a plan guide. Per le query ad hoc, specificare questi hint solo come hint di tabella.For ad-hoc queries, specify these hints only as table hints. Per altre informazioni, vedere Hint per la query (Transact-SQL).For more information, see Query Hints (Transact-SQL).

PermissionsPermissions

Gli hint KEEPIDENTITY, IGNORE_CONSTRAINTS e IGNORE_TRIGGERS richiedono l'autorizzazione ALTER sulla tabella.The KEEPIDENTITY, IGNORE_CONSTRAINTS, and IGNORE_TRIGGERS hints require ALTER permissions on the table.

EsempiExamples

A.A. Utilizzo dell'hint TABLOCK per specificare un metodo di bloccoUsing the TABLOCK hint to specify a locking method

Nell'esempio seguente viene specificata l'acquisizione di un blocco condiviso sulla tabella Production.Product nel database AdventureWorks2012AdventureWorks2012 che viene mantenuto fino alla fine dell'istruzione UPDATE.The following example specifies that a shared lock is taken on the Production.Product table in the AdventureWorks2012AdventureWorks2012 database and is held until the end of the UPDATE statement.

UPDATE Production.Product  
WITH (TABLOCK)  
SET ListPrice = ListPrice * 1.10  
WHERE ProductNumber LIKE 'BK-%';  
GO  

b.B. Utilizzo dell'hint FORCESEEK per specificare un'operazione di ricerca nell'indiceUsing the FORCESEEK hint to specify an index seek operation

Nell'esempio seguente viene utilizzato l'hint FORCESEEK senza specificare un indice per forzare l'esecuzione di un'operazione Index Seek da parte di Query Optimizer nella tabella Sales.SalesOrderDetail del database AdventureWorks2012AdventureWorks2012.The following example uses the FORCESEEK hint without specifying an index to force the query optimizer to perform an index seek operation on the Sales.SalesOrderDetail table in the AdventureWorks2012AdventureWorks2012 database.

SELECT *  
FROM Sales.SalesOrderHeader AS h  
INNER JOIN Sales.SalesOrderDetail AS d WITH (FORCESEEK)  
    ON h.SalesOrderID = d.SalesOrderID   
WHERE h.TotalDue > 100  
AND (d.OrderQty > 5 OR d.LineTotal < 1000.00);  
GO  
  

Nell'esempio seguente l'hint FORCESEEK viene usato con un indice affinché in Query Optimizer venga eseguita un'operazione di ricerca nell'indice e nella colonna di indice specificati.The following example uses the FORCESEEK hint with an index to force the query optimizer to perform an index seek operation on the specified index and index column.

SELECT h.SalesOrderID, h.TotalDue, d.OrderQty  
FROM Sales.SalesOrderHeader AS h  
    INNER JOIN Sales.SalesOrderDetail AS d   
    WITH (FORCESEEK (PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID (SalesOrderID)))   
    ON h.SalesOrderID = d.SalesOrderID   
WHERE h.TotalDue > 100  
AND (d.OrderQty > 5 OR d.LineTotal < 1000.00);   
GO  
  

C.C. Utilizzo dell'hint FORCESCAN per specificare un'operazione di analisi dell'indiceUsing the FORCESCAN hint to specify an index scan operation

Nell'esempio seguente viene utilizzato l'hint FORCESCAN per forzare l'esecuzione di un'operazione di analisi da parte di Query Optimizer nella tabella Sales.SalesOrderDetail del database AdventureWorks2012AdventureWorks2012.The following example uses the FORCESCAN hint to force the query optimizer to perform a scan operation on the Sales.SalesOrderDetail table in the AdventureWorks2012AdventureWorks2012 database.

SELECT h.SalesOrderID, h.TotalDue, d.OrderQty  
FROM Sales.SalesOrderHeader AS h  
    INNER JOIN Sales.SalesOrderDetail AS d   
    WITH (FORCESCAN)   
    ON h.SalesOrderID = d.SalesOrderID   
WHERE h.TotalDue > 100  
AND (d.OrderQty > 5 OR d.LineTotal < 1000.00);  

Vedere ancheSee Also

OPENROWSET (Transact-SQL) OPENROWSET (Transact-SQL)
Hint (Transact-SQL) Hints (Transact-SQL)
Hint di query (Transact-SQL)Query Hints (Transact-SQL)