Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Najszybszy sposób na aktualizację 120 milionów rekordów

Jedynym rozsądnym sposobem aktualizacji tabeli 120 mln rekordów jest użycie SELECT oświadczenie, które wypełnia sekundę stół. Musisz uważać, kiedy to robisz. Instrukcje poniżej.

Prosty przypadek

W przypadku tabeli bez indeksu klastrowego w czasie bez współbieżnego DML:

  • SELECT *, new_col = 1 INTO clone.BaseTable FROM dbo.BaseTable
  • odtwórz indeksy, ograniczenia itp. w nowej tabeli
  • przełącz stary i nowy za pomocą ALTER SCHEMA... TRANSFER.
  • upuść stary stół

Jeśli nie możesz utworzyć schematu klonowania, zrobi to inna nazwa tabeli w tym samym schemacie. Pamiętaj, aby zmienić nazwy wszystkich ograniczeń i wyzwalaczy (jeśli dotyczy) po zmianie.

Nieprosty przypadek

Najpierw odtwórz swój BaseTable o tej samej nazwie w innym schemacie, np. clone.BaseTable . Użycie oddzielnego schematu uprości późniejszy proces zmiany nazwy.

  • Dołącz indeks klastrowy , jeśli dotyczy. Pamiętaj, że klucze podstawowe i unikalne ograniczenia mogą być grupowane, ale niekoniecznie.
  • Uwzględnij kolumny tożsamości i kolumny obliczeniowe , jeśli dotyczy.
  • Dołącz nową kolumnę INT , gdziekolwiek należy.
  • Nie uwzględniaj którekolwiek z poniższych:
    • wyzwalacze
    • ograniczenia związane z kluczami zagranicznymi
    • indeksy nieklastrowane/klucze podstawowe/unikalne ograniczenia
    • sprawdź ograniczenia lub ograniczenia domyślne. Domyślne wartości nie mają większego znaczenia, ale staramy się, aby wszystko było minimalne.

Następnie przetestuj wkładkę z 1000 wierszy:

-- assuming an IDENTITY column in BaseTable
SET IDENTITY_INSERT clone.BaseTable ON
GO
INSERT clone.BaseTable WITH (TABLOCK) (Col1, Col2, Col3)
SELECT TOP 1000 Col1, Col2, Col3 = -1
FROM dbo.BaseTable
GO
SET IDENTITY_INSERT clone.BaseTable OFF

Sprawdź wyniki. Jeśli wszystko jest w porządku:

  • przyciąć tabelę klonów
  • upewnij się, że baza danych jest w modelu odzyskiwania zbiorczego lub prostego
  • wykonaj pełną wstawkę.

Zajmie to trochę czasu, ale nie tak długo, jak aktualizacja. Po zakończeniu sprawdź dane w tabeli klonów, aby upewnić się, że wszystko jest w porządku.

Następnie odtwórz wszystkie nieklastrowane klucze podstawowe/unikalne ograniczenia/indeksy i ograniczenia klucza obcego (w tej kolejności). Odtwórz domyślne i sprawdź ograniczenia, jeśli ma to zastosowanie. Odtwórz wszystkie wyzwalacze. Odtwórz każde ograniczenie, indeks lub wyzwalacz w osobnej partii. np.:

ALTER TABLE clone.BaseTable ADD CONSTRAINT UQ_BaseTable UNIQUE (Col2)
GO
-- next constraint/index/trigger definition here

Na koniec przenieś dbo.BaseTable do schematu kopii zapasowej i clone.BaseTable do schematu dbo (lub gdziekolwiek ma się znajdować twój stół).

-- -- perform first true-up operation here, if necessary
-- EXEC clone.BaseTable_TrueUp
-- GO
-- -- create a backup schema, if necessary
-- CREATE SCHEMA backup_20100914
-- GO
BEGIN TRY
  BEGIN TRANSACTION
  ALTER SCHEMA backup_20100914 TRANSFER dbo.BaseTable
  -- -- perform second true-up operation here, if necessary
  -- EXEC clone.BaseTable_TrueUp
  ALTER SCHEMA dbo TRANSFER clone.BaseTable
  COMMIT TRANSACTION
END TRY
BEGIN CATCH
  SELECT ERROR_MESSAGE() -- add more info here if necessary
  ROLLBACK TRANSACTION
END CATCH
GO

Jeśli chcesz zwolnić miejsce na dysku, możesz w tym momencie upuścić oryginalną tabelę, chociaż rozsądne może być zatrzymanie jej przez chwilę dłużej.

Nie trzeba dodawać, że jest to idealnie offline operacja. Jeśli masz osoby modyfikujące dane podczas wykonywania tej operacji, będziesz musiał wykonać operację true-up za pomocą przełącznika schematu. Polecam utworzenie wyzwalacza na dbo.BaseTable aby rejestrować wszystkie DML w osobnej tabeli. Włącz ten wyzwalacz przed rozpoczęciem wstawiania. Następnie w tej samej transakcji, w której wykonujesz transfer schematu, użyj tabeli dziennika, aby wykonać korektę true-up. Przetestuj to najpierw na podzbiorze danych! Delty są łatwe do zepsucia.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lista funkcji daty i czasu w SQL Server (T-SQL)

  2. Szybko wstawiaj 2 miliony wierszy do SQL Server

  3. Możliwe sposoby naprawienia problemu z uszkodzeniem metadanych SQL Server

  4. SQL Server 2017:importowanie danych CSV z systemu Linux do Salesforce za pomocą SSIS

  5. Nazwy plików SQL Server a wersje