SQL Server i batch delete na >20mln rekordów

0

Witam,

Natrafiłem na pewien problem który w sumie można podsumować jako wybór między dżumą a cholerą.

Mam dość dużą bazę danych łącznie ~75 mln rekordów

Z tabeli która łącznie ma ok 65mln rekordów usunąć muszę ok 25mln. Gdyby to był zwykły batch delete wyłączyłbym indeksy i zrobił usuwanie w while po ok 100000 sztuk . Poroblem polega na tym że wylączenie indeksów moim zdaniem ma sens gdy czyścimy całą tabelę z rekordów. Ja niestety muszę wybierać rekordy do usunięcia a co gorsza wybierać je muszę po dacie i kluczu obcym z innej tabeli więc już w ogóle masakra wydajnościowa.

Czy w takiej sytuacji lepiej:

  • czy wyłączyć indeksy nieklastrowe i pozwolić na wolniejsze wyszukiwanie
  • zostawić indeksy i kosztem czasu wyszukiwania wydłużyć czas usuwania.

Na tabeli jest 5 indesków nieklastrowych i 1 klastrowy na PK. Oczywiśćie mówimy o usuwanie w paczkach po 100-300 tyś

Na innej tabeli na której zostawiłem index usuwanie 13 mln zajęło 1,5h (a to dużo biorąc po uwagę że na całość mam max 5h) a z moich obserwacji wynika że liniowo to ten czas niestety nie rośnie.

A więc dżuma czy cholera ? A może coś innego ?

2

zobacz plan dla zapytania typu select * from tabela where warunki_dla_delete i zostaw tylko te indeksy, które będą występowały w planie. Powyłączaj triggery, sprawdź czy nie ma FK do tej tabeli i jeśli są to może pomóc usunięcie danych najpierw z tych tabel (o ile FK masz on delete cascade)

1 użytkowników online, w tym zalogowanych: 0, gości: 1