SQL Duplizieren Abfrage Löschen, die sich über Millionen von Zeilen für die Leistung
Dies war ein Abenteuer. Angefangen habe ich mit der Schleife doppelte Abfrage befindet sich in meine Vorherige Frage, aber jeder Schleife würde gehen über alle 17 Millionen Datensätze, Sinn würde es noch Wochen dauern (nur laufende *select count * from MyTable*
nimmt mein server 4:30 Minuten mit MSSQL 2005). Ich leuchtete Sie Informationen von dieser Seite und an dieser post.
Haben und kam bei der Abfrage unten. Die Frage ist, ist dies die richtige Art der Abfrage ausgeführt werden auf 17 Millionen Datensätze für jede Art von Leistung? Wenn nicht, was ist?
SQL-ABFRAGE:
DELETE tl_acxiomimport.dbo.tblacxiomlistings
WHERE RecordID in
(SELECT RecordID
FROM tl_acxiomimport.dbo.tblacxiomlistings
EXCEPT
SELECT RecordID
FROM (
SELECT RecordID, Rank() over (Partition BY BusinessName, latitude, longitude, Phone ORDER BY webaddress DESC, caption1 DESC, caption2 DESC ) AS Rank
FROM tl_acxiomimport.dbo.tblacxiomlistings
) al WHERE Rank = 1)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehen den QueryPlan helfen würde.
Ist das machbar??
Etwas mit Ihrem DB -, server -, storage-oder eine Kombination davon. 4:30 für ein select count * scheint SEHR hoch.
Führen Sie eine DBCC_SHOWCONTIG zu sehen, wie fragmentiert die Tabelle ist, könnte es hierbei zu einem großen performance-hit über eine Tabelle, die Größe.
Außerdem um add-on zu dem Kommentar von RyanKeeter, die show zu planen und wenn es irgendwelche table-scans erstellen Sie einen index für den PK-Feld in der Tabelle.
Wäre es nicht einfacher, das zu tun:
Befehl in query analyzer:
Dann Fragen Sie query analyzer zum ausführen der Abfrage. Anstelle der Ausführung der Abfrage, generiert SQL Server einen Abfrage-plan und setzen ihn in der Folge eingestellt.
Zeigen uns die Abfrage-plan.
17 Millionen Datensätze, ist nichts. Wenn es dauert 4:30 dann einfach ein select count (*), dann ist es ein ernstes problem, vermutlich im Zusammenhang mit entweder der Mangel an Speicher im server oder einen sehr alten Prozessor.
Für Leistung, reparieren Sie die Maschine. Pump es bis zu 2GB. RAM ist so Billig in diesen Tagen, dass die Kosten weit weniger als Ihre Zeit.
Ist der Prozessor oder die Festplatte Prügel wenn die Abfrage geht? Wenn nicht, dann ist irgend etwas blockiert die Anrufe. In diesem Fall sollten Sie überlegen, die Datenbank im single-user-Modus für die Zeit, die es braucht, um führen Sie das cleanup.
Bist du So löschen Sie alle Datensätze, die nicht den ersten Platz? Es könnte sein, lohnt sich ein Vergleich eine Verknüpfung gegen ein top-1-sub Abfrage (die auch im Jahr 2000 Rang 2005 und oben nur)
Tun, müssen Sie entfernen Sie alle Duplikate in einem einzigen Vorgang? Ich gehe davon aus, dass Sie ausführen irgendeine Art von housekeeping Aufgabe, die Sie vielleicht in der Lage sein, es zu tun-Stück-Weise.
Im Grunde erstellen Sie einen cursor, Schleifen, alle Datensätze (dirty read) und entfernt Duplikate für jeden. Es wird viel insgesamt langsamer, aber jede operation relativ gering. Dann wird Ihr Haushalt wird zum ständigen hintergrund-task eher als eine nächtliche batch.
Den Vorschlag oben, um wählen Sie in eine temporäre Tabelle, die erste ist Ihre beste Wette. Sie können auch etwas wie:
bevor Sie Ihren löschen. Es wird aufhören zu laufen, nachdem es löscht die 1000 Zeilen. Dann führen Sie es wieder und wieder, bis Sie sich 0 Einträge gelöscht.
wenn ich es richtig Sie Abfrage ist die gleiche wie
Ich denke, das sollte schneller laufen, vermeide ich die Verwendung von "IN" - Klausel zugunsten von Verknüpfungen, wo dies möglich ist.
Kann man tatsächlich testen Sie die Geschwindigkeit und die Ergebnisse sicher einfach durch Aufruf
SELECT *
oderSELECT COUNT(*)
auf die AUS Teil wie z.B.Dies ist ein weiterer Grund, warum ich lieber die JOIN-Ansatz
Ich hoffe, das hilft
Sieht gut, aber Sie könnten erwägen Sie, Ihre Daten in eine temporäre Tabelle und verwenden, die in Ihrem delete-Anweisung. Ich habe bemerkt riesige performance-Gewinne aus dies zu tun, anstatt es zu tun, und all das in einer Abfrage an.
Denken Sie daran, wenn dabei ein großer löschen, es ist am besten, um eine gute backup-ersten.(Und ich habe auch in der Regel kopieren Sie die gelöschten Datensätze zu einem anderen Tisch, nur für den Fall, dass ich wiederherstellen müssen Sie sofort. )
Andere als die Verwendung von abschneiden, wie vorgeschlagen, ich habe die besten Glück mit dieser Vorlage für das löschen von vielen Zeilen aus einer Tabelle. Ich erinnere mich nicht, aus der hand, aber ich denke, dass mit der Transaktion " dazu beigetragen, dass die log-Datei von wachsen -- vielleicht gewesen zwar einen anderen Grund-nicht sicher. Und ich in der Regel schalten Sie das transaction-logging-Methode gegenüber der einfachen, bevor etwas wie dies: