KB2926217 – OPRAVA: Problémy s výkonem nastávají, když se v SQL Server zvýší aktivita uzamčení databáze

Platí pro
SQL Server 2012 Enterprise SQL Server 2012 Developer SQL Server 2012 Standard SQL Server 2012 Express SQL Server 2012 Web SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2008 Service Pack 3 SQL Server 2008 Developer SQL Server 2008 Enterprise SQL Server 2008 Standard SQL Server 2008 R2 Service Pack 2 SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Standard

Aktualizace Service Pack 1 pro SQL Server 2014 a Service Pack 3 pro SQL Server 2012 tuto opravu standardně obsahují a k povolení opravy nemusíte přidávat žádné příznaky trasování. Pokud chcete opravu povolit po instalaci jedné z kumulativních aktualizací v části Řešení, musíte spustit Microsoft SQL Server přidáním příznaku trasování 1236 ke spouštěcím parametrům.

Příznaky

Předpokládejme, že používáte instanci Microsoft SQL Server 2014, SQL Server 2012, SQL Server 2008 nebo SQL Server 2008 R2 v počítači s velkým počtem procesorů. Pokud počet zámků (typ prostředku = DATABÁZE) pro určitou databázi překročí určitou prahovou hodnotu, dojde k následujícím problémům s výkonem:

  • Vyšší hodnoty se vyskytují pro LOCK_HASH počtu spinlocků.

    Poznámka: Informace o sledování tohoto spinlocku naleznete v části "Další informace".

  • Dotazy nebo operace, které vyžadují uzamčení databáze, se dokončí dlouhou dobu. Můžete například zaznamenat následující zpoždění výkonu:

    • Přihlášení k SQL Server
    • Dotazy odkazovaného serveru
    • sp_reset_connection
    • Transakce

Poznámka Chcete-li vyhledat seznam zámků (typ prostředku = DATABÁZE) v dané databázi, přečtěte si část "Další informace". Prahová hodnota se liší podle prostředí.

Řešení

Informace o kumulativní aktualizaci

Tento problém byl poprvé opraven v následující kumulativní aktualizaci SQL Server.

Kumulativní aktualizace 13 pro SQL Server 2008 R2 SP2 /en-us/help/2967540

Kumulativní aktualizace 17 pro SQL Server 2008 SP3 /en-us/help/2958696

Kumulativní aktualizace 1 pro SQL Server 2014 /en-us/help/2931693

Kumulativní aktualizace 9 pro SQL Server 2012 SP1 /en-us/help/2931078

Informace o kumulativních aktualizacích pro SQL Server

Každá nová kumulativní aktualizace pro SQL Server obsahuje všechny opravy hotfix a všechny opravy zabezpečení, které byly součástí předchozí kumulativní aktualizace. Podívejte se na nejnovější kumulativní aktualizace pro SQL Server:

      

Informace o opravě hotfix
 Podporovanou opravu hotfix poskytuje Microsoft. Tato oprava hotfix je však určena pouze k opravě problému popsaného v tomto článku. Tuto opravu hotfix použijte pouze v systémech, ve kterých dochází k tomuto konkrétnímu problému.

Pokud je oprava hotfix dostupná ke stažení, je k dispozici část "Hotfix Download Available" (K dispozici je položka ke stažení opravy hotfix) v horní části tohoto článku znalostní báze Knowledge Base. Pokud se tato část nezobrazí, odešlete žádost službám zákazníkům a podpoře společnosti Microsoft o získání opravy hotfix.

Poznámka: Pokud dojde k dalším problémům nebo pokud je vyžadováno jakékoli řešení potíží, budete pravděpodobně muset vytvořit samostatnou žádost o služby. Další dotazy a problémy, které se netýkají této konkrétní opravy hotfix, podléhají běžným sazbám za podporu. Úplný seznam telefonních čísel zákaznických služeb a podpory společnosti Microsoft nebo vytvoření samostatné žádosti o služby naleznete na následujícím webu společnosti Microsoft:

/contactus/?ws=support Poznámka: Formulář "Hotfix Download Available" (K dispozici je ke stažení opravy hotfix) zobrazuje jazyky, pro které je oprava hotfix k dispozici. Pokud svůj jazyk nevidíte, je to proto, že pro tento jazyk není k dispozici oprava hotfix.

Stav

Společnost Microsoft potvrdila, že se jedná o problém produktů Microsoft, které jsou uvedeny v sekci Platí pro.

Další informace

Když se aplikace připojí k SQL Server, nejdřív vytvoří kontext databáze. Ve výchozím nastavení se připojení pokusí získat zámek DATABASE v režimu SH. Zámek SH-DATABASE se uvolní, když je spojení zastaveno nebo se změní kontext databáze v průběhu životnosti připojení. Pokud máte mnoho aktivních připojení, která používají stejný kontext databáze, můžete mít pro tuto konkrétní databázi mnoho zámků typu prostředku DATABASE.

V počítači s 16 nebo více procesory používají schéma uzamčení oddílů pouze objekty tabulky. Zámky databáze však nejsou rozděleny na oddíly. Proto platí, že čím větší je počet zámků databáze, tím déle SQL Server získá, než databázi uzamkne. Většina aplikací nemá žádné problémy způsobené tímto designem. Jakmile však počet překročí určitou prahovou hodnotu, je k získání zámku zapotřebí další práce a času. I když jsou náklady pouze mikrosekundy na každý další zámek, celková doba se může rychle zvýšit, protože kbelíky hash zámku jsou chráněny pomocí spinlocku. To způsobí další cykly procesoru a čekání, až další pracovníci získají zámek.

Tato oprava hotfix zavádí dělení zámku DATABASE v případě, že je při spuštění povolen příznak trasování T1236. Rozdělení zámku DATABASE udržuje hloubku seznamu zámků spravovatelnou v každém místním oddílu. Tím se významně optimalizuje přístupová cesta, která se použije k získání zámku DATABASE.

Ke sledování LOCK_HASH spinlocku můžete použít následující dotaz. NASTAVIT POČET ZAPNUTO
CREATE TABLE #spinlock_stats([CaptureTime] datetime,[name] nvarchar(512),[collisions] bigint,
[spins] bigint,[spins_per_collision] real,[sleep_time] bigint,[backoffs] int)
DECLARE @counter int = 1
KDYŽ 100 LET @counter<
      BEGIN
            INSERT INTO #spinlock_stats SELECT GETDATE() as "CaptureTime" , * FROM sys.dm_os_spinlock_stats WHERE [name] = 'LOCK_HASH'
            WAITFOR DELAY '00:00:05'
            SET @counter +=1
      End
SELECT * FROM #spinlock_stats ORDER BY [CaptureTime]
DROP TABLE #spinlock_stats Další informace o zjišťování a řešení kolizí spinlock na SQL Server naleznete v následujícím dokumentu:

Diagnostika a řešení kolizí Spinlock na serveru SQL Server Poznámka I když je tento dokument napsaný pro SQL Server 2008 R2, informace stále platí pro SQL Server 2012.

Reference

Další informace o příznacích trasování v systému SQL Server 2012 naleznete na následujícím webu TechNet:

Informace o příznacích trasování v systému SQL Server 2012
Pokud potřebujete další informace o tom, jak zjistit počet zámků databáze v jednotlivých databázích, použijte k výpočtu této hodnoty následující dotaz:select Resource_database_id, resource_type, request_mode, request_status,
count (*) 'LockCount' from sys.dm_tran_locks
Seskupení podle Resource_database_id, resource_type, request_mode request_status