KB2526959: problema de rendimiento de la aplicación cuando una consulta hace referencia a tablas temporales creadas en una sesión en SQL Server 2008 y en SQL Server 2008 R2

Se aplica a: SQL Server 2008 R2SQL Server 2008

Microsoft distribuye las soluciones de Microsoft SQL Server 2008 R2 como un archivo que se puede descargar. Debido a que las correcciones son acumulativas, cada versión nueva contiene todas las revisiones y todas las revisiones de seguridad incluidas en la versión 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 en 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 muy simultáneo. Por ejemplo, muchos usuarios usan una aplicación que 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 los mismos planes de consulta se insertan en la memoria caché en el mismo depósito hash para cada usuario cuando el texto de la consulta es el mismo. Cuando se aplica un algoritmo hash a un gran número de planes al mismo (también se conoce como cadena de hash), el tiempo para buscar un plan en la caché aumenta significativamente y pueden surgir problemas de rendimiento. Además, los subprocesos de trabajo pueden experimentar contención de Spinlock grave y otros subprocesos se ven afectados cuando estos subprocesos de trabajo no realizan el rendimiento correcto del programador.

Resolución


Nota Actualmente solo está disponible la actualización de SQL Server 2008 R2. Para SQL Server 2008, consulte la sección "solución alternativa" para solucionar 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ó por primera vez 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 para SQL Server 2008 R2 Service Pack 1
Nota Como las compilaciones son acumulativas, cada nueva versión de corrección contiene todas las revisiones y todas las revisiones de seguridad incluidas en la versión anterior de corrección de SQL Server 2008 R2. Le recomendamos que considere la posibilidad de aplicar la versión de corrección más reciente 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 Las compilaciones de SQL Server 2008 R2 que se publicaron después de que se publicó SQL Server 2008 R2 Service Pack 1

SQL Server 2008 R2

La corrección para este problema se publicó por primera vez en la actualización acumulativa 7. Para obtener más información sobre 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 nueva versión de corrección contiene todas las revisiones y todas las revisiones de seguridad incluidas en la versión anterior de corrección de SQL Server 2008 R2. Le recomendamos que considere la posibilidad de aplicar la versión de corrección más reciente 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 Las compilaciones de SQL Server 2008 R2 que se lanzaron después de publicar 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, mueva las referencias de las tablas temporales a procedimientos almacenados.

Más información


Para obtener más información sobre cómo crear y modificar los conceptos básicos de las tablas, visite el siguiente sitio web de MSDN:La contención de Spinlock se puede identificar desde la Sys.dm_os_spinlock_stats vista de administración dinámica (DMV) que tiene una elevada tasa de contención en el SOS_CACHESTORE Spinlock. Para identificar este problema, ejecute una consulta similar a la 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 se cumplen las siguientes condiciones al ejecutar esta consulta, es posible que se produzcan problemas de rendimiento:
  • Esta consulta genera el mismo texto de consulta.
  • El recuento de la misma bucketid es grande.Nota Un recuento grande para el mismo bucketid suele ser de más de 1000.
  • Las consultas hacen referencia a tablas temporales