sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan kan jeg slette udløbne data fra en enorm tabel uden at få logfilen ude af kontrol?

Jeg har fundet det nyttigt, når jeg sletter fra tabel med et stort antal rækker, at slette rækker i batches på f.eks. 5000 eller deromkring (jeg tester normalt for at se, hvilken værdi der virker hurtigst, nogle gange er det 5000 rækker, nogle gange 10.000 osv.) . Dette gør det muligt for hver sletning at fuldføre hurtigt i stedet for at vente længe på, at én erklæring slår 400 millioner poster ud.

I SQL Server 2005 burde noget som dette fungere (test venligst først, selvfølgelig):

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

Jeg ville se, hvad sletning i batches gør ved logfilstørrelsen. Hvis det stadig sprænger logfilerne, kan du prøve at ændre gendannelsesmodellen til Simpel , sletning af registreringerne og derefter skift tilbage til Bulk Logged, men kun hvis systemet kan tolerere tab af nogle nyere data. Jeg ville helt sikkert lave en fuld sikkerhedskopi, før jeg forsøger den procedure. Denne tråd foreslår også, at du kan konfigurere et job til at sikkerhedskopiere logfilerne med kun specificeret trunkering, så det kunne være en anden mulighed. Forhåbentlig har du en instans, du kan teste med, men jeg vil starte med de batchede sletninger for at se, hvordan det påvirker ydeevnen og logfilens størrelse.



  1. Sådan rettes fejlmeddelelse 7325 i SQL Server:"Objekter, der afslører kolonner med CLR-typer, er ikke tilladt i distribuerede forespørgsler"

  2. Vedvarende en beregnet dato og tid-kolonne i SQL Server 2005

  3. Tæller alle indlæg, der tilhører en kategori OG dens underkategorier

  4. Oracle DELETE sql med JOIN virker ikke