Dicas (Transact-SQL) - tabelaHints (Transact-SQL) - Table

ESTE TÓPICO APLICA-SE A:simSQL Server (a partir de 2008)simBanco de Dados SQL do Microsoft AzurenãoAzure SQL Data Warehouse nãoParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Dicas de tabela substituem o comportamento padrão do otimizador de consulta para a duração da instrução DML (linguagem) de manipulação de dados especificando um método de bloqueio, um ou mais índices, uma operação de processamento de consulta como uma busca de índice ou de exame de tabela ou outras opções.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. As dicas da tabela são especificadas na cláusula FROM da instrução DML e afetam apenas a tabela ou exibição referenciada nessa cláusula.Table hints are specified in the FROM clause of the DML statement and affect only the table or view referenced in that clause.

Cuidado

Como o otimizador de consulta do SQL ServerSQL Server normalmente seleciona o melhor plano de execução para uma consulta, é recomendável que desenvolvedores e administradores de banco de dados experientes usem as dicas apenas como um último recurso.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.

Aplica-se a:Applies to:

DELETEDELETE

INSERTINSERT

SELECTSELECT

UPDATEUPDATE

MERGEMERGE

Ícone de link do tópico Convenções da sintaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax


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   
}   

ArgumentosArguments

COM ( <table_hint > ) [[, ]... n ]WITH ( <table_hint> ) [ [, ]...n ]
Com algumas exceções, há suporte para dicas de tabela na cláusula FROM somente quando elas são especificadas com a palavra-chave WITH.With some exceptions, table hints are supported in the FROM clause only when the hints are specified with the WITH keyword. Dicas de tabela também devem ser especificadas com parênteses.Table hints also must be specified with parentheses.

Importante

A omissão da palavra-chave WITH é um recurso preterido: Esse recurso será removido em uma versão futura do Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam.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: Esse recurso será removido em uma versão futura do Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

As seguintes dicas de tabela são permitidas com e sem a palavra-chave 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. Quando essas dicas de tabela forem especificadas sem a palavra-chave WITH, as dicas deverão ser especificadas sozinhas.When these table hints are specified without the WITH keyword, the hints should be specified alone. Por exemplo:For example:

FROM t (TABLOCK)  

Quando especificada com outra opção, a dica deverá ser especificada com a palavra-chave WITH:When the hint is specified with another option, the hint must be specified with the WITH keyword:

FROM t WITH (TABLOCK, INDEX(myindex))  

É recomendável usar vírgulas entre dicas de tabela.We recommend using commas between table hints.

Importante

A separação de dicas com espaços em vez de vírgulas não é mais um recurso aceito: Esse recurso será removido em uma versão futura do Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. Não utilize esse recurso em desenvolvimentos novos e modifique, assim que possível, os aplicativos que atualmente o utilizam.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: Esse recurso será removido em uma versão futura do Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. Não utilize esse recurso em desenvolvimentos novos e modifique, assim que possível, os aplicativos que atualmente o utilizam.Do not use this feature in new development work, and modify applications that currently use this feature as soon as possible.

NOEXPANDNOEXPAND
Especifica que qualquer exibição indexada não será expandida para acessar tabelas subjacentes quando o otimizador de consulta processar a consulta.Specifies that any indexed views are not expanded to access underlying tables when the query optimizer processes the query. O otimizador de consulta trata a exibição como uma tabela com índice clusterizado.The query optimizer treats the view like a table with clustered index. NOEXPAND aplica-se apenas a exibições indexadas.NOEXPAND applies only to indexed views. Para obter mais informações, consulte Comentários.For more information, see Remarks.

INDEX (index_value [,... n ] ) | INDEX = ( index_value)INDEX (index_value [,... n ] ) | INDEX = ( index_value)
A sintaxe de INDEX() especifica os nomes ou as IDs de um ou mais índices a serem usados pelo otimizador de consulta ao processar a instrução.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. A alternativa INDEX = sintaxe especifica um único valor de índice.The alternative INDEX = syntax specifies a single index value. Apenas uma dica de índice por tabela pode ser especificada.Only one index hint per table can be specified.

Se existir um índice clusterizado, INDEX(0) forçará uma verificação de índice clusterizado e INDEX(1) forçará uma verificação ou busca de índice clusterizado.If a clustered index exists, INDEX(0) forces a clustered index scan and INDEX(1) forces a clustered index scan or seek. Na ausência de índices clusterizados, INDEX(0) forçará uma verificação de tabela e INDEX(1) será interpretado como um erro.If no clustered index exists, INDEX(0) forces a table scan and INDEX(1) is interpreted as an error.

Se forem usados vários índices em uma única lista de índices, as duplicatas serão ignoradas e os demais índices listados serão usados para recuperar as linhas da tabela.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. A ordem dos índices na dica de índice é importante.The order of the indexes in the index hint is significant. Uma dica de vários índices também impõe o uso de AND de índice e o otimizador de consulta aplicará tantas condições quantas forem possíveis em cada índice acessado.A multiple index hint also enforces index ANDing, and the query optimizer applies as many conditions as possible on each index accessed. Se a coleção de índices com dica não incluir todas as colunas referidas pela consulta, uma busca será executada para recuperar as colunas restantes depois que o Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine recuperar todas as colunas indexadas.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 Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine retrieves all the indexed columns.

Observação

Quando uma dica de índice que faz referência a vários índices for usada na tabela de fatos em uma junção em estrela, o otimizador ignorará a dica de índice e retornará uma mensagem de aviso.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. Além disso, o uso de OR de índice não é permitido em uma tabela com uma dica de índice especificada.Also, index ORing is not allowed for a table with an index hint specified.

O número máximo de índices na dica de tabela é de 250 índices não clusterizados.The maximum number of indexes in the table hint is 250 nonclustered indexes.

KEEPIDENTITYKEEPIDENTITY
É aplicável apenas em uma instrução INSERT quando a opção BULK for usada com OPENROWSET.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

Especifica que o valor, ou valores, de identidade no arquivo de dados importado deve ser usado para a coluna de identidade.Specifies that identity value or values in the imported data file are to be used for the identity column. Se KEPIDENTITY não estiver especificado, os valores de identidade dessa coluna serão verificados, mas não importados, e o otimizador de consulta atribuirá automaticamente os valores com base nos valores de semente e de incremento especificados durante a criação da tabela.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 o arquivo de dados não contiver valores para a coluna de identidade na tabela ou na exibição e a coluna de identidade não for a última coluna da tabela, a coluna de identidade deverá ser ignorada.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. Para obter mais informações, consulte usar um arquivo de formato para ignorar um campo de dados ( SQL Server ) .For more information, see Use a Format File to Skip a Data Field (SQL Server). Se uma coluna de identidade for ignorada com êxito, o otimizador de consulta atribui automaticamente valores exclusivos para a coluna de identidade em linhas da tabela importada.If an identity column is skipped successfully, the query optimizer automatically assigns unique values for the identity column into the imported table rows.

Para obter um exemplo que usa essa dica em uma instrução INSERT... Selecione * FROM OPENROWSET, consulte manter identidade valores quando dados em massa importando ( 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).

Para obter informações sobre como verificar o valor de identidade para uma tabela, consulte DBCC CHECKIDENT ( Transact-SQL ) .For information about checking the identity value for a table, see DBCC CHECKIDENT (Transact-SQL).

KEEPDEFAULTSKEEPDEFAULTS
É aplicável apenas em uma instrução INSERT quando a opção BULK for usada com OPENROWSET.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

Especifica a inserção de um valor padrão da coluna de tabela, se houver algum, em vez de NULL, se o registro de dados não tiver um valor para a coluna.Specifies insertion of a table column's default value, if any, instead of NULL when the data record lacks a value for the column.

Para obter um exemplo que usa essa dica em uma instrução INSERT... Selecione * FROM OPENROWSET, consulte manter valores nulos ou Use padrão valores de durante a importação em massa ( 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 ] )) ]
Especifica que o otimizador de consulta usará apenas uma operação de busca de índice como o caminho de acesso aos dados na tabela ou exibição.Specifies that the query optimizer use only an index seek operation as the access path to the data in the table or view. A partir do SQL Server 2008 R2 SP1, parâmetros de índice também podem ser especificados.Starting with SQL Server 2008 R2 SP1, index parameters can also be specified. Nesse caso, o otimizador de consulta considera apenas as operações de busca de índice através do índice especificado, usando pelo menos as colunas de índice especificadas.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
É o valor do nome ou ID do índice.Is the index name or index ID value. A ID do índice 0 (heap) não pode ser especificada.The index ID 0 (heap) cannot be specified. Para retornar a ID ou o nome do índice, consulte o sys. Indexes exibição do catálogo.To return the index name or ID, query the sys.indexes catalog view.

index_column_nameindex_column_name
É o nome da coluna de índice a ser incluída na operação de busca.Is the name of the index column to include in the seek operation. Especificar FORCESEEK com parâmetros de índice é semelhante a usar FORCESEEK com uma dica INDEX.Specifying FORCESEEK with index parameters is similar to using FORCESEEK with an INDEX hint. Entretanto, você pode adquirir maior controle sobre o caminho de acesso usado pelo otimizador de consulta especificando o índice a ser pesquisado e as colunas de índice a serem consideradas na operação de busca.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. O otimizador pode considerar colunas adicionais, caso necessário.The optimizer may consider additional columns if needed. Por exemplo, se um índice não clusterizado for especificado, o otimizador poderá optar por usar colunas de chave de índice clusterizado além das colunas especificadas.For example, if a nonclustered index is specified, the optimizer may choose to use clustered index key columns in addition to the specified columns.

A dica FORCESEEK pode ser especificada das formas a seguir.The FORCESEEK hint can be specified in the following ways.

SintaxeSyntax ExemploExample DescriptionDescription
Sem um índice ou dica INDEXWithout an index or INDEX hint FROM dbo.MyTable WITH (FORCESEEK) O otimizador de consulta considera apenas as operações de busca de índice para acessar a tabela ou exibição através de qualquer índice relevante.The query optimizer considers only index seek operations to access the table or view through any relevant index.
Combinado com uma dica INDEX.Combined with an INDEX hint FROM dbo.MyTable WITH (FORCESEEK, INDEX (MyIndex)) O otimizador de consulta considera apenas as operações de busca de índice para acessar a tabela ou exibição através do índice especificado.The query optimizer considers only index seek operations to access the table or view through the specified index.
Parametrizado especificando um índice e colunas do índiceParameterized by specifying an index and index columns FROM dbo.MyTable WITH (FORCESEEK (MyIndex (col1, col2, col3))) O otimizador de consulta considera apenas as operações de busca de índice para acessar a tabela ou exibição através do índice especificado, usando pelo menos as colunas de índice especificadas.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.

Ao usar a dica FORCESEEK (com ou sem parâmetros de índice), considere as diretrizes a seguir.When using the FORCESEEK hint (with or without index parameters), consider the following guidelines.

  • A dica pode ser especificada como uma dica de tabela ou como uma dica de consulta.The hint can be specified as a table hint or as a query hint. Para obter mais informações sobre dicas de consulta, consulte dicas de consulta ( Transact-SQL ) .For more information about query hints, see Query Hints (Transact-SQL).

  • Para aplicar FORCESEEK a uma exibição indexada, a dica NOEXPAND também deve ser especificada.To apply FORCESEEK to an indexed view, the NOEXPAND hint must also be specified.

  • A dica pode ser aplicada no máximo uma vez por tabela ou exibição.The hint can be applied at most once per table or view.

  • A dica não pode ser especificada para uma fonte de dados remotos.The hint cannot be specified for a remote data source. O erro 7377 é retornado quando FORCESEEK é especificado com uma dica de índice e o erro 8180 é retornado quando FORCESEEK é usado sem uma dica de índice.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 FORCESEEK impedir a localização de um plano, o erro 8622 será retornado.If FORCESEEK causes no plan to be found, error 8622 is returned.

    Quando FORCESEEK for especificado com parâmetros de índice, as diretrizes e restrições a seguir se aplicarão.When FORCESEEK is specified with index parameters, the following guidelines and restrictions apply.

  • A dica não pode ser especificada para uma tabela que é o destino de uma instrução INSERT, UPDATE ou DELETE.The hint cannot be specified for a table that is the target of an INSERT, UPDATE, or DELETE statement.

  • A dica não pode ser especificada em combinação com uma dica INDEX ou outra dica FORCESEEK.The hint cannot be specified in combination with either an INDEX hint or another FORCESEEK hint.

  • Pelo menos uma coluna deve ser especificada e ela deve ser a coluna de chave à esquerda.At least one column must be specified and it must be the leading key column.

  • Colunas de índice adicionais podem ser especificadas; entretanto, colunas de chave não podem ser ignoradas.Additional index columns can be specified, however, key columns cannot be skipped. Por exemplo, se o índice especificado contiver as colunas de chave a, b e c, a sintaxe válida incluirá 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). A sintaxe inválida incluiria FORCESEEK (MyIndex (c)) e FORCESEEK (MyIndex (a, c).Invalid syntax would include FORCESEEK (MyIndex (c)) and FORCESEEK (MyIndex (a, c).

  • A ordem de nomes de coluna especificada na dica deve corresponder à ordem das colunas no índice referenciado.The order of column names specified in the hint must match the order of the columns in the referenced index.

  • As colunas que não constam na definição de chave de índice não podem ser especificadas.Columns that are not in the index key definition cannot be specified. Por exemplo, em um índice não clusterizado, apenas as colunas de chave de índice definidas podem ser especificadas.For example, in a nonclustered index, only the defined index key columns can be specified. As colunas de chave clusterizadas que são incluídas automaticamente no índice não podem ser especificadas, mas podem ser usadas pelo otimizador.Clustered key columns that are automatically included in the index cannot be specified, but may be used by the optimizer.

  • Um índice columnstore xVelocity com otimização de memória não pode ser especificado como parâmetro de índice.An xVelocity memory optimized columnstore index cannot be specified as an index parameter. Erro 366 será retornado.Error 366 is returned.

  • A modificação da definição de índice (por exemplo, adicionando ou removendo colunas) talvez exija modificações nas consultas que fazem referência a esse índice.Modifying the index definition (for example, by adding or removing columns) may require modifications to the queries that reference that index.

  • A dica impede que o otimizador considere índices espaciais ou XML na tabela.The hint prevents the optimizer from considering any spatial or XML indexes on the table.

  • A dica não pode ser especificada em combinação com a dica FORCESCAN.The hint cannot be specified in combination with the FORCESCAN hint.

  • Para índices particionados, a coluna de particionamento implicitamente adicionada pelo SQL ServerSQL Server não pode ser especificada na dica FORCESEEK.For partitioned indexes, the partitioning column implicitly added by SQL ServerSQL Server cannot be specified in the FORCESEEK hint.

Cuidado

A especificação de FORCESEEK com parâmetros limita o número de planos que podem ser considerados pelo otimizador mais do que a especificação de FORCESEEK sem parâmetros.Specifying FORCESEEK with parameters limits the number of plans that can be considered by the optimizer more than when specifying FORCESEEK without parameters. Isso pode resultar em um erro "Não é possível gerar o plano" em mais casos.This may cause a "Plan cannot be generated" error to occur in more cases. Em uma versão futura, as modificações internas no otimizador talvez permitam a consideração de mais planos.In a future release, internal modifications to the optimizer may allow more plans to be considered.

FORCESCANFORCESCAN
Apresentada no SQL Server 2008 R2 SP1, essa dica especifica que o otimizador de consulta use apenas uma operação de verificação de índice como o caminho de acesso para a tabela ou exibição.Introduced in SQL Server 2008 R2 SP1, this hint specifies that the query optimizer use only an index scan operation as the access path to the referenced table or view. A dica FORCESCAN pode ser útil em consultas nas quais o otimizador menospreza o número de linhas afetadas e escolhe uma operação de busca em vez de uma operação de verificação.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. Quando isso ocorre, a quantidade de memória concedida para a operação é muito baixa e o desempenho da consulta é afetado.When this occurs, the amount of memory granted for the operation is too small and query performance is impacted.

FORCESCAN pode ser especificado com ou sem uma dica INDEX.FORCESCAN can be specified with or without an INDEX hint. Quando combinado com uma dica de índice, (INDEX = index_name, FORCESCAN), o otimizador de consulta considera apenas os caminhos de acesso de verificação através do índice especificado ao acessar a tabela referenciada.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 pode ser especificado com a dica de índice INDEX(0) para forçar uma operação de verificação de tabela na tabela base.FORCESCAN can be specified with the index hint INDEX(0) to force a table scan operation on the base table.

Para tabelas e índices particionados, FORCESCAN é aplicado após a eliminação de partições através da avaliação de predicado de consulta.For partitioned tables and indexes, FORCESCAN is applied after partitions have been eliminated through query predicate evaluation. Isso significa que a verificação é aplicada apenas às partições restantes e não à tabela inteira.This means that the scan is applied only to the remaining partitions and not to the entire table.

A dica FORCESCAN tem as restrições a seguir.The FORCESCAN hint has the following restrictions.

  • A dica não pode ser especificada para uma tabela que é o destino de uma instrução INSERT, UPDATE ou DELETE.The hint cannot be specified for a table that is the target of an INSERT, UPDATE, or DELETE statement.

  • A dica não pode ser usada com mais de uma dica de índice.The hint cannot be used with more than one index hint.

  • A dica impede que o otimizador considere índices espaciais ou XML na tabela.The hint prevents the optimizer from considering any spatial or XML indexes on the table.

  • A dica não pode ser especificada para uma fonte de dados remotos.The hint cannot be specified for a remote data source.

  • A dica não pode ser especificada em combinação com a dica FORCESEEK.The hint cannot be specified in combination with the FORCESEEK hint.

    HOLDLOCKHOLDLOCK
    É equivalente a SERIALIZABLE.Is equivalent to SERIALIZABLE. Para obter mais informações, consulte SERIALIZABLE posteriormente neste tópico.For more information, see SERIALIZABLE later in this topic. HOLDLOCK aplica-se apenas à tabela ou exibição para a qual está especificada e somente durante a transação definida pela instrução usada.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. HOLDLOCK não pode ser usada em uma instrução SELECT que inclua a opção FOR BROWSE.HOLDLOCK cannot be used in a SELECT statement that includes the FOR BROWSE option.

    IGNORE_CONSTRAINTSIGNORE_CONSTRAINTS
    É aplicável apenas em uma instrução INSERT quando a opção BULK for usada com OPENROWSET.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

    Especifica que qualquer restrição da tabela é ignorada pela operação de importação em massa.Specifies that any constraints on the table are ignored by the bulk-import operation. Por padrão, INSERT verifica restrições Unique e restrições de verificação e primária e restrições de chave estrangeira.By default, INSERT checks Unique Constraints and Check Constraints and Primary and Foreign Key Constraints. Quando a opção IGNORE_CONSTRAINTS for especificada para uma operação de importação em massa, INSERT deverá ignorar essas restrições em uma tabela de destino.When IGNORE_CONSTRAINTS is specified for a bulk-import operation, INSERT must ignore these constraints on a target table. Observe que não é possível desabilitar restrições UNIQUE, PRIMARY KEY ou NOT NULL.Note that you cannot disable UNIQUE, PRIMARY KEY, or NOT NULL constraints.

    Convém desabilitar restrições CHECK e FOREIGN KEY se os dados de entrada contiverem linhas que violam restrições.You might want to disable CHECK and FOREIGN KEY constraints if the input data contains rows that violate constraints. Ao desabilitar as restrições CHECK e FOREIGN KEY, será possível importar os dados e usar instruções Transact-SQLTransact-SQL para limpar os dados.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.

    No entanto, quando as restrições CHECK e FOREIGN KEY são ignoradas, cada restrição ignorada na tabela é marcada como is_not_trusted no sys. CHECK_CONSTRAINTS ou foreign_keys exibição do catálogo após a operação.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. Em algum ponto, verifique as restrições de toda a tabela.At some point, you should check the constraints on the whole table. Se a tabela não estiver vazia antes da operação de importação em massa, o custo de revalidação da restrição poderá exceder o custo da aplicação das restrições CHECK e FOREIGN KEY aos dados incrementais.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
    É aplicável apenas em uma instrução INSERT quando a opção BULK for usada com OPENROWSET.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

    Especifica que qualquer gatilho definido na tabela será ignorado pela operação de importação em massa.Specifies that any triggers defined on the table are ignored by the bulk-import operation. Por padrão, INSERT aplica gatilhos.By default, INSERT applies triggers.

    Use IGNORE_TRIGGERS apenas se o aplicativo não depender de nenhum gatilho e se for importante maximizar o desempenho.Use IGNORE_TRIGGERS only if your application does not depend on any triggers and maximizing performance is important.

    NOLOCKNOLOCK
    É equivalente a READUNCOMMITTED.Is equivalent to READUNCOMMITTED. Para obter mais informações, consulte READUNCOMMITTED mais adiante neste tópico.For more information, see READUNCOMMITTED later in this topic.

Observação

Para instruções UPDATE ou DELETE: Esse recurso será removido em uma versão futura do Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.For UPDATE or DELETE statements: Esse recurso será removido em uma versão futura do Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

NOWAITNOWAIT
Instrui o Mecanismo de Banco de DadosDatabase Engine a retornar uma mensagem assim que um bloqueio for encontrado na tabela.Instructs the Mecanismo de Banco de DadosDatabase Engine to return a message as soon as a lock is encountered on the table. NOWAIT é equivalente a especificar SET LOCK_TIMEOUT 0 para uma tabela específica.NOWAIT is equivalent to specifying SET LOCK_TIMEOUT 0 for a specific table. A dica NOWAIT não funciona quando a dica TABLOCK também é incluída.The NOWAIT hint does not work when the TABLOCK hint is also included. Para terminar uma consulta sem aguardar ao usar a dica TABLOCK, preceda a consulta por SETLOCK_TIMEOUT 0;.To terminate a query without waiting when using the TABLOCK hint, preface the query with SETLOCK_TIMEOUT 0; instead.

PAGLOCKPAGLOCK
Usa bloqueios de página onde bloqueios individuais são usados normalmente em linhas ou chaves ou onde um único bloqueio de tabela é usado normalmente.Takes page locks either where individual locks are ordinarily taken on rows or keys, or where a single table lock is ordinarily taken. Por padrão, usa o modo de bloqueio adequado para a operação.By default, uses the lock mode appropriate for the operation. Quando especificados em transações que operam no nível de isolamento de SNAPSHOT, os bloqueios de página não são usados a menos que PAGLOCK seja combinado com outras dicas de tabela que requerem bloqueios, como 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
Especifica que as operações de leitura obedecem a regras do nível de isolamento READ COMMITTED usando bloqueio ou controle de versão de linha.Specifies that read operations comply with the rules for the READ COMMITTED isolation level by using either locking or row versioning. Se a opção READ_COMMITTED_SNAPSHOT do banco de dados for OFF, o Mecanismo de Banco de DadosDatabase Engine irá adquirir bloqueios compartilhados conforme os dados forem lidos e liberará esses bloqueios quando a operação de leitura estiver concluída.If the database option READ_COMMITTED_SNAPSHOT is OFF, the Mecanismo de Banco de DadosDatabase Engine acquires shared locks as data is read and releases those locks when the read operation is completed. Se a opção READ_COMMITTED_SNAPSHOT do banco de dados for ON, o Mecanismo de Banco de DadosDatabase Engine não adquirirá bloqueios e usará controle de versão de linha.If the database option READ_COMMITTED_SNAPSHOT is ON, the Mecanismo de Banco de DadosDatabase Engine does not acquire locks and uses row versioning. Para obter mais informações sobre níveis de isolamento, consulte SET TRANSACTION ISOLATION LEVEL ( Transact-SQL ) .For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

Observação

Para instruções UPDATE ou DELETE: Esse recurso será removido em uma versão futura do Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.For UPDATE or DELETE statements: Esse recurso será removido em uma versão futura do Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

READCOMMITTEDLOCKREADCOMMITTEDLOCK
Especifica que operações de leitura obedecem às regras do nível de isolamento READ COMMITTED usando bloqueio.Specifies that read operations comply with the rules for the READ COMMITTED isolation level by using locking. O Mecanismo de Banco de DadosDatabase Engine adquire bloqueios compartilhados conforme os dados são lidos e libera esses bloqueios quando a operação de leitura é concluída, independentemente da configuração da opção READ_COMMITTED_SNAPSHOT do banco de dados.The Mecanismo de Banco de DadosDatabase 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. Para obter mais informações sobre níveis de isolamento, consulte SET TRANSACTION ISOLATION LEVEL ( Transact-SQL ) .For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL). Esta dica não pode ser especificada na tabela de destino de uma instrução INSERT; o erro 4140 é retornado.This hint cannot be specified on the target table of an INSERT statement; error 4140 is returned.

READPASTREADPAST
Especifica que o Mecanismo de Banco de DadosDatabase Engine não lê linhas bloqueadas por outras transações.Specifies that the Mecanismo de Banco de DadosDatabase Engine not read rows that are locked by other transactions. Quando READPAST for especificado, os bloqueios de nível de linha são ignorados, mas bloqueios em nível de página não serão ignorados.When READPAST is specified, row-level locks are skipped but page-level locks are not skipped. Ou seja, o Mecanismo de Banco de DadosDatabase Engine ignorará as linhas em vez de bloquear a transação atual até que os bloqueios sejam liberados.That is, the Mecanismo de Banco de DadosDatabase Engine skips past the rows instead of blocking the current transaction until the locks are released. Por exemplo, suponhamos que a tabela T1 contenha uma única coluna de inteiros com os valores 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 a transação A alterar o valor de 3 para 8, mas ainda não foi confirmada, SELECT * FROM T1 (READPAST) produzirá os valores 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 é usado principalmente para reduzir a contenção de bloqueio ao implementar uma fila de trabalho que usa um SQL ServerSQL Server tabela.READPAST is primarily used to reduce locking contention when implementing a work queue that uses a SQL ServerSQL Server table. Um queue reader usando READPAST ignora entradas da fila bloqueadas por outras transações, passando para a próxima entrada da fila, sem precisar esperar até que outras transações liberem seus bloqueios.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.

READPAST pode ser especificado para qualquer tabela referenciada em uma instrução UPDATE ou DELETE e em qualquer tabela referenciada em uma cláusula FROM.READPAST can be specified for any table referenced in an UPDATE or DELETE statement, and any table referenced in a FROM clause. Quando especificado em uma instrução UPDATE, READPAST será aplicado apenas ao ler dados para identificar quais registros atualizar, independentemente de onde na instrução ele foi especificado.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. READPAST não pode ser especificado para tabelas na cláusula INTO de uma instrução INSERT.READPAST cannot be specified for tables in the INTO clause of an INSERT statement. Operações de atualização ou de exclusão que usam READPAST podem ser bloqueadas ao ler chaves estrangeiras ou exibições indexadas ou ao modificar índices secundários.Update or delete operations that use READPAST may block when reading foreign keys or indexed views, or when modifying secondary indexes.

READPAST pode ser especificado apenas em transações que operam nos níveis de isolamento READ COMMITTED ou REPEATABLE READ.READPAST can only be specified in transactions operating at the READ COMMITTED or REPEATABLE READ isolation levels. Quando especificado em transações que operam no nível de isolamento SNAPSHOT, READPAST deverá ser combinado com outras dicas de tabela que requerem bloqueios, como 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.

A dica de tabela READPAST não pode ser especificada quando a opção do banco de dados READ_COMMITTED_SNAPSHOT for definida como ON e qualquer uma das condições a seguir forem verdadeiras.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.

  • O nível de isolamento da transação da sessão é READ COMMITTED.The transaction isolation level of the session is READ COMMITTED.

  • A dica de tabela READCOMMITTED também é especificada na consulta.The READCOMMITTED table hint is also specified in the query.

    Para especificar a dica READPAST nesses casos, remova a dica de tabela READCOMMITTED, se ela estiver presente, e inclua a dica de tabela READCOMMITTEDLOCK na consulta.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
    Especifica que leituras sujas são permitidas.Specifies that dirty reads are allowed. Nenhum bloqueio compartilhado é emitido para impedir que outras transações modifiquem dados lidos pela transação atual, e bloqueios exclusivos definidos por outras transações não impedem que a transação atual leia os dados bloqueados.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. Permitir leituras sujas pode provocar maior simultaneidade, mas à custa da leitura de modificações de dados que, em seguida, serão revertidas por outras transações.Allowing dirty reads can cause higher concurrency, but at the cost of reading data modifications that then are rolled back by other transactions. Isso pode gerar erros para sua transação, apresentar aos usuários dados que nunca foram confirmados ou fazer com que os usuários vejam registros duplicados (ou nenhum).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).

    Dicas de READUNCOMMITTED e de NOLOCK aplicam-se apenas a bloqueios de dados.READUNCOMMITTED and NOLOCK hints apply only to data locks. Todas as consultas, inclusive aquelas com dicas de READUNCOMMITTED e NOLOCK, adquirem bloqueios Sch-S (estabilidade de esquema) durante a compilação e a execução.All queries, including those with READUNCOMMITTED and NOLOCK hints, acquire Sch-S (schema stability) locks during compilation and execution. Por causa disso, as consultas são bloqueadas quando uma transação simultânea mantém um bloqueio Sch-M (modificação de esquema) na tabela.Because of this, queries are blocked when a concurrent transaction holds a Sch-M (schema modification) lock on the table. Por exemplo, uma operação DDL (Linguagem de Definição de Dados) adquire um bloqueio Sch-M antes de modificar as informações do esquema da tabela.For example, a data definition language (DDL) operation acquires a Sch-M lock before it modifies the schema information of the table. Todas as consultas simultâneas, inclusive aquelas executadas com dicas de READUNCOMMITTED ou NOLOCK, serão bloqueadas ao tentar adquirir um bloqueio Sch-S.Any concurrent queries, including those running with READUNCOMMITTED or NOLOCK hints, are blocked when attempting to acquire a Sch-S lock. Da mesma forma, uma consulta que mantém um bloqueio Sch-S bloqueará uma transação simultânea que tentar adquirir um bloqueio Sch-M.Conversely, a query holding a Sch-S lock blocks a concurrent transaction that attempts to acquire a Sch-M lock.

    READUNCOMMITTED e NOLOCK não podem ser especificados para tabelas modificadas por operações de inserção, atualização ou exclusão.READUNCOMMITTED and NOLOCK cannot be specified for tables modified by insert, update, or delete operations. O otimizador de consulta do SQL ServerSQL Server ignora as dicas de READUNCOMMITTED e NOLOCK na cláusula FROM que se aplicam à tabela de destino de uma instrução UPDATE ou 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.

Observação

O suporte ao uso de dicas de READUNCOMMITTED e NOLOCK na cláusula FROM que se aplicam à tabela de destino de uma instrução UPDATE ou DELETE será eliminado em uma versão futura do SQL ServerSQL Server.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. Evite usar essas dicas nesse contexto em desenvolvimentos novos e planeje modificar aplicativos que as usam atualmente.Avoid using these hints in this context in new development work, and plan to modify applications that currently use them.

É possível minimizar a contenção de bloqueio ao proteger transações de leituras sujas de modificações de dados não confirmadas usando:You can minimize locking contention while protecting transactions from dirty reads of uncommitted data modifications by using either of the following:

  • O nível de isolamento READ COMMITTED com a opção de banco de dados READ_COMMITTED_SNAPSHOT definida como ON.The READ COMMITTED isolation level with the READ_COMMITTED_SNAPSHOT database option set ON.

  • O nível de isolamento SNAPSHOT.The SNAPSHOT isolation level.

    Para obter mais informações sobre níveis de isolamento, consulte SET TRANSACTION ISOLATION LEVEL ( Transact-SQL ) .For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

Observação

Se você receber a mensagem de erro 601 ao especificar READUNCOMMITTED, resolva-a como se fosse um erro de deadlock (1205) e envie novamente a instrução.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
Especifica que um exame é executado com a mesma semântica de bloqueio de uma transação que está sendo executada no nível de isolamento SERIALIZABLE.Specifies that a scan is performed with the same locking semantics as a transaction running at REPEATABLE READ isolation level. Para obter mais informações sobre níveis de isolamento, consulte SET TRANSACTION ISOLATION LEVEL ( Transact-SQL ) .For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

ROWLOCKROWLOCK
Especifica que bloqueios de linha serão usados quando os bloqueios de página ou de tabela forem usados normalmente.Specifies that row locks are taken when page or table locks are ordinarily taken. Quando especificados em transações que operam no nível de isolamento SNAPSHOT, os bloqueios de linha não serão usados a menos que ROWLOCK seja combinado com outras dicas de tabela que requerem bloqueios, como 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
É equivalente a HOLDLOCK.Is equivalent to HOLDLOCK. Torna bloqueios compartilhados mais restritivos ao mantê-los até que uma transação seja concluída, em vez de liberar o bloqueio compartilhado assim que a tabela ou página de dados requerida não seja mais necessária, quer a transação tenha sido concluída ou não.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. A verificação é executada com a mesma semântica da transação que está sendo executada no nível de isolamento SERIALIZABLE.The scan is performed with the same semantics as a transaction running at the SERIALIZABLE isolation level. Para obter mais informações sobre níveis de isolamento, consulte SET TRANSACTION ISOLATION LEVEL ( Transact-SQL ) .For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

SNAPSHOTSNAPSHOT
Aplica-se a: do SQL Server 2014SQL Server 2014 ao SQL Server 2017SQL Server 2017.Applies to: SQL Server 2014SQL Server 2014 through SQL Server 2017SQL Server 2017.

A tabela com otimização de memória é acessada no isolamento SNAPSHOT.The memory-optimized table is accessed under SNAPSHOT isolation. O SNAPSHOT pode ser usado apenas com tabelas com otimização de memória (não com tabelas com base em disco).SNAPSHOT can only be used with memory-optimized tables (not with disk-based tables). Para obter mais informações, consulte Introdução às tabelas com otimização de memória.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
Aplica-se a: do SQL Server 2012SQL Server 2012 ao SQL Server 2017SQL Server 2017.Applies to: SQL Server 2012SQL Server 2012 through SQL Server 2017SQL Server 2017.

Especifica o número máximo de células para usar para fazer um mosaico de geometria ou objeto de geografia.Specifies the maximum number of cells to use for tessellating a geometry or geography object. número é um valor entre 1 e 8192.number is a value between 1 and 8192.

Esta opção permite ajustar o tempo de execução de consulta ajustando o intercâmbio entre o tempo de execução de filtro primário e secundário.This option allows for fine-tuning of query execution time by adjusting the tradeoff between primary and secondary filter execution time. Um número maior reduz o tempo de execução de filtro secundário, mas aumenta hora de filtro de execução primária e um número menor diminui tempo de execução de filtro primário, mas aumenta a execução de filtro secundária.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. Para dados espaciais mais densos, um número mais alto deve gerar um tempo de execução mais rápido dando uma aproximação melhor com o filtro primário e reduzindo o tempo de execução de filtro secundário.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. Para dados mais esparsos, um número inferior diminuirá o tempo de execução de filtro primário.For sparser data, a lower number will decrease the primary filter execution time.

Essa opção funciona para mosaicos de grade manuais e automáticos.This option works for both manual and automatic grid tessellations.

TABLOCKTABLOCK
Especifica que o bloqueio adquirido seja aplicado no nível de tabela.Specifies that the acquired lock is applied at the table level. O tipo de bloqueio que é adquirido depende da instrução que está sendo executada.The type of lock that is acquired depends on the statement being executed. Por exemplo, uma instrução SELECT pode adquirir um bloqueio compartilhado.For example, a SELECT statement may acquire a shared lock. Ao especificar TABLOCK, o bloqueio compartilhado é aplicado à tabela inteira, e não no nível de linha ou página.By specifying TABLOCK, the shared lock is applied to the entire table instead of at the row or page level. Se HOLDLOCK também for especificado, o bloqueio de tabela será mantido até o final da transação.If HOLDLOCK is also specified, the table lock is held until the end of the transaction.

Ao importar dados para um heap usando INSERT INTO <target_table > selecione <colunas > FROM <source_table > instrução, você pode habilitar log otimizado e bloqueio da instrução, especificando o Dica TABLOCK para a tabela de destino.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. Além disso, o modelo de recuperação do banco de dados deve ser definido como simples ou bulk-logged.In addition, the recovery model of the database must be set to simple or bulk-logged. Para obter mais informações, consulte INSERT (Transact-SQL).For more information, see INSERT (Transact-SQL).

Quando usado com o OPENROWSET provedor de conjunto de linhas em massa para importar dados para uma tabela, TABLOCK permitirá que vários clientes carreguem dados simultaneamente na tabela de destino com log otimizado e bloqueio.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. Para obter mais informações, consulte pré-requisitos para log mínimo em importação em massa.For more information, see Prerequisites for Minimal Logging in Bulk Import.

TABLOCKXTABLOCKX
Especifica que um bloqueio exclusivo será usado na tabela.Specifies that an exclusive lock is taken on the table.

UPDLOCKUPDLOCK
Especifica que bloqueios de atualização serão usados e mantidos até que a transação seja concluída.Specifies that update locks are to be taken and held until the transaction completes. UPDLOCK utiliza bloqueios de atualização apenas em operações de leitura no nível de linha ou de página.UPDLOCK takes update locks for read operations only at the row-level or page-level. Se UPDLOCK for combinado com TABLOCK, ou se um bloqueio em nível de tabela for usado por outro motivo, um bloqueio (X) exclusivo será usado.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 UPDLOCK é especificado, as dicas em nível de isolamento READCOMMITTED e READCOMMITTEDLOCK são ignoradas.When UPDLOCK is specified, the READCOMMITTED and READCOMMITTEDLOCK isolation level hints are ignored. Por exemplo, se o nível de isolamento da sessão for definido como SERIALIZABLE e uma consulta especificar (UPDLOCK, READCOMMITTED), a dica READCOMMITTED será ignorada e a transação será executada usando o nível de 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
Especifica que bloqueios exclusivos serão usados e mantidos até que a transação seja concluída.Specifies that exclusive locks are to be taken and held until the transaction completes. Se especificados com ROWLOCK, PAGLOCK ou TABLOCK, os bloqueios exclusivos serão aplicados ao nível adequado de granularidade.If specified with ROWLOCK, PAGLOCK, or TABLOCK, the exclusive locks apply to the appropriate level of granularity.

RemarksRemarks

As dicas de tabela serão ignoradas se a tabela não for acessada pelo plano de consulta.The table hints are ignored if the table is not accessed by the query plan. Isso pode ser provocado porque o otimizador opta por não acessar a tabela ou porque uma exibição indexada é acessada.This may be caused by the optimizer choosing not to access the table at all, or because an indexed view is accessed instead. No último caso, o acesso a uma exibição indexada pode ser evitado pela dica de consulta OPTION (EXPAND VIEWS).In the latter case, accessing an indexed view can be prevented by using the OPTION (EXPAND VIEWS) query hint.

Todas as dicas de bloqueio são propagadas para todas as tabelas e exibições que são acessadas pelo plano de consulta, incluindo tabelas e exibições referenciadas em uma exibição.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. Além disso, o SQL ServerSQL Server executa os testes de consistência de bloqueio correspondentes.Also, SQL ServerSQL Server performs the corresponding lock consistency checks.

Dicas de bloqueio ROWLOCK, UPDLOCK e XLOCK que adquirem bloqueios em nível de linha colocam bloqueios em chaves de índice em vez das linhas de dados reais.Lock hints ROWLOCK, UPDLOCK, AND XLOCK that acquire row-level locks may place locks on index keys rather than the actual data rows. Por exemplo, se uma tabela tiver um índice não clusterizado e uma instrução SELECT que usa uma dica de bloqueio for tratada por um índice de cobertura, um bloqueio será adquirido na chave do índice de cobertura em vez de na linha de dados da tabela 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 a tabela contiver colunas computadas por expressões ou funções que acessam colunas em outras tabelas, as dicas de tabela não serão usadas nessas tabelas e não serão propagadas.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. Por exemplo, uma dica de tabela NOLOCK é especificada em uma tabela na consulta.For example, a NOLOCK table hint is specified on a table in the query. Essa tabela contém colunas computadas que são computadas por uma combinação de expressões e funções que acessam colunas de outras tabelas.This table has computed columns that are computed by a combination of expressions and functions that access columns in another table. As tabelas referenciadas pelas expressões e funções não usam a dica de tabela NOLOCK quando acessadas.The tables referenced by the expressions and functions do not use the NOLOCK table hint when accessed.

O SQL ServerSQL Server não permite mais de uma dica de tabela de cada um dos seguintes grupos para cada tabela na cláusula FROM: 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:

  • Dicas de granularidade: PAGLOCK, NOLOCK, READCOMMITTEDLOCK, ROWLOCK, TABLOCK ou TABLOCKX.Granularity hints: PAGLOCK, NOLOCK, READCOMMITTEDLOCK, ROWLOCK, TABLOCK, or TABLOCKX.

  • Dicas de nível de isolamento: HOLDLOCK, NOLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE.Isolation level hints: HOLDLOCK, NOLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE.

Dicas de índice filtradoFiltered Index Hints

Um índice filtrado pode ser usado como uma dica de tabela, mas fará com que o otimizador de consulta gere o erro 8622 se ele não cobrir todas as linhas selecionadas pela consulta.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. O seguinte exemplo é uma dica de índice filtrado inválida.The following is an example of an invalid filtered index hint. O exemplo cria o índice filtrado FIBillOfMaterialsWithComponentID e, em seguida, usa-o como uma dica de índice para uma instrução SELECT.The example creates the filtered index FIBillOfMaterialsWithComponentID and then uses it as an index hint for a SELECT statement. O predicado do índice filtrado inclui linhas de dados para ComponentIDs 533, 324 e 753.The filtered index predicate includes data rows for ComponentIDs 533, 324, and 753. O predicado da consulta também inclui linhas de dados para os ComponentIDs 533, 324 e 753, mas estende o conjunto de resultados para incluir os ComponentIDs 855 e 924 que não estão no índice filtrado.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. Portanto, o otimizador de consulta não pode usar a dica de índice filtrado e gera o erro 8622.Therefore, the query optimizer cannot use the filtered index hint and generates error 8622. Para saber mais, confira 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  

O otimizador de consulta não considerará uma dica de índice se as opções SET não tiverem os valores necessários para índices filtrados.The query optimizer will not consider an index hint if the SET options do not have the required values for filtered indexes. Para obter mais informações, consulte CREATE INDEX (Transact-SQL).For more information, see CREATE INDEX (Transact-SQL).

Usando NOEXPANDUsing NOEXPAND

NOEXPAND aplica-se somente ao exibições indexadas.NOEXPAND applies only to indexed views. Uma exibição indexada é uma exibição com um índice clusterizado exclusivo criado nela.An indexed view is a view with a unique clustered index created on it. Se uma consulta tiver referências a colunas presentes em uma exibição indexada e em tabelas base, e o otimizador de consulta determinar que o uso da exibição indexada oferece o melhor método para a execução da consulta, o otimizador de consulta usará o índice na exibição.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. Essa funcionalidade é chamada correspondência de exibição indexada.This functionality is called indexed view matching. Antes de SQL Server 2016SQL Server 2016 SP1, o uso automático de uma exibição indexada pelo otimizador de consulta tem suporte apenas em edições específicas do SQL ServerSQL Server.Prior to SQL Server 2016SQL Server 2016 SP1, automatic use of an indexed view by the query optimizer is supported only in specific editions of SQL ServerSQL Server. Para obter uma lista de recursos com suporte nas edições do SQL ServerSQL Server, consulte Recursos com suporte nas edições do 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.

No entanto, para que o otimizador considere exibições indexadas para correspondência ou uso de uma exibição indexada que é referenciada com a dica NOEXPAND, as seguintes opções SET devem ser definidas como 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.

Observação

Banco de dados do SQL Azure oferece suporte ao uso automático de exibições indexadas sem especificar a dica NOEXPAND.Azure SQL Database 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 é definido implicitamente como ON quando ANSI_WARNINGS for definido como ON.1 ARITHABORT is implicitly set to ON when ANSI_WARNINGS is set to ON. Portanto, você não precisa ajustar essa configuração manualmente.Therefore, you do not have to manually adjust this setting.

Além disso, a opção NUMERIC_ROUNDABORT deve ser definida como OFF.Also, the NUMERIC_ROUNDABORT option must be set to OFF.

Para forçar o otimizador a usar um índice para uma exibição indexada, especifique a opção NOEXPAND.To force the optimizer to use an index for an indexed view, specify the NOEXPAND option. Essa dica poderá ser usada apenas se a exibição também estiver nomeada na consulta.This hint can be used only if the view is also named in the query. O SQL ServerSQL Server não fornece uma dica para forçar o uso de uma exibição indexada específica em uma consulta que não nomeie a exibição diretamente na cláusula FROM. No entanto, o otimizador de consulta considera o uso de exibições indexadas, mesmo que elas não sejam referenciadas diretamente na consulta. 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.

Usando uma dica de tabela como uma dica de consultaUsing a Table Hint as a Query Hint

Dicas de tabela também pode ser especificado como uma dica de consulta usando a cláusula OPTION (dica de tabela).Table hints can also be specified as a query hint by using the OPTION (TABLE HINT) clause. É recomendável usar uma dica de tabela como uma dica de consulta apenas no contexto de um guia de plano.We recommend using a table hint as a query hint only in the context of a plan guide. Para consultas ad hoc, especifique essas dicas apenas como dicas de tabela.For ad-hoc queries, specify these hints only as table hints. Para obter mais informações, veja Dicas de consulta (Transact-SQL).For more information, see Query Hints (Transact-SQL).

PermissõesPermissions

As dicas KEEPIDENTITY, IGNORE_CONSTRAINTS e IGNORE_TRIGGERS requerem permissões ALTER na tabela.The KEEPIDENTITY, IGNORE_CONSTRAINTS, and IGNORE_TRIGGERS hints require ALTER permissions on the table.

ExemplosExamples

A.A. Usando a dica TABLOCK para especificar um método de bloqueioUsing the TABLOCK hint to specify a locking method

O seguinte exemplo especifica que um bloqueio compartilhado será usado na tabela Production.Product no banco de dados AdventureWorks2012AdventureWorks2012 e mantido até o término da instrução 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. Usando a dica FORCESEEK para especificar uma operação de busca de índiceUsing the FORCESEEK hint to specify an index seek operation

O exemplo a seguir usa a dica FORCESEEK sem especificar um índice para forçar o otimizador de consulta a executar uma operação de busca de índice na tabela Sales.SalesOrderDetail no banco de dados 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  

O exemplo a seguir usa a dica FORCESEEK com um índice para forçar o otimizador de consulta a executar uma operação de busca de índice no índice e na coluna de índice especificados.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. Usando a dica FORCESCAN para especificar uma operação de verificação de índiceUsing the FORCESCAN hint to specify an index scan operation

O exemplo a seguir usa a dica FORCESCAN para forçar o otimizador de consultas a executar uma operação de verificação na tabela Sales.SalesOrderDetail no banco de dados 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);  

Consulte tambémSee Also

OPENROWSET (Transact-SQL) OPENROWSET (Transact-SQL)
Hints (Transact-SQL) Hints (Transact-SQL)
Query Hints (Transact-SQL) [Dicas de consulta (Transact-SQL)]Query Hints (Transact-SQL)