SQL doppelte Einträge (innerhalb einer Gruppe)
SQL zu finden, doppelte Einträge (innerhalb einer Gruppe)
Ich habe ein kleines problem und ich bin mir nicht sicher, was wäre der beste Weg, es zu beheben, da ich nur beschränkten Zugriff auf die Datenbank (Oracle) selbst.
In unserer Tabelle "EVENT" haben wir über 160k Einträge, jedes EREIGNIS hat eine GROUPID und ein normaler Eintrag ist genau 5 Zeilen mit der gleichen Gruppen-id. Aufgrund eines Fehlers haben wir derzeit ein paar doppelte Einträge (Duplikate, also 10 Zeilen statt 5, nur ein anderes EVENTID. Das kann sich ändern, so ist es nur <> 5). Wir müssen die filter alle Einträge dieser Gruppen.
Aufgrund der begrenzten Zugriff auf die Datenbank, die wir nicht verwenden können, eine temporäre Tabelle, noch können wir hinzufügen, einen index auf die Spalte GROUPID um es schneller zu machen.
Können wir die GROUPIDs, die mit dieser Abfrage, aber wir brauchen eine zweite Abfrage, um die benötigten Daten
select A."GROUPID"
from "EVENT" A
group by A."GROUPID"
having count(A."GROUPID") <> 5
Eine Lösung wäre eine Unterauswahl:
select *
from "EVENT" A
where A."GROUPID" IN (
select B."GROUPID"
from "EVENT" B
group by B."GROUPID"
having count(B."GROUPID") <> 5
)
Ohne einen index auf GROUPID und 160k Einträge, das dauert viel zu lange.
Versucht darüber nachzudenken, einen join, der kann damit umgehen, aber nicht finden können, eine gute Lösung so weit.
Jeder kann das finden einer guten Lösung für diese vielleicht?
Kleinen edit:
Wir haben nicht 100% Duplikate, da jeder Eintrag hat noch eine eindeutige ID und die Gruppen-id ist nicht eindeutig, entweder (das ist, warum wir müssen, verwenden Sie "group by") - oder vielleicht nur ich vermisse eine einfache Lösung für ihn 🙂
Kleines Beispiel über die Daten (die ich nicht wollen, um es zu löschen, finde es einfach)
EVENTID | GROUPID | TYPEID
123456 123 12
123457 123 145
123458 123 2612
123459 123 41
123460 123 238
234567 123 12
234568 123 145
234569 123 2612
234570 123 41
234571 123 238
Es hat einige weitere Spalten, wie Zeitstempel, etc, aber wie Ihr schon seht, alles ist identisch, außer der EVENTID.
Wir es mehr Häufig zum testen, finden Sie die Fehler und prüfen Sie, ob es wieder passiert.
InformationsquelleAutor FrankS | 2008-10-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann man die Antwort mit einem join statt Unterabfrage
Dies ist ein ziemlich gemeinsamen Weg bei der Beschaffung der alle Informationen aus der Zeilen in einer Gruppe.
Wie Ihre vorgeschlagene Antwort und die anderen Antworten, das wird viel schneller mit einem index auf groupid. Es ist bis zu den DBA, zur balance der Vorteil, dass Ihre Abfrage viel schneller gegen die Kosten der Pflege noch einem anderen index.
Wenn das DBA entscheidet sich gegen den index, stellen Sie sicher, dass die geeigneten Leute zu verstehen, dass Ihr die index-Strategie und nicht so, wie du geschrieben hast die Abfrage, die zu einer Verlangsamung führen.
Ineffizient aber. Verwenden Sie die Analyse-Funktion-Methode.
Wie lange hat es gedauert?
nicht wirklich Messen, aber es dauerte weniger als eine Sekunde
InformationsquelleAutor Walter Mitty
Ein klassisches problem für analytische Abfragen zu lösen:
InformationsquelleAutor David Aldridge
Wie lange dauert die SQL eigentlich nehmen? Sie sind nur gehen, um es auszuführen, sobald ich vermute, dass der Fehler behoben, dass verursachte die Beschädigung an Erster Stelle? Ich habe gerade eine test-Fall wie diesem:
Weniger als 2 Sekunden. OK, mein Tisch hat halb so viele Zeilen, wie bei Ihnen, aber 160K ist nicht riesig. Ich habe den Füller Spalte, um die Tabelle einen gewissen Speicherplatz. Die AUTOTRACE-Ausführung plan war:
Das ist, was ich erwarten würde, ich muss zugeben, dass ich versuchen zu helfen, ein Kollege hier, und er beendet das Skript nach 2min. Keine wirkliche Ahnung, warum es so lange dauert, meine erste Vermutung war der fehlende index und ich bin kein Oracle-Experte, also vielleicht bin ich nur fehlen einige Informationen/Einstellungen.
Was können Sie haben, ich nehme an, abgestanden Optimizer-Statistiken die Irre geführt, dass Oracle in die Auswahl ein schlechter plan?
Versuchen Sie, den plan für die Ausführung der analytischen Methode als gut.
Sagen Sie, was -- machen die Gruppen-id-Spalte nicht null ist und die Indizierung damit diese effizienter für die Fälle, wo es gibt sehr wenige Datensätze abrufen. Sie würden wahrscheinlich ein index-scan der Fahrt eine nested loop-Verknüpfung wieder an den Tisch.
InformationsquelleAutor Tony Andrews
Wenn Ihr DBAs, um einen index hinzuzufügen, um diese schneller, Fragen Sie Sie, was Sie schlage vor, Sie tun (das ist, was Sie bezahlt, nachdem alle). Vermutlich haben Sie einen business case, warum Sie diese Informationen benötigen, in dem Fall Ihre sofortige management sollte auf Ihrer Seite sein.
Vielleicht könnten Sie bitten, Ihre DBAs zum duplizieren der Daten in eine Datenbank, wo Sie könnte, um einen index hinzuzufügen.
Sie brauchen nicht einen index, um diese schneller -- benötigen Sie eine andere Abfrage
InformationsquelleAutor paxdiablo
Aus einer SQL-Sicht glaube ich, Sie haben bereits Ihre eigene Frage beantwortet. Der Ansatz, den Sie beschrieben habe (also mit dem sub-select) ist in Ordnung, und ich würde überrascht sein, wenn eine andere Schreibweise der Abfrage unterschieden sich erheblich in der Leistung.
160K records scheint nicht so viel zu mir. Ich könnte verstehen, wenn Sie waren unzufrieden mit der performance der Abfrage, wenn es geht in einem Stück code der Anwendung, aber von den Klängen der es, du bist einfach nur verwenden es als Teil eines data cleansing übung. (und so würde erwarten, dass Sie ein wenig mehr Toleranz in puncto Fahrleistung).
Sogar ohne unterstützende index, seine immer noch nur zwei full-table-scans auf 160K Zeilen, die ehrlich gesagt, würde ich erwarten, um in irgendeiner Art von vage angemessenen Zeit.
Sprechen Sie mit Ihrem db-Administratoren. Sie haben dazu beigetragen, das problem, so lassen Sie Sie Teil der Lösung sein.
EDIT //In der Zwischenzeit führen Sie die Abfrage, die Sie haben. Finden Sie heraus, wie lange es dauert, anstatt nur zu raten. Noch besser wäre es, es zu starten, mit set autotrace on, und die Ergebnisse hier posten, dann könnten wir in der Lage zu helfen, Sie verfeinern es etwas.
Sie erraten es dem Optimierer, zu Unrecht. Es dauert nicht 160K*0,1 Sekunden, es wird mehr wie 0.1+0.1 Sekunden!
nun, wir hielten das Skript, nachdem es ausgeführt wurde, für 2min
Lassen Sie es laufen, und sehen, was passiert, wäre mein Vorschlag. Hölle, wenn es dauert 20 Minuten zu laufen, und kann nur erhalten Sie über den Berg, bis der dba ist zurück, dann könnten Sie feststellen, dass Sie verbringen mehr Zeit damit, sich um die Optimierung der Abfrage, als Sie wirklich Wert.
Stimmt, aber wie gesagt auf den anderen Kommentar, ich versuche zu helfen, ein Kollege hier und ich war neugierig, ob es eine bessere und schnellere Weg, dies war nur die Lösung kam ich innerhalb von ein paar Minuten und ich habe nicht die Arbeit mit SQL mehr für einige Zeit.
InformationsquelleAutor Michael OShea
Funktioniert das tun, was Sie wollen, und bietet eine bessere Leistung? (Ich dachte, ich würde werfen Sie es in als Vorschlag).
InformationsquelleAutor ilitirit
Wie etwa eine Analyse:
InformationsquelleAutor Dave Costa