Verwenden von SQL Server 2005.
Ich führe ein großes DELETE FROM ohne WHERE-Klauseln aus. Es entspricht im Grunde einer TRUNCATE TABLE-Anweisung - außer ich darf TRUNCATE nicht verwenden. Das Problem ist, dass die Tabelle riesig ist - 10 Millionen Zeilen, und die Fertigstellung dauert über eine Stunde. Gibt es eine Möglichkeit, es schneller zu machen, ohne:
- Truncate verwenden
- Indizes deaktivieren oder löschen?
Das T-Log befindet sich bereits auf einem separaten Datenträger.
Anregungen willkommen!
sql-server
performance
delete
Tuseau
quelle
quelle
Antworten:
Was Sie tun können, ist Batch-Löschungen wie folgt:
Wo xxx ist, sagen wir 50000
Eine Änderung davon, wenn Sie einen sehr hohen Prozentsatz von Zeilen entfernen möchten ...
quelle
Sie können die TOP-Klausel verwenden, um dies einfach zu erledigen:
quelle
Ich bin mit den Vorschlägen einverstanden, Ihre Löschvorgänge in überschaubare Blöcke aufzuteilen, wenn Sie TRUNCATE nicht verwenden können, und ich mag den Drop / Create-Vorschlag für seine Originalität, aber ich bin gespannt auf den folgenden Kommentar in Ihrer Frage:
Ich vermute, der Grund für diese Einschränkung hängt mit der Sicherheit zusammen, die gewährt werden muss, um eine Tabelle direkt abzuschneiden, und mit der Tatsache, dass Sie damit andere als die von Ihnen betroffenen Tabellen abschneiden können.
Unter der Annahme, dass dies der Fall ist, frage ich mich, ob eine gespeicherte Prozedur, die TRUNCATE TABLE verwendet und "EXECUTE AS" verwendet, eine praktikable Alternative zu Sicherheitsrechten ist, die zum direkten Abschneiden der Tabelle erforderlich sind.
Hoffentlich erhalten Sie auf diese Weise die Geschwindigkeit, die Sie benötigen, und können gleichzeitig die Sicherheitsbedenken Ihres Unternehmens in Bezug auf das Hinzufügen Ihres Kontos zur Rolle "db_ddladmin" berücksichtigen.
Ein weiterer Vorteil der Verwendung einer gespeicherten Prozedur auf diese Weise besteht darin, dass die gespeicherte Prozedur selbst gesperrt werden kann, sodass nur bestimmte Konten sie verwenden dürfen.
Wenn dies aus irgendeinem Grund keine akzeptable Lösung ist und Sie die Daten in dieser Tabelle einmal pro Tag / Stunde / usw. entfernen müssen, fordere ich Sie auf, einen SQL Agent-Job zu erstellen, um die Tabelle abzuschneiden zu einer festgelegten Zeit jeden Tag.
Hoffe das hilft!
quelle
Außer abschneiden .. nur stapelweise löschen kann Ihnen helfen.
Sie können die Tabelle löschen und neu erstellen, wobei alle Einschränkungen und Indizes außer Kraft gesetzt sind. In Management Studio haben Sie die Möglichkeit, eine Tabelle per Skript zu löschen und zu erstellen. Dies sollte also eine triviale Option sein. Dies ist jedoch nur möglich, wenn Sie DDL-Aktionen ausführen dürfen, was meines Erachtens keine Option darstellt.
quelle
Da diese Frage eine so wichtige Referenz ist, veröffentliche ich diesen Code, der mir wirklich geholfen hat, das Löschen mit Schleifen und das Versenden von Nachrichten innerhalb einer Schleife zu verstehen, um den Fortschritt zu verfolgen.
Die Abfrage wird von dieser doppelten Frage geändert . Gutschrift auf @RLF für die Abfragebasis .
quelle