Just nu i M3-nätverket
Jump to content

Rensa databasen.


sudd

Recommended Posts

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?

Link to comment
Share on other sites

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/

 

 

Link to comment
Share on other sites

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]

Link to comment
Share on other sites

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..

 

Link to comment
Share on other sites

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..

 

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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

 

 

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...