Sugerencias (Transact-SQL) - tablaHints (Transact-SQL) - Table

ESTE TEMA SE APLICA A:síSQL Server (a partir de 2008)síAzure SQL DatabasenoAzure SQL Data Warehouse noAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Las sugerencias de tabla invalidan el comportamiento predeterminado del optimizador de consultas mientras dura la instrucción del lenguaje de manipulación de datos (DML) especificando un método de bloqueo, uno o varios índices, una operación de procesamiento de la consulta como un recorrido de tabla o una búsqueda de índice, u otras opciones.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. Las sugerencias de tabla se especifican en la cláusula FROM de la instrucción DML y solo afectan a la tabla o a la vista a la que se hace referencia en esa 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.

Precaución

Como el optimizador de consultas de SQL ServerSQL Server suele seleccionar el mejor plan de ejecución de una consulta, se recomienda que únicamente los administradores de bases de datos y desarrolladores experimentados utilicen las sugerencias como ú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.

Se aplica a:Applies to:

DELETEDELETE

INSERTINSERT

SELECTSELECT

UPDATEUPDATE

COMBINARMERGE

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax


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

CON ( <sugerenciatabla > ) [[, ]... n ]WITH ( <table_hint> ) [ [, ]...n ]
Con algunas excepciones, las sugerencias de tabla se admiten en la cláusula FROM únicamente cuando las sugerencias se especifican con la palabra clave WITH.With some exceptions, table hints are supported in the FROM clause only when the hints are specified with the WITH keyword. Las sugerencias de tabla deben especificarse también con paréntesis.Table hints also must be specified with parentheses.

Importante

Omitir la palabra clave WITH es una característica obsoleta: Esta característica se quitará en una versión futura de Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.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: Esta característica se quitará en una versión futura de Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Las sugerencias de tabla permitidas con y sin la palabra clave WITH son las siguientes: NOLOCK, READUNCOMMITTED, UPDLOCK, REPEATABLEREAD, SERIALIZABLE, READCOMMITTED, FASTFIRSTROW, TABLOCK, TABLOCKX, PAGLOCK, ROWLOCK, NOWAIT, READPAST, XLOCK, SNAPSHOT y 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. Cuando estas sugerencias de tabla se especifican sin la palabra clave WITH, deben especificarse solas.When these table hints are specified without the WITH keyword, the hints should be specified alone. Por ejemplo:For example:

FROM t (TABLOCK)  

Cuando la sugerencia se especifica con otra opción, debe especificarse con la palabra clave WITH:When the hint is specified with another option, the hint must be specified with the WITH keyword:

FROM t WITH (TABLOCK, INDEX(myindex))  

Recomendamos utilizar comas entre las sugerencias de tabla.We recommend using commas between table hints.

Importante

La separación de las sugerencias con espacios en lugar de comas es una característica obsoleta: Esta característica se quitará en una versión futura de Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. No utilice esta característica en nuevos trabajos de desarrollo y modifique lo antes posible las aplicaciones que actualmente la utilizan.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: Esta característica se quitará en una versión futura de Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. No utilice esta característica en nuevos trabajos de desarrollo y modifique lo antes posible las aplicaciones que actualmente la utilizan.Do not use this feature in new development work, and modify applications that currently use this feature as soon as possible.

NOEXPANDNOEXPAND
Especifica que las vistas indizadas no se expandan para obtener acceso a las tablas subyacentes cuando el optimizador de consultas procesa la consulta.Specifies that any indexed views are not expanded to access underlying tables when the query optimizer processes the query. El optimizador de consultas trata la vista como una tabla con un índice clúster.The query optimizer treats the view like a table with clustered index. NOEXPAND solo se aplica a las vistas indizadas.NOEXPAND applies only to indexed views. Para obtener más información, vea la sección Comentarios.For more information, see Remarks.

ÍNDICE (index_value [,... n ] ) | ÍNDICE = ( index_value)INDEX (index_value [,... n ] ) | INDEX = ( index_value)
La sintaxis de INDEX() especifica los nombres o los identificadores de los índices que el optimizador de consultas va a utilizar al procesar la instrucción.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 sintaxis alternativa INDEX = especifica un valor de índice único.The alternative INDEX = syntax specifies a single index value. Solamente se puede especificar una sugerencia de índice por cada tabla.Only one index hint per table can be specified.

Si existe un índice agrupado, INDEX(0) exige un recorrido del índice agrupado e INDEX(1) exige un recorrido o una búsqueda del índice agrupado.If a clustered index exists, INDEX(0) forces a clustered index scan and INDEX(1) forces a clustered index scan or seek. Si no existe un índice clúster, INDEX(0) exige un recorrido de tabla e INDEX(1) se interpreta como error.If no clustered index exists, INDEX(0) forces a table scan and INDEX(1) is interpreted as an error.

Si se utilizan varios índices en una lista de sugerencias, los índices duplicados se omiten y el resto se utiliza para recuperar las filas de la tabla.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. El orden de los índices de la sugerencia de índice es importante.The order of the indexes in the index hint is significant. Una sugerencia de varios índices obliga a hacer AND entre los índices y el optimizador de consultas aplica todas las condiciones posibles a cada uno de los índices a los que tiene acceso.A multiple index hint also enforces index ANDing, and the query optimizer applies as many conditions as possible on each index accessed. Si la colección de índices sugeridos no incluye todas las columnas a las que hace referencia la consulta, se realiza una captura para recuperar las columnas restantes, una vez que Motor de base de datos de SQL ServerSQL Server Database Engine recupera todas las columnas indizadas.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 Motor de base de datos de SQL ServerSQL Server Database Engine retrieves all the indexed columns.

Nota

Cuando se utiliza una sugerencia de índice que hace referencia a varios índices en la tabla de hechos de una combinación en estrella, el optimizador pasa por alto la sugerencia de índice y devuelve un mensaje de advertencia.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. Asimismo, no se admiten las operaciones OR de índices para una tabla con una sugerencia de índice especificada.Also, index ORing is not allowed for a table with an index hint specified.

El número máximo de índices de una sugerencia de tabla es 250 índices no clúster.The maximum number of indexes in the table hint is 250 nonclustered indexes.

KEEPIDENTITYKEEPIDENTITY
Es aplicable únicamente en una instrucción INSERT cuando se usa la opción BULK con OPENROWSET.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

Especifica que se usará el valor o valores de identidad del archivo de datos importado para la columna de identidad.Specifies that identity value or values in the imported data file are to be used for the identity column. Si no se especifica KEEPIDENTITY, los valores de identidad de esta columna se comprueban pero no se importan, y el optimizador de consultas asigna automáticamente valores únicos basados en los valores de inicialización y de incremento especificados durante la creación de la tabla.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

Si el archivo de datos no contiene valores para la columna de identidad de la tabla o vista, y la columna de identidad no es la última columna de la tabla, entonces deberá omitir la columna de identidad.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 obtener más información, vea usar un archivo de formato para omitir un campo de datos ( SQL Server ) .For more information, see Use a Format File to Skip a Data Field (SQL Server). Si una columna de identidad se omite correctamente, el optimizador de consultas asigna automáticamente valores únicos para la columna de identidad en las filas de la tabla 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 obtener un ejemplo que utiliza esta sugerencia en una instrucción INSERT... Seleccione * FROM OPENROWSET BULK, vea mantener identidad valores importaciones masivas de datos ( 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 obtener información acerca de cómo comprobar el valor de identidad para una tabla, vea DBCC CHECKIDENT ( Transact-SQL ) .For information about checking the identity value for a table, see DBCC CHECKIDENT (Transact-SQL).

KEEPDEFAULTSKEEPDEFAULTS
Es aplicable únicamente en una instrucción INSERT cuando se usa la opción BULK con OPENROWSET.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

Especifica la inserción del valor predeterminado de la columna de una tabla, si existe, en lugar de NULL, cuando falta el valor del registro de datos de esa columna.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 obtener un ejemplo que utiliza esta sugerencia en una instrucción INSERT... Seleccione * FROM OPENROWSET BULK, vea mantener valores NULL o usar predeterminado valores durante la importación en bloque ( 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 el optimizador de consultas use solamente una operación de búsqueda de índice como ruta de acceso a los datos de la tabla o la vista.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 de SQL Server 2008 R2 SP1, también se pueden especificar parámetros de índice.Starting with SQL Server 2008 R2 SP1, index parameters can also be specified. En ese caso, el optimizador de consultas solo considera las operaciones de búsqueda de índice mediante el índice especificado usando al menos las columnas 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
Es el nombre o el valor de identificador del índice.Is the index name or index ID value. No se puede especificar el identificador de índice 0 (montón).The index ID 0 (heap) cannot be specified. Para devolver el nombre de índice o el identificador, consulte el sys.indexes vista de catálogo.To return the index name or ID, query the sys.indexes catalog view.

index_column_nameindex_column_name
Es el nombre de la columna de índice que se va a incluir en la operación de búsqueda.Is the name of the index column to include in the seek operation. Especificar FORCESEEK con parámetros de índice es similar a usar FORCESEEK con una sugerencia INDEX.Specifying FORCESEEK with index parameters is similar to using FORCESEEK with an INDEX hint. Sin embargo, puede lograr mayor control sobre la ruta de acceso empleada por el optimizador de consultas si se especifican tanto el índice que se va a buscar como las columnas de índice que hay que tener en cuenta en la operación de búsqueda.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. El optimizador también puede considerar columnas adicionales si es necesario.The optimizer may consider additional columns if needed. Por ejemplo, si se especifica un índice no clúster, el optimizador puede elegir el uso de columnas de clave de índice clúster además de las columnas 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.

La sugerencia FORCESEEK se puede especificar de las maneras siguientes.The FORCESEEK hint can be specified in the following ways.

SintaxisSyntax EjemploExample DescriptionDescription
Sin un índice o sugerencia INDEXWithout an index or INDEX hint FROM dbo.MyTable WITH (FORCESEEK) El optimizador de consultas sólo considera las operaciones de búsqueda de índice para tener acceso a la tabla o la vista mediante cualquier índice pertinente.The query optimizer considers only index seek operations to access the table or view through any relevant index.
Combinado con una sugerencia INDEXCombined with an INDEX hint FROM dbo.MyTable WITH (FORCESEEK, INDEX (MyIndex)) El optimizador de consultas solo considera las operaciones de búsqueda de índice para tener acceso a la tabla o la vista mediante el índice especificado.The query optimizer considers only index seek operations to access the table or view through the specified index.
Parametrizado especificando un índice y columnas de índiceParameterized by specifying an index and index columns FROM dbo.MyTable WITH (FORCESEEK (MyIndex (col1, col2, col3))) El optimizador de consultas solo considera las operaciones de búsqueda de índice para tener acceso a la tabla o la vista mediante el índice especificado usando al menos las columnas 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.

Cuando se usa la sugerencia FORCESEEK (con o sin parámetros de índice), tenga en cuenta las directrices siguientes.When using the FORCESEEK hint (with or without index parameters), consider the following guidelines.

  • La sugerencia se puede especificar como sugerencia de tabla o como sugerencia de consulta.The hint can be specified as a table hint or as a query hint. Para obtener más información acerca de las sugerencias de consulta, vea sugerencias de consulta ( Transact-SQL ) .For more information about query hints, see Query Hints (Transact-SQL).

  • Para aplicar FORCESEEK a una vista indizada, se debe especificar también la sugerencia NOEXPAND.To apply FORCESEEK to an indexed view, the NOEXPAND hint must also be specified.

  • La sugerencia se puede aplicar una vez por tabla o vista como máximo.The hint can be applied at most once per table or view.

  • No se puede especificar la sugerencia para un origen de datos remoto.The hint cannot be specified for a remote data source. Se devuelve el error 7377 cuando se especifica FORCESEEK con una sugerencia de índice y el error 8180 cuando se usa FORCESEEK sin una sugerencia 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.

  • Si FORCESEEK hace que no se encuentre ningún plan, se devuelve el error 8622.If FORCESEEK causes no plan to be found, error 8622 is returned.

    Cuando FORCESEEK se especifica con parámetros de índice, se aplican las siguientes directrices y restricciones.When FORCESEEK is specified with index parameters, the following guidelines and restrictions apply.

  • La sugerencia no se puede especificar para una tabla que es el destino de una instrucción INSERT, UPDATE o DELETE.The hint cannot be specified for a table that is the target of an INSERT, UPDATE, or DELETE statement.

  • La sugerencia no se puede especificar junto con una sugerencia INDEX o con otra sugerencia FORCESEEK.The hint cannot be specified in combination with either an INDEX hint or another FORCESEEK hint.

  • Se debe especificar al menos una columna y debe ser la columna de clave inicial.At least one column must be specified and it must be the leading key column.

  • Se pueden especificar columnas de índice adicionales, aunque no se pueden omitir columnas de clave.Additional index columns can be specified, however, key columns cannot be skipped. Por ejemplo, si el índice especificado contiene las columnas de clave a, b y c, FORCESEEK (MyIndex (a)) y FORCESEEK (MyIndex (a, b) serían sintaxis válidas.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). También serían sintaxis válidas FORCESEEK (MyIndex (c)) y FORCESEEK (MyIndex (a, c).Invalid syntax would include FORCESEEK (MyIndex (c)) and FORCESEEK (MyIndex (a, c).

  • El orden de los nombres de columna especificados en la sugerencia debe coincidir con el orden de las columnas en el índice al que se hace referencia.The order of column names specified in the hint must match the order of the columns in the referenced index.

  • No se pueden especificar columnas que no estén en la definición de clave de índice.Columns that are not in the index key definition cannot be specified. Por ejemplo, en un índice no clúster solo se pueden especificar las columnas de clave de índice definidas.For example, in a nonclustered index, only the defined index key columns can be specified. No se pueden especificar columnas de clave clúster que se incluyen automáticamente en el índice, aunque el optimizador puede usarlas.Clustered key columns that are automatically included in the index cannot be specified, but may be used by the optimizer.

  • Un índice de almacén de columnas con optimización para memoria xVelocity no se puede especificar como parámetro de índice.An xVelocity memory optimized columnstore index cannot be specified as an index parameter. Se devuelve el error 366.Error 366 is returned.

  • La modificación de la definición de índice (por ejemplo, agregando o quitando columnas) puede hacer que sea necesario modificar las consultas que hacen referencia a dicho índice.Modifying the index definition (for example, by adding or removing columns) may require modifications to the queries that reference that index.

  • La sugerencia impide que el optimizador considere ningún índice espacial o XML de la tabla.The hint prevents the optimizer from considering any spatial or XML indexes on the table.

  • La sugerencia no se puede especificar junto con la sugerencia FORCESCAN.The hint cannot be specified in combination with the FORCESCAN hint.

  • En el caso de índices con particiones, la columna de partición agregada implícitamente por SQL ServerSQL Server no se puede especificar en la sugerencia FORCESEEK.For partitioned indexes, the partitioning column implicitly added by SQL ServerSQL Server cannot be specified in the FORCESEEK hint.

Precaución

Al especificar FORCESEEK con parámetros se limita el número de planes que el optimizador puede considerar en comparación con cuando se especifica FORCESEEK sin 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. Esto puede producir un error "No se puede generar el plan" en más casos.This may cause a "Plan cannot be generated" error to occur in more cases. En una versión futura, las modificaciones internas realizadas en el optimizador pueden permitir que se consideren más planes.In a future release, internal modifications to the optimizer may allow more plans to be considered.

FORCESCANFORCESCAN
Esta sugerencia, presentada en SQL Server 2008 R2 SP1, especifica que el optimizador de consultas solo usa una operación de examen de índice como ruta de acceso a la tabla o la vista a la que se hace referencia.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. La sugerencia FORCESCAN puede ser útil para consultas en las que el optimizador subestima el número de filas afectadas y elige una operación de búsqueda en lugar de una operación de examen.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. Cuando esto ocurre, la cantidad de memoria asignada a la operación es demasiado pequeña y el rendimiento de la consulta se ve afectado.When this occurs, the amount of memory granted for the operation is too small and query performance is impacted.

FORCESCAN se puede especificar con o sin una sugerencia INDEX.FORCESCAN can be specified with or without an INDEX hint. Cuando se combina con una sugerencia de índice, (INDEX = index_name, FORCESCAN), el optimizador de consultas solo considera el examen de rutas de acceso mediante el índice especificado al tener acceso a la tabla a la que se hace referencia.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. Se puede especificar FORCESCAN con la sugerencia de índice INDEX(0) para forzar una operación de recorrido de tabla en la tabla base.FORCESCAN can be specified with the index hint INDEX(0) to force a table scan operation on the base table.

En las tablas y los índices con particiones, FORCESCAN se aplica una vez eliminadas las particiones mediante la evaluación de predicados de las consultas.For partitioned tables and indexes, FORCESCAN is applied after partitions have been eliminated through query predicate evaluation. Esto significa que el recorrido se aplica únicamente a las particiones restantes, no a toda la tabla.This means that the scan is applied only to the remaining partitions and not to the entire table.

La sugerencia FORCESCAN tiene las restricciones siguientes.The FORCESCAN hint has the following restrictions.

  • La sugerencia no se puede especificar para una tabla que es el destino de una instrucción INSERT, UPDATE o DELETE.The hint cannot be specified for a table that is the target of an INSERT, UPDATE, or DELETE statement.

  • La sugerencia no se puede emplear con más de una sugerencia de índice.The hint cannot be used with more than one index hint.

  • La sugerencia impide que el optimizador considere ningún índice espacial o XML de la tabla.The hint prevents the optimizer from considering any spatial or XML indexes on the table.

  • No se puede especificar la sugerencia para un origen de datos remoto.The hint cannot be specified for a remote data source.

  • La sugerencia no se puede especificar junto con la sugerencia FORCESEEK.The hint cannot be specified in combination with the FORCESEEK hint.

    HOLDLOCKHOLDLOCK
    Equivalente a SERIALIZABLE.Is equivalent to SERIALIZABLE. Para obtener más información, vea SERIALIZABLE más adelante en este tema.For more information, see SERIALIZABLE later in this topic. HOLDLOCK solo se aplica a la tabla o la vista para la que se especificó, y únicamente durante la transacción definida por la instrucción en la que se usa.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 no se puede usar en una instrucción SELECT que incluya la opción FOR BROWSE.HOLDLOCK cannot be used in a SELECT statement that includes the FOR BROWSE option.

    IGNORE_CONSTRAINTSIGNORE_CONSTRAINTS
    Es aplicable únicamente en una instrucción INSERT cuando se usa la opción BULK con OPENROWSET.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

    Especifica que la operación de importación masiva ignora las restricciones de la tabla.Specifies that any constraints on the table are ignored by the bulk-import operation. De forma predeterminada, inserte comprobaciones restricciones Unique y restricciones Check y principal y las restricciones de clave externa.By default, INSERT checks Unique Constraints and Check Constraints and Primary and Foreign Key Constraints. Cuando IGNORE_CONSTRAINTS se especifica para una operación de importación masiva, INSERT debe ignorar estas restricciones en una tabla de destino.When IGNORE_CONSTRAINTS is specified for a bulk-import operation, INSERT must ignore these constraints on a target table. Tenga en cuenta que no puede deshabilitar las restricciones UNIQUE, PRIMARY KEY o NOT NULL.Note that you cannot disable UNIQUE, PRIMARY KEY, or NOT NULL constraints.

    Puede ser conveniente deshabilitar las instrucciones CHECK y FOREING KEY si los datos de entrada contienen filas que infringen las restricciones.You might want to disable CHECK and FOREIGN KEY constraints if the input data contains rows that violate constraints. Si se deshabilitan las restricciones CHECK y FOREIGN KEY, se pueden importar los datos y, a continuación, utilizar instrucciones Transact-SQLTransact-SQL para limpiarlos.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.

    Sin embargo, si se omiten las restricciones CHECK y FOREIGN KEY, cada restricciones omitidas de la tabla se marcan como is_not_trusted en el sys.check_constraints o sys.foreign_keys vista de catálogo después de la operación.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. En algún momento, deberá comprobar las restricciones en la tabla completa.At some point, you should check the constraints on the whole table. Si la tabla no estaba vacía antes de la operación de importación masiva, el costo de volver a validar la restricción puede ser mayor que el costo de aplicar las restricciones CHECK o FOREIGN KEY a los datos incrementales.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
    Es aplicable únicamente en una instrucción INSERT cuando se usa la opción BULK con OPENROWSET.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

    Especifica que la operación de importación masiva ignore todos los desencadenadores definidos en la tabla.Specifies that any triggers defined on the table are ignored by the bulk-import operation. De manera predeterminada, INSERT aplica desencadenadores.By default, INSERT applies triggers.

    Use IGNORE_TRIGGERS únicamente si su aplicación no depende de ningún desencadenador y es importante maximizar el rendimiento.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 obtener más información, vea READUNCOMMITTED más adelante en este mismo tema.For more information, see READUNCOMMITTED later in this topic.

Nota

Para las instrucciones UPDATE o DELETE: Esta característica se quitará en una versión futura de Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.For UPDATE or DELETE statements: Esta característica se quitará en una versión futura de Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

NOWAITNOWAIT
Indica a Motor de base de datosDatabase Engine que devuelva un mensaje cuando encuentre un bloqueo en la tabla.Instructs the Motor de base de datosDatabase Engine to return a message as soon as a lock is encountered on the table. NOWAIT equivale a especificar SET LOCK_TIMEOUT 0 para una tabla específica.NOWAIT is equivalent to specifying SET LOCK_TIMEOUT 0 for a specific table. La sugerencia NOWAIT no funciona cuando también se incluye la sugerencia TABLOCK.The NOWAIT hint does not work when the TABLOCK hint is also included. Para terminar una consulta sin esperas cuando se usa la sugerencia TABLOCK, preceda el nombre de la consulta con SETLOCK_TIMEOUT 0; en su lugar.To terminate a query without waiting when using the TABLOCK hint, preface the query with SETLOCK_TIMEOUT 0; instead.

PAGLOCKPAGLOCK
Aplica bloqueos de página en los casos en que se suelen aplicar bloqueos individuales en filas o claves, o bien en los casos en los que se suele aplicar un único bloqueo de tabla.Takes page locks either where individual locks are ordinarily taken on rows or keys, or where a single table lock is ordinarily taken. De manera predeterminada, utiliza el modo de bloqueo apropiado para la operación.By default, uses the lock mode appropriate for the operation. Cuando se especifica en transacciones que funcionan con el nivel de aislamiento SNAPSHOT, no se utilizan bloqueos de página a menos que se combine PAGLOCK con otras sugerencias de tabla que requieran bloqueos, como UPDLOCK y 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 las operaciones de lectura cumplan las reglas del nivel de aislamiento READ COMMITTED, a través del uso de bloqueos o control de versiones de filas.Specifies that read operations comply with the rules for the READ COMMITTED isolation level by using either locking or row versioning. Si la opción de la base de datos READ_COMMITTED_SNAPSHOT está establecida en OFF, Motor de base de datosDatabase Engine adquiere bloqueos compartidos a medida que se leen los datos y los libera cuando finaliza la operación de lectura.If the database option READ_COMMITTED_SNAPSHOT is OFF, the Motor de base de datosDatabase Engine acquires shared locks as data is read and releases those locks when the read operation is completed. Si la opción de base de datos READ_COMMITTED_SNAPSHOT está establecida en ON, el Motor de base de datosDatabase Engine no adquiere bloqueos y utiliza el control de versiones de filas.If the database option READ_COMMITTED_SNAPSHOT is ON, the Motor de base de datosDatabase Engine does not acquire locks and uses row versioning. Para obtener más información acerca de los niveles de aislamiento, consulte SET TRANSACTION ISOLATION LEVEL ( Transact-SQL ) .For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

Nota

Para las instrucciones UPDATE o DELETE: Esta característica se quitará en una versión futura de Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.For UPDATE or DELETE statements: Esta característica se quitará en una versión futura de Microsoft SQL Server.This feature will be removed in a future version of Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

READCOMMITTEDLOCKREADCOMMITTEDLOCK
Especifica que las operaciones de lectura cumplan, mediante el uso de bloqueos, las reglas del nivel de aislamiento READ COMMITTED.Specifies that read operations comply with the rules for the READ COMMITTED isolation level by using locking. El Motor de base de datosDatabase Engine adquiere bloqueos compartidos a medida que se leen los datos y los libera cuando se completa la operación de lectura, independientemente de la configuración de la opción de base de datos READ_COMMITTED_SNAPSHOT.The Motor de base de datosDatabase 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 obtener más información acerca de los niveles de aislamiento, consulte SET TRANSACTION ISOLATION LEVEL ( Transact-SQL ) .For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL). Esta sugerencia no se puede especificar en la tabla de destino de una instrucción INSERT; de lo contrario, se devuelve el error 4140.This hint cannot be specified on the target table of an INSERT statement; error 4140 is returned.

READPASTREADPAST
Especifica que Motor de base de datosDatabase Engine no lea las filas bloqueadas por otras transacciones.Specifies that the Motor de base de datosDatabase Engine not read rows that are locked by other transactions. Cuando se especifica READPAST, se omiten los bloqueos de nivel de fila pero no se omiten los bloqueos de nivel de página.When READPAST is specified, row-level locks are skipped but page-level locks are not skipped. Es decir, Motor de base de datosDatabase Engine omite las filas en lugar de bloquear la transacción actual hasta que se liberen los bloqueos.That is, the Motor de base de datosDatabase Engine skips past the rows instead of blocking the current transaction until the locks are released. Suponga, por ejemplo, una tabla T1 que contiene una única columna de tipo entero con los 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. Si una transacción A cambia el valor de 3 a 8 pero aún no se ha confirmado, una instrucción SELECT * FROM T1 (READPAST) generará los 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 se utiliza principalmente para reducir la contención de bloqueo al implementar una cola de trabajo que usa un SQL ServerSQL Server tabla.READPAST is primarily used to reduce locking contention when implementing a work queue that uses a SQL ServerSQL Server table. Un lector de cola que utilice READPAST omite las entradas de cola bloqueadas por otras transacciones y pasa a la siguiente entrada de cola disponible, sin tener que esperar a que las otras transacciones liberen los bloqueos.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 se puede especificar para cualquier tabla a la que se haga referencia en una instrucción UPDATE o DELETE, o en una 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. Cuando se especifica en una instrucción UPDATE, READPAST solamente se aplica al leer los datos para identificar los registros que se van a actualizar, independientemente de dónde se especifique en la instrucción.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. No se puede especificar READPAST para tablas en la cláusula INTO de una instrucción INSERT.READPAST cannot be specified for tables in the INTO clause of an INSERT statement. Las operaciones de actualización o eliminación que utilizan READPAST se pueden bloquear al leer claves externas o vistas indizadas, o al modificar índices secundarios.Update or delete operations that use READPAST may block when reading foreign keys or indexed views, or when modifying secondary indexes.

READPAST solamente se puede especificar en transacciones que funcionen con niveles de aislamiento READ COMMITTED o REPEATABLE READ.READPAST can only be specified in transactions operating at the READ COMMITTED or REPEATABLE READ isolation levels. Cuando se especifica en transacciones que funcionan con el nivel de aislamiento SNAPSHOT, READPAST debe combinarse con otras sugerencias de tabla que requieran bloqueos, como UPDLOCK y 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.

No se puede especificar la sugerencia de tabla READPAST cuando la opción de base de datos READ_COMMITTED_SNAPSHOT esté establecida en ON y se cumpla alguna de las condiciones siguientes.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.

  • El nivel de aislamiento de transacción de la sesión es READ COMMITTED.The transaction isolation level of the session is READ COMMITTED.

  • La sugerencia de tabla READCOMMITTED también se especifica en la consulta.The READCOMMITTED table hint is also specified in the query.

    Para especificar la sugerencia READPAST en estos casos, quite la sugerencia de tabla READCOMMITTED, si está presente, e incluya la sugerencia de tabla READCOMMITTEDLOCK en la 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 se admiten lecturas no actualizadas.Specifies that dirty reads are allowed. No se emiten bloqueos compartidos para impedir que otras transacciones modifiquen los datos leídos por la transacción actual, mientras que los bloqueos exclusivos establecidos por otras transacciones no impiden que la transacción actual lea los datos 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. La posibilidad de efectuar lecturas no actualizadas aumenta en gran medida la simultaneidad, pero a costa de leer modificaciones de datos que otras transacciones revierten más adelante.Allowing dirty reads can cause higher concurrency, but at the cost of reading data modifications that then are rolled back by other transactions. Esto puede generar errores en la transacción, presentar a los usuarios datos no confirmados o hacer que los usuarios vean los registros dos veces (o nunca).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).

    Las sugerencias READUNCOMMITTED y NOLOCK solamente se aplican a bloqueos de datos.READUNCOMMITTED and NOLOCK hints apply only to data locks. Todas las consultas, incluidas las que tienen sugerencias READUNCOMMITTED y NOLOCK, adquieren bloqueos Sch-S (estabilidad del esquema) durante la compilación y la ejecución.All queries, including those with READUNCOMMITTED and NOLOCK hints, acquire Sch-S (schema stability) locks during compilation and execution. Debido a ello, las consultas se bloquean cuando una transacción simultánea aloja un bloqueo de modificación del esquema (Sch-M) en la tabla.Because of this, queries are blocked when a concurrent transaction holds a Sch-M (schema modification) lock on the table. Por ejemplo, una operación de lenguaje de definición de datos (DDL) adquiere un bloqueo Sch-M antes de modificar la información del esquema de la tabla.For example, a data definition language (DDL) operation acquires a Sch-M lock before it modifies the schema information of the table. Las consultas simultáneas, incluidas las que se ejecutan con sugerencias READUNCOMMITTED o NOLOCK, se bloquean cuando intentan adquirir un bloqueo Sch-S.Any concurrent queries, including those running with READUNCOMMITTED or NOLOCK hints, are blocked when attempting to acquire a Sch-S lock. A la inversa, una consulta que mantiene un bloqueo Sch-S bloquea una transacción simultánea que intenta adquirir un bloqueo Sch-M.Conversely, a query holding a Sch-S lock blocks a concurrent transaction that attempts to acquire a Sch-M lock.

    No se pueden especificar READUNCOMMITTED ni NOLOCK en tablas modificadas por operaciones de inserción, actualización y eliminación.READUNCOMMITTED and NOLOCK cannot be specified for tables modified by insert, update, or delete operations. El optimizador de consultas de SQL ServerSQL Server omite las sugerencias READUNCOMMITTED y NOLOCK de la cláusula FROM que se aplica a la tabla de destino de una instrucción 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

En una versión futura de SQL ServerSQL Server se quitará el uso de las sugerencias READUNCOMMITTED y NOLOCK en la cláusula FROM que se aplican a la tabla de destino de una instrucción 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. Evite usar estas sugerencias en este contexto en el nuevo trabajo de desarrollo y planee modificar las aplicaciones que las usan actualmente.Avoid using these hints in this context in new development work, and plan to modify applications that currently use them.

Si lo desea, también puede reducir al mínimo el conflicto de bloqueos mientras protege las transacciones de lecturas de datos no actualizados de modificaciones de datos no confirmadas mediante una de estas dos alternativas:You can minimize locking contention while protecting transactions from dirty reads of uncommitted data modifications by using either of the following:

  • El nivel de aislamiento READ COMMITTED con la opción de base de datos READ_COMMITTED_SNAPSHOT establecida en ON.The READ COMMITTED isolation level with the READ_COMMITTED_SNAPSHOT database option set ON.

  • El nivel de aislamiento SNAPSHOT.The SNAPSHOT isolation level.

    Para obtener más información acerca de los niveles de aislamiento, consulte SET TRANSACTION ISOLATION LEVEL ( Transact-SQL ) .For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

Nota

Si al especificar READUNCOMMITTED, recibe el mensaje de error 601, resuélvalo como si fueran errores de interbloqueo (1205) y vuelva a ejecutar la instrucción.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 el recorrido se haga con la misma semántica de bloqueo que una transacción que se ejecute con el nivel de aislamiento REPEATABLE READ.Specifies that a scan is performed with the same locking semantics as a transaction running at REPEATABLE READ isolation level. Para obtener más información acerca de los niveles de aislamiento, consulte SET TRANSACTION ISOLATION LEVEL ( Transact-SQL ) .For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

ROWLOCKROWLOCK
Especifica que se apliquen bloqueos de fila cuando normalmente se aplicarían bloqueos de página o de tabla.Specifies that row locks are taken when page or table locks are ordinarily taken. Cuando se especifica en transacciones que funcionan con el nivel de aislamiento SNAPSHOT, no se utilizan bloqueos de fila a menos que se combine ROWLOCK con otras sugerencias de tabla que requieran bloqueos, como UPDLOCK y 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. Hace que los bloqueos compartidos sean más restrictivos, manteniéndolos hasta la finalización de la transacción, en lugar de liberarlos cuando la tabla o página de datos deja de ser necesaria, se haya completado la transacción o no.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. El recorrido se hace con la misma semántica que una transacción que se ejecuta con el nivel de aislamiento SERIALIZABLE.The scan is performed with the same semantics as a transaction running at the SERIALIZABLE isolation level. Para obtener más información acerca de los niveles de aislamiento, consulte SET TRANSACTION ISOLATION LEVEL ( Transact-SQL ) .For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

SNAPSHOTSNAPSHOT
Se aplica a: desde SQL Server 2014SQL Server 2014 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2014SQL Server 2014 through SQL Server 2017SQL Server 2017.

Se tiene acceso a la tabla con optimización para memoria con aislamiento SNAPSHOT.The memory-optimized table is accessed under SNAPSHOT isolation. SNAPSHOT solo se puede utilizar con tablas con optimización para memoria (no con tablas basadas en disco).SNAPSHOT can only be used with memory-optimized tables (not with disk-based tables). Para obtener más información, consulte Introducción a las tablas con optimización para 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 = enteroSPATIAL_WINDOW_MAX_CELLS = integer
Se aplica a: desde SQL Server 2012SQL Server 2012 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2012SQL Server 2012 through SQL Server 2017SQL Server 2017.

Especifica el número máximo de celdas que se van a usar para teselar un objeto de geometría o geografía.Specifies the maximum number of cells to use for tessellating a geometry or geography object. número es un valor entre 1 y 8192.number is a value between 1 and 8192.

Esta opción permite optimizar el tiempo de ejecución de la consulta ajustando el equilibrio entre el tiempo de ejecución del filtro primario y secundario.This option allows for fine-tuning of query execution time by adjusting the tradeoff between primary and secondary filter execution time. Un número mayor reduce el tiempo de ejecución del filtro secundario, pero aumenta el tiempo de ejecución del filtro primario y un número menor disminuye el tiempo de ejecución del filtro primario, pero aumenta el tiempo de ejecución del filtro secundario.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. En el caso de datos espaciales más densos, un número mayor debe producir un tiempo de ejecución más rápido proporcionando una mejor aproximación con el filtro primario y reduciendo el tiempo de ejecución del filtro secundario.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. Si se trata de datos más dispersos, un número menor disminuirá el tiempo de ejecución del filtro primario.For sparser data, a lower number will decrease the primary filter execution time.

Esta opción funciona para las teselaciones de cuadrícula manuales y automáticas.This option works for both manual and automatic grid tessellations.

TABLOCKTABLOCK
Especifica que el bloqueo adquirido se aplique en el nivel de tabla.Specifies that the acquired lock is applied at the table level. El tipo de bloqueo que se ha adquirido depende de la instrucción que se esté ejecutando.The type of lock that is acquired depends on the statement being executed. Por ejemplo, una instrucción SELECT puede adquirir un bloqueo compartido.For example, a SELECT statement may acquire a shared lock. Al especificar TABLOCK, el bloqueo compartido se aplica a toda la tabla, no en el nivel de fila o de página.By specifying TABLOCK, the shared lock is applied to the entire table instead of at the row or page level. Si también se especifica HOLDLOCK, el bloqueo de tabla se mantiene hasta el final de la transacción.If HOLDLOCK is also specified, the table lock is held until the end of the transaction.

Al importar datos en un montón mediante INSERT INTO <target_table > seleccione <columnas > FROM <source_table > instrucción, puede habilitar el bloqueo de la instrucción mediante la especificación y el registro optimizados el Sugerencia TABLOCK para la tabla 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. Además, el modelo de recuperación de la base de datos debe establecerse en registro simple o masivo.In addition, the recovery model of the database must be set to simple or bulk-logged. Para obtener más información, vea INSERT (Transact-SQL).For more information, see INSERT (Transact-SQL).

Cuando se usa con la OPENROWSET proveedor de conjuntos de filas de forma masiva para importar datos en una tabla, TABLOCK permite que varios clientes carguen datos simultáneamente en la tabla de destino con el bloqueo y el registro optimizados.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 obtener más información, consulte requisitos previos para el registro mínimo durante la importación masiva.For more information, see Prerequisites for Minimal Logging in Bulk Import.

TABLOCKXTABLOCKX
Especifica que se aplique un bloqueo exclusivo en la tabla.Specifies that an exclusive lock is taken on the table.

UPDLOCKUPDLOCK
Especifica que se apliquen bloqueos de actualización y se mantengan hasta que se complete la transacción.Specifies that update locks are to be taken and held until the transaction completes. UPDLOCK aplica bloqueos de actualización para operaciones de lectura solo en el nivel de fila o de página.UPDLOCK takes update locks for read operations only at the row-level or page-level. Si UPDLOCK se combina con TABLOCK, o si se aplica un bloqueo de nivel de tabla por alguna otra razón, se aplicará un bloqueo exclusivo (X) en su lugar.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.

Cuando se especifica UPDLOCK, las sugerencias de nivel de aislamiento READCOMMITTED y READCOMMITTEDLOCK se omiten.When UPDLOCK is specified, the READCOMMITTED and READCOMMITTEDLOCK isolation level hints are ignored. Por ejemplo, si el nivel de aislamiento de la sesión se establece en SERIALIZABLE y una consulta especifica (UPDLOCK, READCOMMITTED), la sugerencia READCOMMITTED se omitirá y la transacción se ejecutará usando el nivel de aislamiento 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 se apliquen bloqueos exclusivos y se mantengan hasta que se complete la transacción.Specifies that exclusive locks are to be taken and held until the transaction completes. Si se especifica junto con ROWLOCK, PAGLOCK o TABLOCK, los bloqueos exclusivos se aplican al nivel de granularidad apropiado.If specified with ROWLOCK, PAGLOCK, or TABLOCK, the exclusive locks apply to the appropriate level of granularity.

ComentariosRemarks

Las sugerencias de tabla se pasan por alto si el plan de consulta no tiene acceso a la tabla.The table hints are ignored if the table is not accessed by the query plan. Esto puede deberse a que el optimizador elija no tener acceso a la tabla o a que, en su lugar, se tenga acceso a una vista indizada.This may be caused by the optimizer choosing not to access the table at all, or because an indexed view is accessed instead. En el último caso, el acceso a una vista indizada puede evitarse con la sugerencia 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 las sugerencias de bloqueo se propagan a todas las tablas y vistas a las que tiene acceso el plan de consulta, incluidas las tablas y vistas a las que se hace referencia en 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. Asimismo, SQL ServerSQL Server lleva a cabo las comprobaciones de coherencia de bloqueo correspondientes.Also, SQL ServerSQL Server performs the corresponding lock consistency checks.

Las sugerencias de bloqueo ROWLOCK, UPDLOCK y XLOCK que adquieren bloqueos de nivel de fila pueden aplicar bloqueos a claves de índice en lugar de a las filas de datos.Lock hints ROWLOCK, UPDLOCK, AND XLOCK that acquire row-level locks may place locks on index keys rather than the actual data rows. Por ejemplo, si una tabla tiene un índice no clúster y un índice de cobertura controla una instrucción SELECT que utiliza una sugerencia de bloqueo, se aplicará un bloqueo a la clave de índice en el índice de cobertura en lugar de aplicarse a la fila de datos de la tabla 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.

Si una tabla contiene columnas calculadas mediante expresiones o funciones que tienen acceso a columnas de otras tablas, las sugerencias de tabla no se utilizan en las otras tablas y no se propagan.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 ejemplo, una sugerencia de tabla NOLOCK se especifica para una tabla de la consulta.For example, a NOLOCK table hint is specified on a table in the query. Esta tabla tiene columnas calculadas que se calculan mediante una combinación de expresiones y funciones que tienen acceso a columnas de otra tabla.This table has computed columns that are computed by a combination of expressions and functions that access columns in another table. En las tablas a las que hacen referencia estas expresiones y funciones no se utiliza la sugerencia de tabla NOLOCK cuando se tiene acceso.The tables referenced by the expressions and functions do not use the NOLOCK table hint when accessed.

SQL ServerSQL Server no permite más de una sugerencia de tabla de cada uno de los siguientes grupos para cada tabla en la cláusula FROM: does not allow for more than one table hint from each of the following groups for each table in the FROM clause:

  • Sugerencias de granularidad: PAGLOCK, NOLOCK, READCOMMITTEDLOCK, ROWLOCK, TABLOCK o TABLOCKX.Granularity hints: PAGLOCK, NOLOCK, READCOMMITTEDLOCK, ROWLOCK, TABLOCK, or TABLOCKX.

  • Sugerencias de nivel de aislamiento: HOLDLOCK, NOLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE.Isolation level hints: HOLDLOCK, NOLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE.

Sugerencias de índice filtradoFiltered Index Hints

Un índice filtrado puede usarse como una sugerencia de tabla, pero hará que el optimizador de consultas generar el error 8622 si no cubre todas las filas que la consulta selecciona.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. A continuación se muestra un ejemplo de una sugerencia de índice filtrado no válida.The following is an example of an invalid filtered index hint. En el ejemplo se crea el índice filtrado FIBillOfMaterialsWithComponentID que, a continuación, se utiliza como una sugerencia de índice para una instrucción SELECT.The example creates the filtered index FIBillOfMaterialsWithComponentID and then uses it as an index hint for a SELECT statement. El predicado de índice filtrado incluye las filas de datos para los ComponentID 533, 324 y 753.The filtered index predicate includes data rows for ComponentIDs 533, 324, and 753. El predicado de consulta también incluye las filas de datos para los ComponentID 533, 324 y 753, pero amplía el conjunto de resultados para incluir los ComponentID 855 y 924, que no están en el í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. Por tanto, el optimizador de consultas no puede usar la sugerencia de índice filtrado y genera el error 8622.Therefore, the query optimizer cannot use the filtered index hint and generates error 8622. Para obtener más información, consulte 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  

El optimizador de consultas no considerará una sugerencia de índice si las opciones SET no tienen los valores necesarios para los í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 obtener más información, vea CREATE INDEX (Transact-SQL).For more information, see CREATE INDEX (Transact-SQL).

Usar NOEXPANDUsing NOEXPAND

NOEXPAND solo se aplica a vistas indizadas.NOEXPAND applies only to indexed views. Una vista indizada es una vista con un único índice clúster creado en ella.An indexed view is a view with a unique clustered index created on it. Si una consulta tiene referencias a columnas que están presentes en una vista indizada y en tablas base, y el optimizador de consultas determina que el uso de vistas indizadas proporciona el mejor método para ejecutar la consulta, el optimizador de consultas utiliza el índice en la vista.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. Esta funcionalidad se denomina coincidencia de vista indizada.This functionality is called indexed view matching. Anteriores a SQL Server 2016SQL Server 2016 SP1, el uso automático de una vista indizada por el optimizador de consultas solo se admite en ediciones concretas de 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 obtener una lista de las características admitidas por las ediciones de SQL ServerSQL Server, vea Características compatibles con las ediciones de 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.

Sin embargo, para que el optimizador considere las vistas indizadas para establecer coincidencias o utilice una vista indizada a la que se hace referencia con una sugerencia NOEXPAND, las siguientes opciones SET deben estar establecidas en 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

La base de datos de SQL Azure es compatible con el uso automático de vistas indizadas sin especificar la sugerencia 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 se establece implícitamente en ON al establecer ANSI_WARNINGS en ON.1 ARITHABORT is implicitly set to ON when ANSI_WARNINGS is set to ON. Por lo tanto, no es necesario ajustar manualmente este valor.Therefore, you do not have to manually adjust this setting.

Asimismo, la opción NUMERIC_ROUNDABORT debe establecerse en OFF.Also, the NUMERIC_ROUNDABORT option must be set to OFF.

Para exigir que el optimizador utilice un índice para una vista indizada, especifique la opción NOEXPAND.To force the optimizer to use an index for an indexed view, specify the NOEXPAND option. Esta sugerencia solo se puede usar si la vista también aparece en la consulta.This hint can be used only if the view is also named in the query. SQL ServerSQL Server no proporciona ninguna sugerencia que obligue a usar una vista indizada determinada en una consulta que no mencione la vista directamente en la cláusula FROM. Sin embargo, el optimizador de consultas considera el uso de vistas indizadas, incluso aunque no se haga referencia directa a ellas en la consulta. 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.

Usar una sugerencia de tabla como una sugerencia de consultaUsing a Table Hint as a Query Hint

Sugerencias de tabla también puede especificarse como una sugerencia de consulta mediante la cláusula OPTION (TABLE HINT).Table hints can also be specified as a query hint by using the OPTION (TABLE HINT) clause. Se recomienda usar una sugerencia de tabla como una sugerencia de consulta únicamente en el contexto de un Guía de plan.We recommend using a table hint as a query hint only in the context of a plan guide. Para las consultas ad hoc, especifique estas sugerencias únicamente como sugerencias de tabla.For ad-hoc queries, specify these hints only as table hints. Para obtener más información, vea Sugerencias de consulta (Transact-SQL).For more information, see Query Hints (Transact-SQL).

PermissionsPermissions

Las sugerencias KEEPIDENTITY, IGNORE_CONSTRAINTS e IGNORE_TRIGGERS requieren permisos ALTER en la tabla.The KEEPIDENTITY, IGNORE_CONSTRAINTS, and IGNORE_TRIGGERS hints require ALTER permissions on the table.

EjemplosExamples

A.A. Usar la sugerencia TABLOCK para especificar un método de bloqueoUsing the TABLOCK hint to specify a locking method

En el ejemplo siguiente se especifica que se aplique un bloqueo compartido a la tabla Production.Product de la base de datos AdventureWorks2012AdventureWorks2012 y que se mantenga hasta que finalice la instrucción 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. Usar la sugerencia FORCESEEK para especificar una operación de búsqueda de índiceUsing the FORCESEEK hint to specify an index seek operation

En el ejemplo siguiente se usa la sugerencia FORCESEEK sin especificar un índice para obligar a que el optimizador de consultas realice una operación de búsqueda de índice en la tabla Sales.SalesOrderDetail de la base de datos 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  

En el ejemplo siguiente se usa la sugerencia FORCESEEK con un índice para obligar a que el optimizador de consultas realice una operación de búsqueda de índice en el índice y la columna 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. Usar la sugerencia FORCESCAN para especificar una operación de examen de índiceUsing the FORCESCAN hint to specify an index scan operation

En el ejemplo siguiente se usa la sugerencia FORCESCAN para obligar a que el optimizador de consultas realice una operación de examen en la tabla Sales.SalesOrderDetail de la base de datos 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);  

Vea tambiénSee Also

OPENROWSET (Transact-SQL) OPENROWSET (Transact-SQL)
Sugerencias de ( Transact-SQL ) Hints (Transact-SQL)
Sugerencias de consulta (Transact-SQL)Query Hints (Transact-SQL)