Predvolene balík Service Pack 1 pre SQL Server 2014 a balík Service Pack 3 pre SQL Server 2012 obsahujú túto opravu a na povolenie opravy nemusíte pridávať žiadne príznaky sledovania. Ak chcete povoliť opravu po inštalácii niektorej z kumulatívnych aktualizácií v časti Riešenie, je potrebné spustiť Microsoft SQL Server pridaním príznaku sledovania 1236 do parametrov spúšťania.
Príznaky
Predpokladajme, že používate inštanciu Microsoft SQL Server 2014, SQL Server 2012, SQL Server 2008 alebo SQL Server 2008 R2 v počítači s veľkým počtom procesorov. Keď počet zámkov (typ zdroja = DATABÁZA) pre konkrétnu databázu presiahne určitú prahovú hodnotu, vyskytnú sa nasledujúce problémy s výkonom:
Zvýšené hodnoty sa vyskytujú pre LOCK_HASH spinlock count.
Poznámka: Informácie o tom, ako monitorovať tento spinlock, nájdete v časti "Ďalšie informácie".
Dokončenie dotazov alebo operácií, ktoré vyžadujú uzamknutie databázy, trvá dlho. Môžete si napríklad všimnúť nasledujúce oneskorenia výkonu:
- Prihlásenia do SQL Server
- Dotazy prepojeného servera
- sp_reset_connection
- Transakcie
Poznámka Ak chcete vyhľadať zoznam zámkov (typ zdroja = DATABÁZA) v danej databáze, pozrite si časť Ďalšie informácie. Prahová hodnota sa líši v závislosti od prostredia.
Riešenie
Informácie o kumulatívnych aktualizáciách
Tento problém bol prvýkrát opravený v nasledujúcej kumulatívnej aktualizácii SQL Server.
Kumulatívna aktualizácia 13 pre SQL Server 2008 R2 SP2 /en-us/help/2967540
Kumulatívna aktualizácia 17 pre SQL Server 2008 SP3 /en-us/help/2958696
Kumulatívna aktualizácia 1 pre SQL Server 2014 /en-us/help/2931693
Kumulatívna aktualizácia 9 pre SQL Server 2012 SP1 /en-us/help/2931078
Informácie o kumulatívnych aktualizáciách pre SQL Server
Každá nová kumulatívna aktualizácia pre SQL Server obsahuje všetky rýchle opravy a opravy zabezpečenia, ktoré boli zahrnuté v predchádzajúcej kumulatívnej aktualizácii. Pozrite si najnovšie kumulatívne aktualizácie pre SQL Server:
- Najnovšia kumulatívna aktualizácia pre SQL Server 2008 R2 SP2
- Najnovšia kumulatívna aktualizácia pre SQL Server 2008 SP3
- Najnovšia kumulatívna aktualizácia pre SQL Server 2014
- Najnovšia kumulatívna aktualizácia pre SQL Server 2012 SP1
Informácie o rýchlych opravách
Od spoločnosti Microsoft je k dispozícii podporovaná rýchla oprava. Táto rýchla oprava je však určená len na vyriešenie problému, ktorý je popísaný v tomto článku. Túto rýchlu opravu použite len v systémoch, v ktorých sa vyskytol tento konkrétny problém.
Ak je rýchla oprava k dispozícii na stiahnutie, v hornej časti článku databázy Knowledge Base sa nachádza časť K dispozícii na stiahnutie rýchlej opravy. Ak sa táto časť nezobrazuje, odošlite požiadavku na oddelenie služieb zákazníkom a technickej podpore spoločnosti Microsoft a požiadajte o rýchlu opravu.
Poznámka Ak sa vyskytnú ďalšie problémy alebo je potrebné riešenie problémov, možno bude potrebné vytvoriť samostatnú žiadosť o službu. Zvyčajné náklady na podporu sa budú vzťahovať na ďalšie otázky a problémy podpory, ktoré nespĺňajú podmienky na túto konkrétnu rýchlu opravu. Úplný zoznam telefónnych čísel na služby zákazníkom a technickej podpory spoločnosti Microsoft alebo ak chcete vytvoriť samostatnú žiadosť o službu, nájdete na nasledujúcej webovej lokalite spoločnosti Microsoft:
/contactus/?ws=support Poznámka: Formulár K dispozícii na stiahnutie rýchlej opravy zobrazuje jazyky, pre ktoré je rýchla oprava k dispozícii. Ak sa váš jazyk nezobrazuje, nie je pre daný jazyk k dispozícii rýchla oprava.
Stav
Spoločnosť Microsoft potvrdila, že ide o problém v produktoch spoločnosti Microsoft, ktoré sú uvedené v časti Vzťahuje sa na.
Ďalšie informácie
Keď sa aplikácia pripojí k SQL Server, najprv vytvorí kontext databázy. Podľa predvoleného nastavenia sa pripojenie pokúsi získať zámok DATABASE v režime SH. Zámok SH-DATABASE sa uvoľní po zastavení pripojenia alebo zmene kontextu databázy počas trvania pripojenia. Ak máte veľa aktívnych pripojení, ktoré používajú rovnaký kontext databázy, môžete mať pre danú databázu veľa zámkov typu zdroja DATABASE.
V počítači so 16 a viac procesormi používajú schému uzamknutia oblastí iba objekty tabuľky. Zámky databáz však nie sú rozdelené na oblasti. Preto čím väčší je počet uzamknutí databázy, tým dlhšie trvá, kým SQL Server získa uzamknutie databázy. Vo väčšine aplikácií sa nevyskytujú žiadne problémy spôsobené týmto návrhom. Akonáhle však počet prekročí určitú hranicu, na získanie zámku je potrebná ďalšia práca a čas. Hoci sú náklady len mikro sekundy za každý ďalší zámok, celkový čas sa môže rýchlo predĺžiť, pretože sektory hash zámku sú chránené pomocou spinlocku. To spôsobuje ďalšie cykly procesora a čaká sa na ďalších pracovníkov, ktorí získajú zámok.
Táto rýchla oprava zavádza uzamknutie oblasti DATABASE pri povolení príznaku sledovania T1236 pri spustení. Uzamknutie DATABASE na oblasti udržiava hĺbku zoznamu uzamknutia zvládnuteľnú v každom lokálnom oddiele. Tým sa výrazne optimalizuje prístupová cesta použitá na získanie zámku databázy.
Ak chcete monitorovať LOCK_HASH spinlock, môžete použiť nasledujúci dotaz. ZAPNÚŤ MOŽNOSŤ NOCOUNT
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
ZATIAĽ KÝM @counter< 100
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
VYBERTE POLOŽKU * OD #spinlock_stats ORDER BY [CaptureTime]
DROP TABLE #spinlock_stats Ďalšie informácie o diagnostike a riešení sporu spinlocku na SQL Server nájdete v nasledujúcom dokumente:
Diagnostika a riešenie sporu o Spinlock na SQL Server Poznámka Hoci je tento dokument napísaný pre SQL Server 2008 R2, informácie sa stále vzťahujú na SQL Server 2012.
Odkazy
Ďalšie informácie o príznakoch sledovania v SQL Server 2012 nájdete na nasledujúcej webovej lokalite TechNet:
Informácie o príznakoch sledovania v SQL Server 2012
Ďalšie informácie o tom, ako zistiť počet zamknutí databázy u používateľa na databázu, získate pomocou nasledujúceho dotazu na výpočet tejto hodnoty:select Resource_database_id, resource_type, request_mode, request_status,
count (*) 'LockCount' from sys.dm_tran_locks
Zoskupiť podľa Resource_database_id, resource_type, request_mode request_status