2009-04-27 9 views
14

Wir sind über eine etwas merkwürdige Situation gestolpert. Grundsätzlich gibt es zwei Tabellen in einer unserer Datenbanken, die Tonnen und Tonnen von Logging-Informationen, die wir nicht brauchen oder kümmern, gespeist werden. Teilweise deswegen haben wir nicht mehr genügend Speicherplatz.Was ist der beste Weg, um alle großen Tabellen in t-sql zu löschen?

Ich versuche, um die Tabellen zu reinigen, aber es nimmt für immer (es gibt noch 57,000,000+ Aufzeichnungen nach diesem Laufe durch das Wochenende zu lassen ... und das ist nur die erste Tabelle!)

Nur mit löschen Die Tabelle dauert ewig und verbraucht Speicherplatz (ich glaube wegen des Transaktionslogs). Im Moment benutze ich eine while-Schleife, um Datensätze X gleichzeitig zu löschen, während ich mit X herumspiele, um festzustellen, was am schnellsten ist. Zum Beispiel dauert X = 1000 3 Sekunden, während X = 100.000 26 Sekunden dauert ... was die Mathematik etwas schneller macht.

Aber die Frage ist, ob es einen besseren Weg gibt?

(Sobald dies erledigt ist, Job eines SQL-Agenten laufen geht auf den Tisch gehen reinigt einmal am Tag ... aber müssen sie zuerst ausgeräumt.)

+0

Sind Sie alle Datensätze in der Tabelle zu entfernen? –

+0

Das ist nicht von GFI, oder? –

+0

Ich weiß nicht, was GFI ist ... also wahrscheinlich nicht. – CodeRedick

Antwort

20

TRUNCATE die Tabelle oder deaktivieren Indizes vor dem Löschen

TRUNCATE TABLE [tablename] 

Abschneiden entfernt alle Datensätze aus der Tabelle, ohne jeden Löschvorgang separat zu protokollieren.

+1

lohnt sich, zu http://en.wikipedia.org/wiki/Truncate_(SQL) zu springen, um sicherzustellen, dass sie die Einschränkungen verstehen, aber von ganzem Herzen dem Rat zustimmen – ShuggyCoUk

+1

Es könnte sich lohnen zu erwähnen, dass für IDENTITY 'columns a' TRUNCATE' bedeutet, dass der nächste 'INSERT'ed Wert einen Identity Wert der Tabelle' SEED' (normalerweise 1) erhält. Dies ist möglicherweise nicht immer erwünscht. – Oliver

2
TRUNCATE TABLE [tablename] 

löscht alle Datensätze ohne Protokollierung.

+1

es wird einige minimale Protokollierung tun, wird es nur Seiten und Extents betroffenen Protokoll – SQLMenace

4

1) Kürzen Tisch

2) Skript die Tabelle aus, löschen und neu erstellen die Tabelle

2

Je nachdem, wie viel Sie behalten möchten, können Sie nur die Datensätze kopieren Sie eine temporäre Tabelle möchten, Die Protokolltabelle abschneiden und die temporären Tabellensätze zurück in die Protokolltabelle kopieren.

7

Um zu den anderen Antworten hinzuzufügen, wenn Sie die Daten des letzten Tages (oder letzten Monat oder Jahres oder was auch immer) behalten wollen, speichern Sie diese ab, machen Sie die TRUNCATE TABLE, und fügen Sie sie wieder in die ursprüngliche Tabelle ein:

SELECT 
    * 
INTO 
    tmp_My_Table 
FROM 
    My_Table 
WHERE 
    <Some_Criteria> 

TRUNCATE TABLE My_Table 

INSERT INTO My_Table SELECT * FROM tmp_My_Table 

Das nächste, was zu tun ist, fragen Sie sich, warum Sie alle diese Informationen in ein Protokoll eingefügt, wenn niemand davon kümmert. Wenn Sie es wirklich nicht brauchen, dann schalten Sie die Protokollierung an der Quelle aus.

+0

Software von Drittanbietern ... :( – CodeRedick

+0

Sie haben mein Beileid;) –

0

Wenn Sie das optimale x berechnen können, wird dieses mit der schnellsten Rate ständig um das Löschen herumlaufen. Das Festlegen der Zeilenanzahl begrenzt die Anzahl der Datensätze, die in jedem Schritt der Schleife gelöscht werden. Wenn das Logfile zu groß wird; einen Zähler in die Schleife stecken und jede Million Zeilen abschneiden.

Satz @@ rowcount x während 1 = 1 Begin

aus der Tabelle löschen Wenn @@ Rowcount = 0 Pause

End

Ändern Sie den Logging-Modus auf der db zu einfach oder Bulk-Logging reduziert den Lösch-Overhead.

Verwandte Themen