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

Jak mogę usunąć wygasłe dane z ogromnej tabeli, tak aby plik dziennika nie wymykał się spod kontroli?

Uważam, że jest to przydatne podczas usuwania z tabeli z dużą liczbą wierszy, aby usunąć wiersze w partiach powiedzmy 5000 (zwykle testuję, aby zobaczyć, która wartość działa najszybciej, czasami jest to 5000 wierszy, czasami 10 000 itd.) . Dzięki temu każda operacja usuwania może zakończyć się szybko, zamiast czekać długo, aż jedna instrukcja usunie 400 milionów rekordów.

W SQL Server 2005 coś takiego powinno działać (oczywiście najpierw przetestuj):

WHILE EXISTS ( SELECT * FROM giganticTable WHERE exp_date < getDate())
BEGIN
  DELETE TOP(5000) FROM giganticTable WHERE exp_date < getDate()
END

Zobaczyłbym, jak usuwanie w partiach wpływa na rozmiar pliku dziennika. Jeśli nadal wysadza dzienniki, możesz spróbować zmienić model odzyskiwania na Proste , usuwając rekordy, a następnie przełączając się z powrotem na tryb Bulk Logged, ale tylko wtedy, gdy system toleruje utratę niektórych ostatnich danych. Zdecydowanie wykonałbym pełną kopię zapasową przed przystąpieniem do tej procedury. Ten wątek sugeruje również, że możesz skonfigurować zadanie tworzenia kopii zapasowej dzienników z określonym tylko obcięciem, więc może to być inna opcja. Mam nadzieję, że masz instancję, z którą możesz przetestować, ale zacznę od usunięcia wsadowego, aby zobaczyć, jak wpływa to na wydajność i rozmiar pliku dziennika.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Problem serializacji C# i SQL Server 2008 CLR

  2. Jak obliczyć różnicę w godzinach (dziesiętnie) między dwiema datami w SQL Server?

  3. jak znaleźć wersję i edycję instancji serwera sql za pośrednictwem rejestru?

  4. SQL Server a NoSQL

  5. Sztuczki, jak wykonać ciąg wewnątrz funkcji w Sql Server