KB2526959-Fix: Anwendungs Leistungsproblem, wenn eine Abfrage auf temporäre Tabellen verweist, die in einer Sitzung in SQL Server 2008 und in SQL Server 2008 R2 erstellt wurden

Gilt für: SQL Server 2008 R2SQL Server 2008

Microsoft vertreibt Microsoft SQL Server 2008 R2-Fixes als eine herunterladbare Datei. Da die Fixes kumulativ sind, enthält jede neue Version alle Hotfixes und alle Sicherheitsupdates, die mit der vorherigen Version von SQL Server 2008 R2 behoben wurden.

Problembeschreibung


Stellen Sie sich folgendes Szenario vor:
  • Eine Anwendung führt eine Abfrage aus, die auf einige temporäre Tabellen in Microsoft SQL Server 2008 und in Microsoft SQL Server 2008 R2 verweist. Die temporären Tabellen werden in einer Sitzung anstatt in einer gespeicherten Prozedur erstellt.
  • Der Abfrageplan wird zwischengespeichert.
  • Viele Benutzer führen dieselbe Abfrage in einer stark parallelen Umgebung aus. Viele Benutzer verwenden beispielsweise eine Anwendung, die die folgende Abfrage ausführt:
    create table #x (col1 int) go insert into #x values (1) go select * from #x where col1 = 1 go
In diesem Szenario stößt die Anwendung auf Leistungsprobleme.Hinweis Weitere Informationen dazu, wie Sie dieses Problem identifizieren können, finden Sie im Abschnitt "Weitere Informationen".

Ursache


Dieses Problem tritt auf, weil dieselben Abfragepläne im gleichen Hash Bucket für jeden Benutzer in den Cache eingefügt werden, wenn der Abfragetext identisch ist. Wenn eine große Anzahl von Plänen mit dem gleichen Bucket (auch als hashkette bezeichnet) Hashed wird, wird die Zeit zum Nachschlagen eines Plans im Cache erheblich erhöht, und die Leistungsprobleme können auftreten. Darüber hinaus kann es bei Arbeitsthreads zu schwerwiegenden Spinlock-Konflikten kommen, und andere Threads sind davon betroffen, wenn diese Arbeitsthreads die richtigen Planungs Erträge nicht ausführen.

Fehlerbehebung


Hinweis Derzeit steht nur das Update für SQL Server 2008 R2 zur Verfügung. Informationen zu SQL Server 2008 finden Sie im Abschnitt "Problemumgehung", um dieses Problem zu umgehen.

Informationen zum kumulativen Update

SQL Server 2008 R2 Service Pack 1

Der Fix für dieses Problem wurde erstmals im kumulativen Update 1 für SQL Server 2008 R2 Service Pack 1 veröffentlicht. Wenn Sie weitere Informationen zum Abrufen dieses kumulativen Updatepakets benötigen, klicken Sie auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
2544793 Kumulatives Update Paket 1 für SQL Server 2008 R2 Service Pack 1
Hinweis Da die Builds kumulativ sind, enthält jede neue Fix-Version alle Hotfixes und alle Sicherheitsupdates, die mit der vorherigen Version von SQL Server 2008 R2 behoben wurden. Wir empfehlen, dass Sie die neueste Fix-Version anwenden, die diesen Hotfix enthält. Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
2567616 Die SQL Server 2008 R2-Builds, die nach dem Veröffentlichen von SQL Server 2008 R2 Service Pack 1 veröffentlicht wurden

SQL Server 2008 R2

Der Fix für dieses Problem wurde erstmals im kumulativen Update 7 veröffentlicht. Wenn Sie weitere Informationen zum beziehen dieses kumulativen Updatepakets für SQL Server 2008 R2 benötigen, klicken Sie auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
2507770 Kumulatives Update Paket 7 für SQL Server 2008 R2
Hinweis Da die Builds kumulativ sind, enthält jede neue Fix-Version alle Hotfixes und alle Sicherheitsupdates, die mit der vorherigen Version von SQL Server 2008 R2 behoben wurden. Wir empfehlen, dass Sie die neueste Fix-Version anwenden, die diesen Hotfix enthält. Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
981356 Die SQL Server 2008 R2-Builds, die nach der Veröffentlichung von SQL Server 2008 R2 veröffentlicht wurden

Status


Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel genannten Microsoft-Produkten handelt.

Problemumgehung


Um dieses Problem in SQL Server 2008 und in SQL Server 2008 R2 zu umgehen, verschieben Sie alle Bezüge temporärer Tabellen in gespeicherte Prozeduren.

Weitere Informationen


Weitere Informationen zum Erstellen und Ändern von Tabellen Grundlagen finden Sie auf der folgenden MSDN-Website:SpinLock-Konflikte können aus der sys.dm_os_spinlock_stats Dynamic Management View (DMV) identifiziert werden, die eine starke Konflikt Rate auf dem SOS_CACHESTORE Spinlock. Um dieses Problem zu identifizieren, führen Sie eine Abfrage aus, die der folgenden ähnelt:
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
Wenn die folgenden Bedingungen erfüllt sind, wenn Sie diese Abfrage ausführen, können die Leistungsprobleme auftreten:
  • Mit dieser Abfrage wird derselbe Abfragetext generiert.
  • Die Anzahl für dieselbe Bucket -Zahl ist groß.Hinweis Eine große Anzahl für dieselbe Bucket -Zahl ist in der Regel mehr als 1000.
  • Die Abfragen verweisen auf temporäre Tabellen