Beste Self-Join-Technik bei der Suche nach Duplikaten

8

Ich versuche eine Anfrage zu optimieren, die lange dauert. Das Ziel besteht darin, doppelte Datensätze basierend auf übereinstimmenden Feldwertkriterien zu finden und sie anschließend zu löschen. Die aktuelle Abfrage verwendet einen Self-Join über den inneren Join auf t1.col1 = t2.col1 und dann eine where-Klausel, um die Werte zu überprüfen.

%Vor%

Was wäre ein besserer Weg, dies zu tun? Oder ist es egal, basierend auf Indizes? Vielleicht

%Vor%

Diese Tabelle hat 100 m + Zeilen.

MS SQL, SQL Server 2008 Enterprise

%Vor%     
Dustin Davis 02.05.2011, 15:43
quelle

6 Antworten

13

Warum selbst beitreten: Dies ist eine Gesamtfrage.

Ich hoffe, Sie haben einen Index für col1, col2, ...

%Vor%

Das wird jedoch einige Zeit dauern. Haben Sie eine Sehen Sie sich Techniken zum Löschen von Massen an

    
gbn 02.05.2011, 15:56
quelle
1

Sie können ROW_NUMBER () verwenden, um doppelte Zeilen in einer Tabelle zu finden.

Sie können hier

    
Bruno Costa 02.05.2011 15:53
quelle
1

Die zwei Methoden, die Sie geben, sollten gleichwertig sein. Ich denke, die meisten SQL-Engines würden in beiden Fällen genau dasselbe tun.

Und das wird übrigens nicht funktionieren. Sie müssen mindestens ein Feld haben, das anders ist oder jeder Datensatz wird sich selbst entsprechen.

Vielleicht möchten Sie etwas mehr wie:

ausprobieren %Vor%     
Jay 02.05.2011 15:55
quelle
1

Bei Tabellen mit 100 m + Zeilen wird die Verwendung von GROUPBY-Funktionen und die Verwendung von Haltetischen optimiert. Obwohl es in vier Abfragen übersetzt.

SCHRITT 1: Erstellen Sie einen Halte-Schlüssel:

%Vor%

SCHRITT 2: Drücken Sie alle doppelten Einträge in die Holddups. Dies ist für Schritt 4 erforderlich.

%Vor%

SCHRITT 3: Löschen Sie die doppelten Zeilen aus der Originaltabelle.

%Vor%

SCHRITT 4: Fügen Sie die eindeutigen Zeilen in die ursprüngliche Tabelle zurück. Zum Beispiel:

%Vor%     
Pravin 02.05.2011 16:18
quelle
0

Um Duplikate zu erkennen, müssen Sie nicht beitreten:

%Vor%

Das sollte viel schneller sein.

    
Christoph Walesch 02.05.2011 15:53
quelle
0

Nach meiner Erfahrung ist die SQL Server-Leistung mit OR conditions sehr schlecht. Wahrscheinlich ist es nicht der self join, sondern mit table3, der die schlechte Performance verursacht. Aber ohne den Plan zu sehen, wäre ich mir nicht sicher.

In diesem Fall könnte es hilfreich sein, die Abfrage in zwei Teile aufzuteilen: Eine mit einer WHERE-Bedingung t3.uniqueoid = 1 und eine mit einer WHERE-Bedingung für die anderen Bedingungen in Tabelle3, und dann UNION ALL verwenden, um eine an die andere anzuhängen.

    
FrankPl 18.01.2013 08:50
quelle

Tags und Links