SQL Server 2014 CTP1 zavádí možnosti čekání na zámek s nízkou prioritou pro použití s online indexovými operacemi a přepínači oddílů.
Pro ty, kteří využívají online správu indexů nebo operace rozdělování indexů a přepínání oddílů v SQL Server 2012 Enterprise Edition, můžete v jednu chvíli zaznamenat zablokování vaší operace DDL, protože tyto operace stále mají určité požadavky na zamykání.
Pro ilustraci si představte, že provedu následující přebudování online indexu s jedním oddílem v SQL Server 2014 CTP1:
ALTER INDEX [ClusteredIndex_on_ps_ShipDate]ON [dbo].[FactInternetSales]REBUILD PARTITION =(37)WITH (ONLINE=ON);
A pojďme se podívat na zámky získané a uvolněné během této operace přestavby pomocí Extended Events a následující definice relace (toto je relace bez cíle a výsledky jsem sledoval prostřednictvím podokna „Watch Live Data“ v SQL Server Management Studio):
VYTVOŘTE RELACI UDÁLOSTI [Online_Index_Rebuild_Locks_Taken] NA SERVER PŘIDAT UDÁLOST sqlserver.lock_acquired( WHERE ([id_objektu]=(309576141))), PŘIDAT UDÁLOST sqlserver.lock_released (THobject_09)=WI73RY1MAX)=WI71RY1MO55 4096 KB, EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS, MAX_DISPATCH_LATENCY=30 SEKUND, MAX_EVENT_SIZE=0 kB, MEMORY_PARTITION_MODE=ŽÁDNÉ, TRACK_CAUSALITY=VYPNUTO, STARTUP_preSTATE>=VYPNUTO);Hodnota 309576141 představuje ID objektu tabulky FactInternetSales.
Dokončení mého online přestavby indexu jednoho oddílu trvalo 56 sekund a po dokončení jsem viděl následující aktivitu získání a uvolnění zámku:
Zamknout aktivitu pro online přestavbu s jedním oddílemJak můžete vidět z výstupu, ačkoli je přestavba online operací, zahrnuje získávání zámků v různých režimech během životního cyklu operace. V ideálním případě je doba trvání uzamčení minimální (například – časové razítko je stejné pro první
SCH_S
zámek získaný a uvolněný). Ale i při minimálním zamykání můžete určitě narazit na problémy se souběžností v závislosti na transakcích probíhajících proti indexu, který je přestavěn nebo do něj přepnut.Na začátku tohoto příspěvku jsem zmínil, že společnost Microsoft zavedla možnosti čekání na zámek s nízkou prioritou pro online operace a operace přepínání oddílů v SQL Server 2014 CTP1. Pokud jde o přepínače oddílů, představte si, že provedu následující operaci:
ALTER TABLE [AdventureWorksDW2012].[dbo].[FactInternetSales] PŘEPNOUT ODDÍL 37 NA [AdventureWorksDW2012].[dbo].[staging_FactInternetSales];Abych viděl zámky získané a uvolněné pro tuto operaci, upravil jsem svou dříve definovanou relaci Extended Event tak, aby zahrnovala použitelné objekty (zdrojovou a cílovou tabulku). Viděl jsem následující:
Zamknout aktivitu pro operaci přepnutí oddíluK operaci přepnutí na prázdný oddíl došlo za méně než sekundu, ale stále vidíme, že
SCH_S
aSCH_M
zámky byly vyžadovány během životního cyklu operace na zdroji i cíli (309576141 je FactInternetSales a 398624463 je staging_FactInternetSales).Takže znovu, i když může být trvání uzamčení extrémně krátké, když k předmětným objektům nepřistupují žádné souběžné transakce, víme, že to není vždy možné, a tak naše online operace přestavby indexu a přepínání oddílů mohou být skutečně zablokovány.
Takže s touto realitou SQL Server 2014 zavádí
WAIT_AT_LOW_PRIORITY
argument, který lze upravit pomocíMAX_DURATION
aABORT_AFTER_WAIT
možnosti pro obaALTER INDEX
aALTER TABLE
příkazy, které můžeme použít pro online operace indexování i přepínání oddílů.Co nám to umožňuje? Nejprve si promluvme o tom, jaké bylo chování před SQL Serverem 2014. Jako příklad si představte, že mám otevřenou a nezavázanou následující transakci:
BEGIN TRANSACTION;DELETE [dbo].[staging_FactInternetSales];Pokud jsem se pokusil provést
ALTER TABLE SWITCH
do tabulky staging_FactInternetSales jako cíl v samostatné relaci, budu zablokován a požadavek bude jen čekat. Konkrétně pro tento příklad bych čekal sLCK_M_SCH_M
typ čekání. Jakmile svou transakci vrátím zpět nebo potvrdím, operace se může posunout vpřed a dokončit.Nyní, pokud používám SQL Server 2014
WAIT_AT_LOW_PRIORITY
sMAX_DURATION
aABORT_AFTER_WAIT
, mohu využít několik různých možností v závislosti na požadavcích mé aplikace.
MAX_DURATION
mi umožňuje zadat počet minut, po které bude online přestavba indexu nebo operace přepnutí oddílu čekat. Pokud jeMAX_DURATION
je dosažena hodnota, můžeme nastavit, co se stane dál na základě nastaveníABORT_AFTER_WAIT
, což může být hodnotaNONE
,SELF
neboBLOCKERS
:
NONE
znamená, že operace indexu bude pokračovat v pokusu o operaci.SELF
znamená, že pokudMAX_DURATION
je dosaženo, operace (online přestavba indexu nebo přepnutí oddílu) bude zrušena.- Pokud
BLOCKERS
Pokud se použije, zabije všechny transakce, které blokují online přestavbu indexu nebo operaci přepínání oddílů (podle mého názoru to není možnost, která by se měla používat na lehkou váhu).BLOCKERS
také vyžadujeALTER ANY CONNECTION
oprávnění pro požadavek, který vydává online znovu sestavení indexu nebo operaci přepnutí oddílu.
Následující příklady kódu ukazují různé varianty konfigurace.
Výchozí chování před rokem 2014 (čekejte neomezeně dlouho)
- Spuštění následujícího povede k chování, na které jsme zvyklí před verzí SQL Server 2014 – a stále to může být to, co budete chtít nebo očekávat v určitých scénářích:
ALTER TABLE [AdventureWorksDW2012].[dbo].[FactInternetSales] PŘEPNOUT ODDÍL 37 NA [AdventureWorksDW2012].[dbo].[staging_FactInternetSales] S (WAIT_AT_LOW_PRIORITY (ČEKEJTE_AT_LOW_PRIORITY, APLIKACE) =0>před WANUTT NORACE) =0>před WANUTT NORATION) =0> WANUTT NBORA = ;Počkejte 1 minutu a zrušte operaci DDL
- Následující příklad čeká 1 minutu, pokud dojde k blokování transakce, a u přepínače
SWITCH
bude „překročen časový limit požadavku na zámek“ operace, pokud je dosaženo maximální doby trvání: ALTER TABLE [AdventureWorksDW2012].[dbo].[FactInternetSales] PŘEPNOUT ODDÍL 37 NA [AdventureWorksDW2012].[dbo].[staging_FactInternetSales] S (WAIT_AT_LOW_PRIORITY, MAX_DURATION) =1>před WANUTTBOREM =1 MINUTA SEČEKÁNÍ =1>Počkejte 1 minutu a zabijte blokujícího(y)
- Tento příklad čeká 1 minutu, pokud dojde k blokující transakci, a poté blokující transakce (včetně zdroje nebo cíle) ukončí, což umožní
SWITCH
operaci dokončit. ALTER TABLE [AdventureWorksDW2012].[dbo].[staging_FactInternetSales] PŘEPNOUT ODDÍL 37 NA [AdventureWorksDW2012].[dbo].[FactInternetSales] S (ČEKEJTE_AT_LOW_PRIORITY, MAX_DURATION> =_)_1 WANUTS BORNÉ_DRÁŽKY =)V mém příkladu
Zpráva 233, úroveň 20, stav 0, řádek 3DELETE
uvnitř nepotvrzené transakce nebyla v mém okně SQL Server Management Studio žádná chyba, protože jsem neměl aktivně spuštěný příkaz, ale pokus o jiný příkaz v rámci této relace vrátil následující chybovou zprávu (protože moje relace byla ukončena):
Při odesílání požadavku na server došlo k chybě na úrovni přenosu. (poskytovatel:Shared Memory Provider, chyba:0 – Na druhém konci kanálu není žádný proces.)Okamžitě zabijte blokujícího(y) (zdroj nebo cíl pro SWITCH)
- Následuje příklad okamžitého zabití blokátoru – a v mém příkladu k přepnutí došlo za méně než sekundu a skutečně byla zabita relace, která blokovala:
ALTER TABLE [AdventureWorksDW2012].[dbo].[FactInternetSales] PŘEPNOUT ODDÍL 37 NA [AdventureWorksDW2012].[dbo].[staging_FactInternetSales]S (WAIT_AT_LOW_PRIORITY (MAX_DURATION>BAT_WARFERS) =MINUTA =MINUTA =AWAT_0);Poslední pozitivní aspekt, na který jsem chtěl upozornit…
Protokol chyb serveru SQL Server poskytuje některé výchozí auditování použití čekání na zámek s nízkou prioritou, včetně informací o
Datum 10. 9. 2013 13:37:15ABORT_AFTER_WAIT
operace v souladu s informacemi o oběti:
Protokol SQL Server (aktuální – 10. 9. 2013 12:03:00)
Zdroj spid51
Zpráva
Proces ID 57 bylo zrušeno příkazem ABORT_AFTER_WAIT =BLOCKERS DDL na database_id =5, object_id =309576141.A také uvidíte samostatné položky pro samotnou původní operaci. Například:
V databázi 'AdventureWorksDW2012' byl proveden příkaz ALTER TABLE SWITCH, tabulka 'staging_FactInternetSales' podle názvu hostitele 'WIN-4T7S36VMSD9', ID hostitelského procesu 1360 s cílovou tabulkou 'AdventureWorksDW2012.dbo.WATDORITY_pomocí možností'WAPATORRIITY' BLOKÁTORY. Blokující uživatelské relace budou ukončeny po uplynutí maximální doby čekání.Tento druh protokolování je velmi užitečný pro účely odstraňování problémů a auditu a jsem rád, že to vidím.