Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

SQL konsistenzprüfungen

Empfohlene Antworten

Veröffentlicht

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

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

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...

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

ich nehm, das was ich eben gesagt hab,erstmal zurück.

(Hab hier einen Jion verkäckt...)

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.