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

Prozkoumání online indexových operací na úrovni oddílu v SQL Server 2014 CTP1

SQL Server 2014 CTP1 zavádí rozšíření možností online provozu, která jsou dobrou zprávou pro společnosti provozující velmi rozsáhlé databáze, které nevyžadují téměř žádné prostoje.

Chcete-li nastavit kontext, představte si, že používáte SQL Server 2012 Enterprise Edition pro online správu indexu a funkce dělení indexu a pokusíte se o následující opětovné sestavení indexu na dělené tabulce:

ALTER INDEX [PK_FactInternetSales_SalesOrderNumber_SalesOrderLineNumber]
ON [dbo].[FactInternetSales]
REBUILD PARTITION = ALL
WITH (ONLINE= ON);

Při testování v SQL Server 2012 jsme schopni bez chyby znovu sestavit všechny oddíly online. Ale co když chceme místo všech oddílů zadat konkrétní oddíl?

ALTER INDEX [PK_FactInternetSales_SalesOrderNumber_SalesOrderLineNumber]
ON [dbo].[FactInternetSales]
REBUILD PARTITION = 1
WITH (ONLINE= ON);

Pokud se o to pokusíte v SQL Server 2012 nebo starším, zobrazí se následující chybová zpráva:

Zpráva 155, Úroveň 15, Stav 1, Řádek 4
„ONLINE“ není rozpoznána možnost ALTER INDEX REBUILD PARTITION.

Ale počínaje SQL Serverem 2014 (od CTP1) jsou nyní podporovány online operace indexování jednoho oddílu. A to je jistě velký problém pro scénáře údržby velmi velkých stolů, kde byste preferovali, nebo dokonce musíte celkovou údržbu rozdělit na menší části v průběhu času. Můžete také chtít provádět údržbu na úrovni diskových oddílů pouze pro ty oddíly, které to skutečně vyžadují – například ty oddíly, které skutečně překračují určitou úroveň fragmentace.

K otestování této funkce SQL Server 2014 CTP1 jsem použil AdventureWorksDW2012 s verzí FactInternetSales, která obsahuje 61 847 552 řádků a je rozdělena podle sloupce Datum odeslání.

Přebudování všech oddílů online pro tabulku pomocí PARTITION = ALL v mém testovacím prostředí trvalo 3 minuty a 23 sekund. Pokud jde o celkovou dobu trvání, moje testy se týkaly indexů, které nebyly tak fragmentované, takže doba trvání 3 minuty a 23 sekund představuje průměrnou dobu trvání několika testů. Také mějte na paměti, že jsem v té době neměl spuštěné konkurenční zátěže, takže online přestavba probíhá, aniž bych musel soutěžit s jinými významnými zátěžemi proti dotyčnému indexu.

Tvar plánu provádění dotazu pro opětovné sestavení indexu online pomocí PARTITION = ALL bylo následující:


Prováděcí plán pro online přestavbu všech oddílů

Všimněte si, že operace jsou povoleny paralelně s výjimkou operátoru Constant Scan. V plánu provádění dotazu můžete vidět 39 řádků ve vnější referenci Constant Scan, které jsou předávány operátorovi Distribute Streams a poté řídí vnořenou smyčku.

Význam 39 řádků? Následující dotaz ověřuje maximální počet oddílů z sys.dm_db_partition_stats . Pro mé testovací prostředí byl výsledek 39 pro maximální číslo oddílu, což odpovídá tomu, co jsem viděl pro skutečné řádky konstantního skenování:

SELECT MAX([partition_number]) AS [max_partition_number]
FROM [sys].[dm_db_partition_stats]
WHERE [object_id] = OBJECT_ID('FactInternetSales');

Nyní si v předchozím plánu všimnete také operátoru Online Index Insert. Odebírání ONLINE = ON možnost z mého ALTER INDEX REBUILD (což je offline operace) a zachování PARTITION = ALL jedinou změnou bylo použití operátoru „Index Insert“ namísto „Online Index Insert“ v plánu provádění dotazu – a také zkrácení doby trvání, kdy můj test ukázal dobu provádění 1 minutu a 9 sekund ve srovnání s online 3 minuty a 23 sekund.

Poté jsem testoval online přestavbu jednoho oddílu s 5 678 080 řádky (nezapomeňte, že celkový počet řádků tabulky je 61 847 552 řádků). U tohoto testu trvala celková doba přesně 1 minutu a měla následující tvar plánu provádění dotazu:


Plán provádění online přestavby jednoho oddílu

První postřeh je, že se jedná o sériový plán. Všimněte si také, že jsem řekl, že jsem vybral jeden oddíl z původních 39, ačkoli tento konkrétní oddíl představoval ~ 9 % řádků v tabulce celkově. Všimněte si také, že konstantní skenování ukazuje 1 řádek místo 39, jak bych očekával.

A co doba trvání jednoho oddílu, offline přestavby? V mém testovacím prostředí to trvalo 11 sekund ve srovnání s 1 minutou online přestavby. Tvar plánu provádění dotazu pro offline opětovné sestavení jednoho oddílu byl následující:


Plán provádění offline přestavby jednoho oddílu

Všimněte si, že neexistuje žádný proces konstantního skenování nebo přidružený proces vnořených smyček, a také si všimněte, že tento plán má nyní paralelní operátory oproti předchozímu sériovému plánu, i když oba provádějí skenování klastrovaného indexu pro 5 678 080 řádků. Také hledání klíčového slova „oddíl“ v textu plánu XML pro operaci offline paralelního indexu s jedním oddílem nevedlo k žádným shodám – ve srovnání se sériovým plánem, online operace indexu jednoho oddílu, která měla Partitioned =„true“ pro Clustered Index Scan a Online Index Insert fyzické operátory.

Zpět k hlavnímu průzkumu…

Mohu vybrat několik, ale ne všechny oddíly v jednom spuštění? Bohužel ne.

ALTER INDEX a ALTER TABLE příkazy mají PARTITION = ALL argument a poté PARTITION = <partition number> argument, ale ne schopnost vypsat více oddílů pro jednu operaci znovu sestavení. Na to si však nestěžuji příliš nahlas, protože jsem rád, že mám možnost přestavět jeden oddíl online a není tak složité provést operaci jednou pro každou přestavbu, nicméně kumulativní dopad na trvání byl něco. Chtěl jsem prozkoumat dále.

Jak dlouho by trvalo znovu sestavit všech 39 oddílů samostatně a online oproti PARTITION = ALL trvání 3 minuty a 23 sekund?

Víme, že výhodou online přestaveb je možnost stále přistupovat k přidružené tabulce nebo indexu během operace indexu. Ale výměnou za tuto online operaci ztratíme výkonnostní výhodu přestavby ve srovnání s přestavbou offline. A dále jsem chtěl vědět, jak bude fungovat online přestavba oddílu po jednom v porovnání s PARTITION = ALL alternativa.

Při provádění 39 samostatných operací opětovného sestavení (jedna přestavba pro každý jedinečný oddíl), celková doba provádění byla 9 minut a 54 sekund ve srovnání s PARTITION = ALL který trval 3 minuty a 23 sekund, takže je zřejmé, že postupný postup není kumulativně tak rychlý jako online přestavba všech oddílů v jednom příkazu. I když jsem byl schopen udělat jeden oddíl po druhém, překlenující výhodou je schopnost rozdělit naše činnosti údržby v průběhu času a zachovat přístup k objektům během jejich přestavby, ale pokud hledáte kratší přestavbu okno, offline možnosti jsou stále nejrychlejší, následované online pro PARTITION = ALL a pak na posledním místě, dělat jeden oddíl po druhém.

Následující tabulka shrnuje srovnání trvání – a opět, tyto testy byly založeny na SQL Server 2014 CTP1 a velmi specifické velikosti tabulky a konfiguraci hosta virtuálního počítače, takže věnujte více pozornosti relativním trváním napříč testy než samotným trváním:

Popis testu Trvání
Offline nové sestavení všech oddílů 1:09
Online přestavba všech oddílů 3:23
Online přestavba jednoho oddílu 1:00
Offline přestavba jednoho oddílu 0:11
Online přestavba všech oddílů, jeden oddíl po druhém 9:54


Nyní existují další aspekty k prozkoumání tohoto tématu. To, že je operace online, neznamená, že neexistuje několik okamžiků (nebo déle), kdy jsou na cílovém objektu stále drženy zámky. Operace indexu mají stále chování zamykání pro online operace – a SQL Server 2014 pro to také poskytuje možnosti, které prozkoumám v samostatném příspěvku.


  1. Snadná obnova databáze SQL – průvodce krok za krokem

  2. Jak nasadit otevřenou databázi edX MySQL pro vysokou dostupnost

  3. Jak vytvořit jednoduché fuzzy vyhledávání pouze s PostgreSQL?

  4. SQL Server Lock Eskalace