FIX: Prestatieprobleem wanneer een query wordt verwezen naar tijdelijke tabellen die zijn gemaakt in een sessie in SQL Server 2008 en SQL Server 2008 R2

Van toepassing: SQL Server 2008 R2SQL Server 2008

Microsoft distribueert oplossingen voor Microsoft SQL Server 2008 R2 als één downloadbaar bestand. Aangezien de oplossingen cumulatief zijn, elke nieuwe versie bevat alle hotfixes en de beveiligingscorrecties die opgenomen in de vorige SQL Server 2008 R2 zijn release opgelost.

Symptomen


Neem het volgende scenario:
  • Een toepassing een query die verwijst naar bepaalde tijdelijke tabellen in Microsoft SQL Server 2008 en Microsoft SQL Server 2008 R2 wordt uitgevoerd. Tijdelijke tabellen zijn gemaakt in een sessie in plaats van in een opgeslagen procedure.
  • Het queryplan in cache wordt opgeslagen.
  • Veel gebruikers dezelfde query uitvoert in een omgeving met zeer gelijktijdige. Veel mensen gebruiken bijvoorbeeld een toepassing die wordt uitgevoerd met de volgende query:
    create table #x (col1 int) go insert into #x values (1) go select * from #x where col1 = 1 go
In dit scenario wordt de toepassing prestatieproblemen aangetroffen.Opmerking Zie de sectie 'Meer informatie' voor meer informatie over het bepalen van dit probleem.

Oorzaak


Dit probleem treedt op omdat de dezelfde query's in cache in de dezelfde hash-emmer voor elke gebruiker worden ingevoegd wanneer de tekst hetzelfde is. Wanneer een groot aantal plannen zijn met hash-bewerking op de dezelfde bucket (ook wel een hash-keten), aanzienlijk kan de tijd om een plan in de cache op te zoeken en de prestatieproblemen kunnen zich voordoen. Daarnaast worker-threads kunnen ernstige spinlock bronconflicten optreden en andere threads worden beïnvloed wanneer deze worker-threads niet de juiste scheduler opbrengsten uitvoert.

Oplossing


Opmerking Alleen de update voor SQL Server 2008 R2 is momenteel beschikbaar. Zie de sectie 'Omzeiling' om dit probleem te omzeilen voor SQL Server 2008.

Cumulatieve update informatie

SQL Server 2008 R2 servicepack 1

De correctie voor dit probleem werd voor het eerst uitgebracht in de cumulatieve Update 1 voor Service Pack 1 voor SQL Server 2008 R2. Voor meer informatie over het verkrijgen van dit cumulatieve update-pakket, klikt u op het volgende artikel in de Microsoft Knowledge Base:
2544793 Cumulatieve updatepakket 1 voor Service Pack 1 voor SQL Server 2008 R2
Opmerking Omdat de opbouw cumulatief van opzet zijn, elke nieuwe versie van de correctie bevat alle hotfixes en de beveiligingscorrecties die opgenomen in de vorige SQL Server 2008 R2 zijn release opgelost. We raden het toepassen van de meest recente hotfix-versie waarin deze hotfix is opgenomen. Klik op het volgende artikelnummer in de Microsoft Knowledge Base voor meer informatie:
2567616 SQL Server 2008 R2 maakt die zijn uitgebracht na Service Pack 1 voor SQL Server 2008 R2 is uitgebracht.

SQL Server 2008 R2

De correctie voor dit probleem werd voor het eerst uitgebracht in de cumulatieve Update 7. Voor meer informatie over het verkrijgen van dit cumulatieve updatepakket voor SQL Server 2008 R2, klikt u op het volgende artikelnummer in de Microsoft Knowledge Base:
2507770 Cumulatieve updatepakket 7 voor SQL Server 2008 R2
Opmerking Omdat de opbouw cumulatief van opzet zijn, elke nieuwe versie van de correctie bevat alle hotfixes en de beveiligingscorrecties die opgenomen in de vorige SQL Server 2008 R2 zijn release opgelost. We raden het toepassen van de meest recente hotfix-versie waarin deze hotfix is opgenomen. Klik op het volgende artikelnummer in de Microsoft Knowledge Base voor meer informatie:
981356 SQL Server 2008 R2 versies die zijn uitgebracht na de release van SQL Server 2008 R2

Status


Microsoft heeft bevestigd dat dit probleem zich kan voordoen in de Microsoft-producten die worden vermeld in de sectie Van toepassing op.

Workaround


Omzeilen van dit probleem in SQL Server 2008 en SQL Server 2008 R2, verplaats alle verwijzingen van tijdelijke tabellen in opgeslagen procedures.

Meer informatie


Ga naar de volgende MSDN-website voor meer informatie over het maken en wijzigen van de tabel grondbeginselen:Spinlock busbehoud kan worden geïdentificeerd in de sys.dm_os_spinlock_stats beheer van dynamische weergave (DMV) dat een hoge bronconflicten tarief op de spinlock SOS_CACHESTORE . Om dit probleem te identificeren, uitvoeren van een query met de volgende strekking weergegeven:
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
Als de volgende voorwaarden voldaan wordt wanneer u de query uitvoert, kunt u prestatieproblemen ondervinden:
  • Dezelfde querytekst, genereert deze query.
  • Het aantal voor de dezelfde bucketid is groot.Opmerking Een groot aantal voor de dezelfde bucketid is meestal meer dan 1000.
  • De query's verwijzen naar tijdelijke tabellen