sql >> Databáze >  >> RDS >> Sqlserver

Prozkoumání možností čekání na zámek s nízkou prioritou v SQL Server 2014 CTP1

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ílem

Jak 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ílu

K operaci přepnutí na prázdný oddíl došlo za méně než sekundu, ale stále vidíme, že SCH_S a SCH_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 a ABORT_AFTER_WAIT možnosti pro oba ALTER INDEX a ALTER 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 s LCK_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 s MAX_DURATION a ABORT_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 je MAX_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 hodnota NONE , SELF nebo BLOCKERS :

  • NONE znamená, že operace indexu bude pokračovat v pokusu o operaci.
  • SELF znamená, že pokud MAX_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žaduje ALTER 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) =před WANUTT NORACE) =před WANUTT NORATION) = 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) =před WANUTTBOREM = 

    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 DELETE 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):

      Zpráva 233, úroveň 20, stav 0, řádek 3
      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 ABORT_AFTER_WAIT operace v souladu s informacemi o oběti:

Datum 10. 9. 2013 13:37:15
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.


  1. Je středník nezbytný v SQL?

  2. Jak replikovat data PostgreSQL na vzdálené weby

  3. ORA-01017 Neplatné uživatelské jméno/heslo při připojování k 11g databázi z 9i klienta

  4. Jaký je důvod / užitečnost je použití klíčového slova ENABLE v příkazech databáze Oracle