it-swarm-eu.dev

Jak mohu přidat sloupec rowversion do velké tabulky s minimálními prostoji

Pomocí SQL Server 2008 a novějších, chci přidat sloupec rowversion do velké tabulky, ale když jsem jednoduše

ALTER TABLE [Tablename]
ADD Rowversion [Rowversion] NOT NULL

Poté tabulka není k dispozici pro aktualizace příliš dlouho.

Jaké strategie mohu použít ke snížení této prostoje? Budu uvažovat o čemkoli. Čím jednodušší, tím lépe, samozřejmě, ale vezmu v úvahu jakoukoli strategii.

Myslím, že jako poslední možnost bych mohl udržovat kopii pracovní tabulky udržované pomocí triggerů a poté sp_rename tabulku pracovní tabulky do původní tabulky. Ale doufám v něco jednoduššího/snazšího.

21
Michael J Swart

Zvažte vytvoření nové tabulky se stejným schématem plus sloupec rowversion a přidejte pohled na obě tabulky, které všechny spojí. Požádejte lidi, aby používali pohled, a místo spouštěcích tabulek a pohledů psali spoušť.

Přílohy by měly být zaslány do nové tabulky, aktualizace by měly přesouvat data do nové tabulky a mazání by měla být použita na obě tabulky.

Poté proveďte dávkové pohyby na pozadí a přesouvejte co nejvíce záznamů najednou do nové tabulky. I když se to děje, můžete mít problémy se souběžností a některé plány pro provádění craptacularů, ale umožňuje vám zůstat online, zatímco se pohybují.

V ideálním případě zahájíte proces v páteční odpoledne, abyste minimalizovali dopad na konečné uživatele, a pokuste se jej provést do pondělního rána. Jakmile je na svém místě, můžete změnit pohled tak, aby ukazoval jen na novou tabulku, a plány krutého provedení zmizí. Ideálně.

Chcete-li zabránit spouštění spouštěčů při migraci dat v dávkách, podívejte se na počet řádků ve smazaných/vložených tabulkách ve spouště a přeskočte aktivity, pokud jsou blízko počtu řádků ve vaší dávce.


V cíli se Michael rozhodl vynechat pohled (a ne smazat z původní tabulky), aby získal stabilnější plány. Kompromis držel v podstatě dvě kopie stolu. Změnil to na sérii blogových příspěvků .

26
Brent Ozar

Pokud máte čas na plánování dopředu, existuje mnohem jednodušší řešení ... (obvykle)

Dlouhé zámky jsou téměř jistě způsobeny rozdělením stránky ve vrstvě úložiště. Takže je vynutit podle vlastního rozvrhu.

  1. Přidejte dočasný sloupec schopný NULL s datovým typem VARBINARY(8).
  2. Vyhledejte dostupný volný čas v databázi a aktualizujte dávky existujících záznamů platnou hodnotou pro pole. (Například 0x0000000027F95A5B)
  3. Aktualizace vynutí nutnost rozdělení stránek a přidělí více tabulky.
  4. Až dojdete, přetáhněte dočasný sloupec (nedotýká se přiděleného úložiště) a přidejte sloupec rowversion.
  5. Žádné rozdělení stránky a zámek, který je potřebný pouze dostatečně dlouho k naplnění hodnot.

Úspěšně jsem to použil k přidání sloupce rowversion do 150M řádkové tabulky za méně než 10 minut.

Upozornění ... pokud máte tabulku s velkými poli varchar (zejména varchar(max)), SQL Server se rozhodne znovu sestavit tabulku namísto opětovného využití nově dostupného prostoru. Stále se snažím vymyslet cestu kolem toho.

7
Scott Lynch

Pokud TIMESTAMP, který přidáváte, je NULLABLE:

  1. Přidejte sloupec VARBINARY(8)
  2. Vyplňte údaji.

Poté, co je naplněna, v zadních SQL příkazech, DROP the VARBINARY(8) sloupec, který jste právě přidali a naplnili, a přidejte sloupec TIMESTAMP NULL.


Pokud TIMESTAMP, který přidáváte, je NOT NULLABLE:

  1. Přidejte sloupec BINARY(8)
  2. Vyplňte údaji.

Poté, co je naplněn, v zády k sobě SQL příkazy, DROP the BINARY(8) sloupec, který jste právě přidali a naplnili a ADD THE TIMESTAMP NOT NULL Sloupec.

1
user69073