KB2448971: los bloqueos de una tabla no se escalan al insertar muchas filas en una tabla de SQL Server 2008 o en SQL Server 2008 R2

Se aplica a: Microsoft SQL Server 2008 Service Pack 4Microsoft SQL Server 2008 R2 Service Pack 3

Síntomas


Imagine la siguiente situación:
  • Las filas se insertan en una tabla de Microsoft SQL Server 2008 o en SQL Server 2008 R2 mediante una de las siguientes consultas:
    • INSERT INTO <target_table> SELECT * FROM <target_table> WHERE <predicate>
    • SELECT * INTO <target_table> FROM <source_table> WHERE <predicate>
    Notas
    • El <target_table> marcador de posición representa el nombre real de la tabla de destino.
    • El predicado de<> marcador de posición representa el predicado real.
    • El <source_table> marcador de posición representa la tabla de origen real.
  • Se superó el umbral de escalado de bloqueo de la tabla.
En este escenario, el motor de base de datos no escala los bloqueos de la tabla.

Causa


Este problema se produce porque SQL Server no cuenta internamente todos los bloqueos nuevos generados por las operaciones de inserción. Por lo tanto, es posible que el umbral de escalado de bloqueo no se desencadene cuando sea necesario.

Resolución


Información de Service Pack para SQL Server 2008

Para resolver este problema, obtenga el Service Pack más reciente para SQL Server 2008. para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
968382 Cómo obtener el Service Pack más reciente para SQL Server 2008

Información de Service Pack para SQL Server 2008 R2

Para resolver este problema, obtenga el Service Pack más reciente para SQL Server 2008 R2. Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
2527041 Cómo obtener el Service Pack más reciente para SQL Server 2008 R2

Estado


Microsoft ha confirmado que se trata de un problema de los productos de Microsoft recogidos en la sección "Se aplica a".Este problema se corrigió por primera vez en SQL Server 2008 Service Pack 2 para SQL Server 2008. este problema se corrigió por primera vez en SQL Server 2008 R2 Service Pack 1 para SQL Server 2008 R2.

Más información


Para obtener más información acerca de la extensión de bloqueo, visite el siguiente sitio web de Microsoft TechNet:Para determinar si se escalan los bloqueos de una tabla, ejecute las siguientes instrucciones Transact-SQL:
USE tempdbGOCREATE TABLE x (i INT NOT NULL PRIMARY KEY)GOBEGIN TRANINSERT xSELECT TOP (40000)ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rFROM master..spt_values a, master..spt_values bORDER BYrSELECTCOUNT(*)FROM sys.dm_tran_locksWHERE request_session_id = @@SPID ROLLBACKGODROP TABLE x 
Si se escalan los bloqueos de la tabla, la última instrucción SELECT devuelve un valor de 1 o 2. Si no se escalan los bloqueos de la tabla, la última instrucción SELECT devuelve un valor de 40.066 o 40.067.