sql >> Databasteknik >  >> RDS >> Sqlserver

Hur tar man bort stora data i tabeller i SQL utan logg?

  1. Om du tar bort alla rader i den tabellen är det enklaste alternativet att avkorta tabellen, något i stil med

     TRUNCATE TABLE LargeTable
     GO
    

Trunkeringstabell kommer helt enkelt att tömma tabellen, du kan inte använda WHERE-satsen för att begränsa raderna som tas bort och inga utlösare kommer att aktiveras.

  1. Å andra sidan om du tar bort mer än 80-90 procent av data, säg om du har totalt 11 miljoner rader och du vill ta bort 10 miljoner skulle ett annat sätt vara att infoga dessa 1 miljon rader (poster du vill behålla ) till ett annat mellanställningsbord. Trunkera denna stora tabell och sätt tillbaka dessa 1 miljon rader.

  2. Eller om behörigheter/vyer eller andra objekt som har den här stora tabellen som underliggande tabell inte påverkas av att ta bort den här tabellen, kan du få dessa relativt små mängder av raderna till en annan tabell, släppa den här tabellen och skapa en annan tabell med samma schema och importera dessa rader tillbaka till denna ex-Large-tabell.

  3. Ett sista alternativ jag kan komma på är att ändra din databas Recovery Mode to SIMPLE och ta sedan bort rader i mindre omgångar med hjälp av en while-loop ungefär så här:

     DECLARE @Deleted_Rows INT;
     SET @Deleted_Rows = 1;
    
    
     WHILE (@Deleted_Rows > 0)
       BEGIN
        -- Delete some small number of rows at a time
          DELETE TOP (10000)  LargeTable 
          WHERE readTime < dateadd(MONTH,-7,GETDATE())
    
       SET @Deleted_Rows = @@ROWCOUNT;
     END
    

och glöm inte att ändra återställningsläget tillbaka till fullt och jag tror att du måste ta en säkerhetskopia för att göra det fullt effektivt (ändrings- eller återställningslägena).



  1. NULL-komplexiteter – Del 3, Saknade standardfunktioner och T-SQL-alternativ

  2. ett effektivt sätt att testa om det finns en tabellrad

  3. Ta bort HTML-taggar i PostgreSQL

  4. inaktivera NOTICES i psql-utgång