KB2526959 — Poprawka: problem z wydajnością aplikacji, gdy zapytanie odwołuje się do tabel tymczasowych utworzonych w sesji programu SQL Server 2008 i SQL Server 2008 R2

Dotyczy: SQL Server 2008 R2SQL Server 2008

Firma Microsoft rozpowszechnia poprawki programu Microsoft SQL Server 2008 R2 jako jednego pliku do pobrania. Ponieważ poprawki są zbiorcze, każde nowe wydanie zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń, które zostały dołączone do poprzedniej wersji poprawki SQL Server 2008 R2.

Symptomy


Rozpatrzmy następujący scenariusz:
  • Aplikacja uruchamia kwerendę odwołującą się do tabel tymczasowych w programie Microsoft SQL Server 2008 i w programie Microsoft SQL Server 2008 R2. Tabele tymczasowe są tworzone w sesji zamiast w procedurze składowanej.
  • Plan kwerend jest buforowany.
  • Wielu użytkowników uruchamia tę samą kwerendę w bardzo współbieżnym środowisku. Na przykład wielu użytkowników korzysta z aplikacji, która uruchamia następujące zapytanie:
    create table #x (col1 int) go insert into #x values (1) go select * from #x where col1 = 1 go
W tym scenariuszu aplikacja napotyka problemy z wydajnością.Uwaga Aby uzyskać więcej informacji na temat identyfikowania tego problemu, zobacz sekcję "więcej informacji".

Przyczyna


Ten problem występuje, ponieważ te same plany kwerend są wstawiane do pamięci podręcznej w tym samym zasobniku mieszania dla każdego użytkownika, gdy tekst kwerendy jest taki sam. Gdy duża liczba planów jest mieszana do tego samego zasobnika (nazywanego również łańcuchem mieszania), czas na wyszukanie planu w pamięci podręcznej znacznie wzrasta i może wystąpić problem z wydajnością. Ponadto wątki robocze mogą napotkać poważne rywalizacje o spinlock, a inne wątki są narażone, gdy te wątki robocze nie wykonują właściwych plonów harmonogramu.

Rozwiązanie


Uwaga Obecnie jest dostępna tylko aktualizacja programu SQL Server 2008 R2. W przypadku programu SQL Server 2008 zapoznaj się z sekcją "Obejście" w celu obejścia tego problemu.

Informacje o aktualizacji zbiorczej

SQL Server 2008 R2 z dodatkiem Service Pack 1

Poprawka dotycząca tego problemu została wydana po raz pierwszy w aktualizacji zbiorczej 1 dla programu SQL Server 2008 R2 z dodatkiem Service Pack 1. Aby uzyskać więcej informacji na temat sposobu uzyskiwania tego zbiorczego pakietu aktualizacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
2544793 Pakiet aktualizacji zbiorczej 1 dla programu SQL Server 2008 R2 z dodatkiem Service Pack 1
Uwaga Ponieważ kompilacja jest zbiorcza, każdy nowy pakiet poprawek zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń dołączone do poprzedniej wersji poprawki SQL Server 2008 R2. Zalecamy zastosowanie najnowszego wydania poprawki zawierającego tę poprawkę. Aby uzyskać więcej informacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
2567616 Kompilacje programu SQL Server 2008 R2, które zostały wydane po opublikowaniu dodatku Service Pack 1 dla programu SQL Server 2008 R2

SQL Server 2008 R2

Poprawka dotycząca tego problemu została wydana po raz pierwszy w aktualizacji zbiorczej 7. Aby uzyskać więcej informacji na temat sposobu uzyskiwania tego zbiorczego pakietu aktualizacji dla programu SQL Server 2008 R2, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
2507770 Pakiet aktualizacji zbiorczej 7 dla programu SQL Server 2008 R2
Uwaga Ponieważ kompilacja jest zbiorcza, każdy nowy pakiet poprawek zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń dołączone do poprzedniej wersji poprawki SQL Server 2008 R2. Zalecamy zastosowanie najnowszego wydania poprawki zawierającego tę poprawkę. Aby uzyskać więcej informacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
981356 Kompilacje programu SQL Server 2008 R2, które zostały wydane po opublikowaniu programu SQL Server 2008 R2

Stan


Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji "dotyczy".

Obejście


Aby obejść ten problem w programie SQL Server 2008 i programie SQL Server 2008 R2, Przenieś wszystkie odwołania do tabel tymczasowych do przechowywanych wewnętrznie.

Więcej informacji


Aby uzyskać więcej informacji na temat tworzenia i modyfikowania podstaw tabeli, odwiedź następującą witrynę MSDN w sieci Web:Rywalizację spinlock można zidentyfikować z sys.dm_os_spinlock_stats poziomu dynamicznego widoku zarządzania (DMV), który ma wysoką szybkość rywalizacji na SOS_CACHESTORE spinlock. Aby zidentyfikować ten problem, uruchom zapytanie podobne do następujących:
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
Jeśli po uruchomieniu tego zapytania są spełnione następujące warunki, mogą wystąpić problemy z wydajnością:
  • Ta kwerenda generuje ten sam tekst zapytania.
  • Liczba dla tego samego BucketID jest duża.Uwaga Duża liczba dla tego samego BucketID jest zwykle większa niż 1000.
  • Tabele tymczasowe odwołań do zapytań