sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan jag radera utgångna data från en enorm tabell utan att loggfilen växer utom kontroll?

Jag har tyckt att det är användbart när man gör raderingar från tabeller med ett stort antal rader att ta bort rader i partier på säg 5000 eller så (jag brukar testa för att se vilket värde som fungerar snabbast, ibland är det 5000 rader, ibland 10 000, etc.) . Detta gör att varje raderingsoperation kan slutföras snabbt, snarare än att vänta länge på att ett uttalande ska slå ut 400 miljoner poster.

I SQL Server 2005 borde något liknande detta fungera (testa först, naturligtvis):

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

Jag skulle se vad radering i partier gör med loggfilens storlek. Om det fortfarande blåser upp loggarna kan du prova att ändra återställningsmodellen till Enkelt , radera posterna och sedan byta tillbaka till Bulk Logged, men bara om systemet kan tolerera förlusten av vissa senaste data. Jag skulle definitivt göra en fullständig säkerhetskopia innan jag försöker den proceduren. Den här tråden föreslår också att du kan ställa in ett jobb för att säkerhetskopiera loggarna med endast trunkering specificerad, så det kan vara ett annat alternativ. Förhoppningsvis har du en instans du kan testa med, men jag skulle börja med de raderade raderna för att se hur det påverkar prestandan och loggfilens storlek.



  1. PostgreSQL:unik begränsning eller unikt index

  2. Hämta alla datum mellan två datum i SQL Server

  3. Kapslade klasser - CustomRowMapper !! Inget problem längre!! - Del 2

  4. hur man ställer in django och mysql att fungera med UTF-8