07. marts 2013 - 10:56 Der er 6 kommentarer og
1 løsning

Slet data udenom transaction log

SQL Express 2012 benyttes på nogle pc'ere, som jeg kun har yderst begrænset adgang til.
Jeg kan sende scripts, men det må ikke indeholde komma!!

Jeg har brug for at slette f.eks. 40.000.000 records uden at transaction loggen vokser fra 6 MB til 20+ MB da harddisken på denne pc vil blive totalt fyldt op.
Data skal _aldrig_ bruges igen, hvorfor jeg kan gå udenom transaction log.

Jeg kan ikke lave en drop/create da jeg ikke skal slette alle data og der _vælter_ data ind i databasen imens jeg sletter.

set recovery simple er slet slet ikke nok...

Hvad gør jeg?
Avatar billede Syska Mester
07. marts 2013 - 11:23 #1
Slet 1 record af gangen.

Alt i SQL kører implicit i en TRANSACTION så det er som sådan ikke muligt.

Med mindre du kan køre en TRUNCATE på den table, så kan du godt.

Hvordan kan en log på 20+ MB ... fylde en disk op ... :-S Ja, hvis den fylder 10000000000 MB kan den jo nok ... men det er meget små tal jeg synes vi snakker om her.

Hvorfor løser det ikke problemet er sætte den til "Simple Recovery Mode" ... Så bliver "trans log" jo tømt efter deletion er done ... dog har den stadig "reserveret" pladsen til fremtidig brug.

Du kan dog så derefter køre en "shrink" på din log fil, hvis det er vigtig for dig at have pladsen. Men dette vil jeg stærkt fraråde ...

mvh
07. marts 2013 - 12:45 #2
Hvad får jeg ud af, at slette en/få records af gangen i stedet for 1.000.000 records - altså i størrelse på transaction log?

sorry - transaction log vil fylde mere end 20 GB... harddisk er 40 GB, windows og database tæt på 10 GB mv. = nul plads i overskud
Avatar billede Syska Mester
07. marts 2013 - 12:59 #3
Hvis du sletter 1 record af gangen skal der jo også kun gemmes en record i din Transaction Log.

Hvis du derimod sletter 40 mill på en gang, kræver det at alt kan være i din Transaction Log.

Du kan måske med fordel gøre det ala:

DELETE TOP 10000 FROM table1 WHERE something = 1

Og så køre den mange gange ... pointen er at loggen ikke bliver så stor.

Husk, hvis DB er i Simple Recovery Mode, så bliver plads i din log frigivet til brug for andre queries efter en Transaction er commited.
07. marts 2013 - 13:38 #4
Super - det vil jeg lige teste
07. marts 2013 - 17:53 #5
Smid et svar - det er super - har fundet en batch loop funktion, som kan komme igennem de 40.000.000 records med 10.000 af gangen - det virker
Avatar billede Syska Mester
07. marts 2013 - 19:01 #6
Awesome ... glad for at kunne hjælpe.

Grunden til at der er transactions og det ikke som sådan kan slås fra af hvad jeg lige ved, er fordi hvad hvis den går ned? hardreset? disk fuld og mange andre grunde ... så ville den ikke kunne recover fra det.

Men fedt det virker.
07. marts 2013 - 20:53 #7
Denne lille fætter gjorde jobbet for mig:

DECLARE @BatchSize INT
SET @BatchSize = 100000

WHILE @BatchSize <> 0
BEGIN
    DELETE TOP (@BatchSize)
    FROM [dbo].[UnknownTable]
    SET @BatchSize = @@rowcount
END
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester