Just nu i M3-nätverket
Gå till innehåll

Rensa databasen.


sudd

Rekommendera Poster

Jag har en tabell i databasen med ca 1 milj fält. Jag undrar hur jag ska rensa denna på snyggast sätt.... jag har försökt skriva enligt följande:

 

dbconn.execute("DELETE FROM tabellen WHERE [fält1] Between '2000-01-01' AND '2001-05-01' AND [fält2]<>-1'")

 

men det bli bara "internt serverfel", beror säkert på att den ska ta bort så många fält så det går förmodligen inte...

 

Har ni något bra förslag på hur man ska rensa en SQL 7.0 databas på bästa sätt?

Länk till kommentar
Dela på andra webbplatser

Ska du rensa *hela* tabellen så är det både enklast och snabbast att köra en icke-loggad (dvs, icke-reverserbar operation):

 

truncate table <tabellnamn>

 

Ska du göra en normal delete, och du får upp felmeddelande om att transaktionsloggen går full kan du göra dina delete i omgångar tillsammans med antingen:

 

1) Dumpa transaktionsloggen till disk (efter att t ex raderat en dag)

eller

2) Stänga av transaktionsloggshanteringen (inte rekommenderat!)

 

Om du verkligen får "internal error" bör du köra DBCC Checkdb(din databas). Berätta exakt vilket felmeddelande du får.

 

/Tomas

http://www.iludev.com/

 

 

Länk till kommentar
Dela på andra webbplatser

MattiasCanberger

TRUNCATE TABLE är en loggad operation. Med andra ord går det alldeles utmärkt att göra rollback på den.

 

Skillnaden mellan DELETE och TRUNCATE är att DELETE loggar varje rad som tas bort med TRUNCATE loggar att sidor i databasen avallokeras. Detta är mycket snabbare och det är därför TRUNCATE går så mycket fortare.

 

Som sagt. Det går alldeles utmärkt att köra rollback på en TRUNCATE.

 

/Mattias

 

[inlägget ändrat 2001-09-26 08:28:07 av MattiasCanberger]

Länk till kommentar
Dela på andra webbplatser

Hej och tack för alla svar!!

 

Så jag borde skriva:

 

dbconn.execute("TRUNCATE table WHERE [fält1] Between '2000-01-01' AND '2001-05-01' AND [fält2]<>-1'")

 

.kommer det då funger?, är lite rädd för rensning då vissa fält inte får försvinna..

 

Länk till kommentar
Dela på andra webbplatser

Hej och tack för alla svar!!

 

Så jag borde skriva:

 

dbconn.execute("TRUNCATE table WHERE [fält1] Between '2000-01-01' AND '2001-05-01' AND [fält2]<>-1'")

 

.kommer det då funger?, är lite rädd för rensning då vissa fält inte får försvinna..

 

Länk till kommentar
Dela på andra webbplatser

MattiasCanberger

Nej. TRUNCATE TABLE är enbart till för att tömma hela tabellen.

Om du bara vill ta bort vissa rader måste du använda delete.

 

Ang ditt fel.

Det är inte så att det tar så lång tid så att din connection får en command timeout?

 

/Mattias

 

Länk till kommentar
Dela på andra webbplatser

MattiasCanberger

Om det skulle vara en timeout så har du på connection objectet två properties.

En som heter connectiontimeout och en som heter commandtimeout.

 

Connectiontimeout styr hur länge den ska försöka connecta till databasen innan denna rapporteras som misslyckad.

 

Commandtimeout styr hur lång tid dina queries får köras. Mao så är det denna som är intressant i detta läget.

Om du har en fråga som tar 1 minut att köra och din commandtimeout är satt till ett lägre värde så får du ett fel.

 

Prova att öka denna. (tror dock inte det är det som är problemet).

 

Genom att sätta värde till 0 så säger du att du vill vänta oändligt länge. Kan vara bra iblan

 

/Mattias

 

 

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...