REVISIÓN: Problema de rendimiento de aplicación cuando una consulta hace referencia a tablas temporales que se crean en una sesión en SQL Server 2008 y SQL Server 2008 R2

Se aplica a: SQL Server 2008 R2SQL Server 2008

Microsoft distribuye correcciones de Microsoft SQL Server 2008 R2 como un archivo descargable. Como las revisiones son acumulativas, cada versión nueva contiene todas las revisiones y revisión de todas las revisiones de seguridad que se incluyeron con la anterior de SQL Server 2008 R2.

Síntomas


Imagine la siguiente situación:
  • Una aplicación ejecuta una consulta que hace referencia a algunas tablas temporales en Microsoft SQL Server 2008 y Microsoft SQL Server 2008 R2. Las tablas temporales se crean en una sesión, en lugar de en un procedimiento almacenado.
  • El plan de consulta se almacena en caché.
  • Muchos usuarios ejecutan la misma consulta en un entorno altamente concurrente. Por ejemplo, muchos usuarios utilizar una aplicación que se ejecuta la siguiente consulta:
    create table #x (col1 int) go insert into #x values (1) go select * from #x where col1 = 1 go
En este escenario, la aplicación detecta problemas de rendimiento.Nota Para obtener más información sobre cómo identificar este problema, consulte la sección "Más información".

Causa


Este problema se produce porque se insertan los mismos planes de consulta en caché en el mismo cubo hash para cada usuario cuando el texto de la consulta es el mismo. Cuando un gran número de planes se aplica un algoritmo hash al mismo depósito (también conocido como una cadena hash), aumenta considerablemente el tiempo para buscar un plan en la caché, y pueden producirse los problemas de rendimiento. Además, los subprocesos de trabajo pueden producirse graves spinlock contención y otros subprocesos se ven afectados cuando estos subprocesos de trabajo no realizan los rendimientos programador correcto.

Solución


Nota Sólo la actualización de SQL Server 2008 R2 está disponible actualmente. Para SQL Server 2008, consulte la sección "Solución" para resolver este problema.

Información sobre la actualización acumulativa

Service Pack 1 de SQL Server 2008 R2

La corrección para este problema se publicó primero en la actualización acumulativa 1 para SQL Server 2008 R2 Service Pack 1. Para obtener más información acerca de cómo obtener este paquete de actualización acumulativa, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
2544793 Paquete de actualización acumulativa 1 de SQL Server 2008 R2 Service Pack 1
Nota Como las compilaciones son acumulativas, cada versión de corrección nueva contiene todas las revisiones y revisión de todas las revisiones de seguridad que se incluyeron con la anterior de SQL Server 2008 R2. Le recomendamos que considere aplicar la versión más reciente de revisión que contenga este hotfix. Si desea obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
2567616 Compilaciones de SQL Server 2008 R2 que se publicaron después del lanzamiento de SQL Server 2008 R2 Service Pack 1

SQL Server 2008 R2

La corrección para este problema en primer lugar se publicó en la actualización acumulativa 7. Para obtener más información acerca de cómo obtener este paquete de actualización acumulativa para SQL Server 2008 R2, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
2507770 Paquete de actualización acumulativa 7 para SQL Server 2008 R2
Nota Como las compilaciones son acumulativas, cada versión de corrección nueva contiene todas las revisiones y revisión de todas las revisiones de seguridad que se incluyeron con la anterior de SQL Server 2008 R2. Le recomendamos que considere aplicar la versión más reciente de revisión que contenga este hotfix. Si desea obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
981356 Compilaciones de SQL Server 2008 R2 que se publicaron después del lanzamiento de 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".

Solución alternativa


Para evitar este problema en SQL Server 2008 y en SQL Server 2008 R2, traslado de las referencias temporales tablas dentro de procedimientos almacenan.

Más información


Para obtener más información acerca de cómo crear y modificar los fundamentos de tablas, visite el siguiente sitio Web MSDN:Contención de bloqueo por bucle puede identificarse desde la vista de administración dinámica (DMV) de sys.dm_os_spinlock_stats que tiene una tasa alta de contención en la spinlock SOS_CACHESTORE . Para identificar este problema, ejecute una consulta similar al siguiente:
select cp.bucketid, count(cp.bucketid) as BucketCount, st.text from sys.dm_exec_cached_plans cp cross apply sys.dm_exec_sql_text(cp.plan_handle) as st group by cp.bucketid, st.text having count(cp.bucketid) >1 order by BucketCount desc
Si las condiciones siguientes son verdaderas cuando se ejecuta esta consulta, pueden producirse problemas de rendimiento:
  • Esta consulta genera el mismo texto de consulta.
  • El recuento de la misma bucketid es grande.Nota Normalmente, es un gran recuento para el mismo bucketid de 1000.
  • Las consultas hacen referencia a tablas temporales