Haymaker84 Geschrieben 17. Juli 2008 Teilen Geschrieben 17. Juli 2008 (bearbeitet) Hi, ich bin grad dabei Konsistenzprüfungen durchzuführen. Es geht dabei um 2 Tabellen, eine "Haupttabelle" und eine "Detailtabelle". Nun möchte ich prüfen, ob es in der Haupttabelle Fremdschlüssel gibt, die auf einen Datensatz in der Detailtabelle weisen, der nicht (mehr) vorhanden ist. Problem: - Haupttabelle: ca. 12.500.000 Datensätze - Detailtabelle: ca. 7.500.000 Datensätze :old ich hab auch schon ein paar Ansätze probiert, allerdings laufen diese nicht durch. (kommen nicht zum ende...) Dies ist mein letzter Ansatz: SELECT haupt_regnr, haupt_lfdnr FROM tab_haupt WHERE haupt_lfdnr IS NOT NULL MINUS SELECT haupt_regnr, haupt_lfdnr FROM tab_haupt, tab_detail WHERE haupt_lfdnr = detail_lfdnr AND haupt_lfdnr IS NOT NULL Der Ansatz ist zuerst die Menge von Sätzen zu bilden, die einen Fremdschlüssel besitzen, danach die Mengen von Sätzen zu bilden die einen konsistenten Primärschlüssel besitzen. Abschliessend wird die Schnittmenge gebildet. (Der Überhang aus der ersten Menge ist dann inkonsistent) Ob es nun Funktioniert, weiss ich nicht (habs 3 Stunden laufen lassen). Ich bin hier leider auch nicht befugt einfach mal kleinere Testtabellen zu erstellen... Hat jemand vielleicht nen Ansatz parat, den ich hier probieren könnte?! (Das Problem ist ja nicht so exotisch...) P.S. is ne Oracle 10g DB... Bearbeitet 17. Juli 2008 von Haymaker84 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 17. Juli 2008 Teilen Geschrieben 17. Juli 2008 (bearbeitet) Also ich würde das mal mit NOT EXISTS probieren: SELECT * FROM tab_haupt WHERE NOT EXISTS(SELECT 1 FROM tab_detail WHERE haupt_lfdnr = detail_lfdnr) Das mit NOT NULL kannst dir sparen, denn NULL ist immer ungleiche NULL. Dauern wird das ganze natürlich immer noch eine Weile. Gut wäre es, wenn die beiden Join Felder indiziert wären. Dann kann er (evtl.) einen INDEX FAST FULL SCAN machen und muss nicht die komplette Tabelle durchnudeln. Wenn Du mehrere CPUs und genügend PGA zur Verfügung hast, könntest auch mittels des PARALLEL Hints versuchen das ganze etwas zu beschleunigen. Allerdings gibt es, deinen Mengenangaben nach, auf jeden Fall Schlüssel die in der Haupttabelle vorhanden sind und nicht (mehr) in der Detailtabelle. Dim Bearbeitet 17. Juli 2008 von dr.dimitri Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Haymaker84 Geschrieben 18. Juli 2008 Autor Teilen Geschrieben 18. Juli 2008 Das mit NOT NULL kannst dir sparen, denn NULL ist immer ungleiche NULL. Erstmal wieder Danke, ist ein guter Anstoss. Es ist nur so, dass "haupt_lfdnr" kein Pflichtfeld ist, wobei bei deinem Statement auch die Sätze einbezogen werden, die keinen Detailsatz referenzieren... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 18. Juli 2008 Teilen Geschrieben 18. Juli 2008 wobei bei deinem Statement auch die Sätze einbezogen werden, die keinen Detailsatz referenzieren... Genau das wolltest Du doch wissen: Nun möchte ich prüfen, ob es in der Haupttabelle Fremdschlüssel gibt, die auf einen Datensatz in der Detailtabelle weisen, der nicht (mehr) vorhanden ist. Im übrigen solltest Du nach der Bereinigung einen FK Constraint verwenden um die Referenzielle Integrität sicherzustellen. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Haymaker84 Geschrieben 18. Juli 2008 Autor Teilen Geschrieben 18. Juli 2008 ich nehm, das was ich eben gesagt hab,erstmal zurück. (Hab hier einen Jion verkäckt...) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Haymaker84 Geschrieben 18. Juli 2008 Autor Teilen Geschrieben 18. Juli 2008 ich Depp... der eigentliche Join muss über ein anderes Feld geschehen. :upps Erst dann muss ich mich mit der "lfdnr" auseinandersetzen. Bis jetzt hab ich also nen "quasi-cross-join" mit 20 mio. Datensätzen fabriziert... kein Wunder das dauert so lange... :upps:upps:upps Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.