Avatar billede fdata Forsker
14. december 2000 - 20:59 Der er 6 kommentarer og
1 løsning

Hvordan sletter man 800.000 poster?

Hvis man bare kører en DELETE, løber loggen fuld og kan ikke truncates (Truncate Log on Checkpoint ER sat). SQL kan æde 3-400 Mb log på en gang!

Hvis man i stedet sletter i klumper af 100.000 går det fint. Loggen holder sig konstant. Denne fremgangsmåde virker bare helt til grin.

Er der en forklaring?
Avatar billede fdata Forsker
14. december 2000 - 21:01 #1
Ups, glemte lige at nævne, at vi taler om SQL Server 6.5
Avatar billede ldanielsen Nybegynder
14. december 2000 - 22:39 #2
Jeg mener at der er en kode der styrer hvordan der skal logges. Så kan du bare slå logging fra mens du deleter.

Jeg har bare ikke min kloge bog her, ser lige om jeg kan finde noget i books online :o)
Avatar billede lthrane Nybegynder
14. december 2000 - 23:06 #3
Tjaaaa - du spørger om at slette 800000 poster, og Idanielsen er i gang med at kigge i bogen.

Hvis du skulle slette alle poster (jeg ved jo ikke om 800000 kun er en delmængde at denne tabels data), kunne du jo bruge TRUNCATE kommandoen i stedet. Men det ved du garanteret.....

lthrane
Avatar billede ldanielsen Nybegynder
15. december 2000 - 09:28 #4
Helt eksperimentelt, fra Books Online for MSSQL 7.0, samt fra min syge hjerne:

EXEC sp_dboption \'databasenavn\', \'trunc. log on chkpt.\', \'true\'

Skulle sætte at loggen bliver skrevet til databasen på hvert checkpoint.

DECLARE @Done bit
SELECT @Done = 0
WHILE @Done = 0
BEGIN
  DELETE TOP 10000 ..../*Vælg de øverste 10.000 poster f.eks*/
  CHECKPOINT /*Dette truncater loggen
  /*Find ud af om der er flere og sæt @Done = 1 hvis der ikke er
END

Jeg er ikke sikker på syntaksen eller noget, T-SQL er stadig lidt nyt for mig
Avatar billede fdata Forsker
15. december 2000 - 11:20 #5
>>> lthrane. Det er ALLE poster, der skal slettes. Vil TRUNCATE kunne bruges uden at give problemer med loggen?

>>> ldanielsen. Sorry, vi skulle jo væk fra at dele proceduren op i småbidder.
Avatar billede ldanielsen Nybegynder
15. december 2000 - 11:33 #6
Truncate skulle ikke give problemer med loggen:

TRUNCATE TABLE is functionally identical to DELETE statement with no WHERE clause: both remove all rows in the table. But TRUNCATE TABLE is faster and uses fewer system and transaction log resources than DELETE.

The DELETE statement removes rows one at a time and records an entry in the transaction log for each deleted row. TRUNCATE TABLE removes the data by deallocating the data pages used to store the table’s data, and only the page deallocations are recorded in the transaction log.

TRUNCATE TABLE removes all rows from a table, but the table structure and its columns, constraints, indexes and so on remain. The counter used by an identity for new rows is reset to the seed for the column. If you want to retain the identity counter, use DELETE instead. If you want to remove table definition and its data, use the DROP TABLE statement.

You cannot use TRUNCATE TABLE on a table referenced by a FOREIGN KEY constraint; instead, use DELETE statement without a WHERE clause. Because TRUNCATE TABLE is not logged, it cannot activate a trigger.

Examples
This example removes all data from the authors table.

TRUNCATE TABLE authors

(fra books online for 7.0)
 

Avatar billede lthrane Nybegynder
15. december 2000 - 12:21 #7
Ja. Du kan roligt bruge TRUNCATE uden log-problemer....men det ved du jo godt nu.....
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