Jak przyspieszyć usuwanie z dużej tabeli bazy danych?

Oto problem, który próbuję rozwiązać: Niedawno ukończyłem przeprojektowanie warstwy danych, które pozwala mi zrównoważyć moją bazę danych na wielu odłamkach. Aby zachować zrównoważenie shardów, muszę być w stanie przenieść dane z jednego fragmentu do drugiego, co obejmuje kopiowanie z fragmentu A do fragmentu B, a następnie usuwanie rekordów z fragmentu A. Ale mam kilka bardzo dużych tabel, i wskazać na nie wiele kluczy obcych, więc usunięcie pojedynczego rekordu z tabeli może zająć więcej niż jedną sekundę.

W niektórych przypadkach muszę usunąć miliony rekordów z tabel i zajmuje to zbyt wiele czasu.

Wyłączenie kluczy obcych nie wchodzi w grę. Usuwanie dużych partii wierszy również nie jest opcją, ponieważ jest to aplikacja produkcyjna, a duże usunięcia blokują zbyt wiele zasobów, powodując awarie. Używam Sql Server i wiem o tabelach partycjonowanych, ale ograniczenia dotyczące partycjonowania (i opłaty licencyjne za wydanie korporacyjne) są tak nierealistyczne, że nie są możliwe.

Kiedy zacząłem pracować nad tym problemem, pomyślałem, że najtrudniejszą rzeczą będzie napisanie algorytmu, który określa, jak usunąć wiersze z poziomu liścia do góry modelu danych, tak aby po drodze nie zostały naruszone żadne ograniczenia klucza obcego. Ale rozwiązanie tego problemu nie przyniosło mi korzyści, ponieważ usunięcie rekordów, które muszą zniknąć z dnia na dzień, trwa kilka tygodni.

Zbudowałem już sposób oznaczania danych jako wirtualnie usunięty, więc jeśli chodzi o aplikację, dane zniknęły, ale nadal mam do czynienia z dużymi plikami danych, dużymi kopiami zapasowymi i wolniejszymi zapytaniami ze względu na sam rozmiar stoły.

Jakieś pomysły? Przeczytałem już tutaj starsze powiązane posty i nie znalazłem niczego, co mogłoby pomóc.

questionAnswers(7)

yourAnswerToTheQuestion