Zum Inhalt springen

SQL konsistenzprüfungen


Haymaker84

Empfohlene Beiträge

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 von Haymaker84
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von dr.dimitri
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...