Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Effiziente Integritätsprüfung für SQL-Constraints Seminar „Intelligente Datenbanken“ Henning Lehmacher12. Juli 2005.

Ähnliche Präsentationen


Präsentation zum Thema: "Effiziente Integritätsprüfung für SQL-Constraints Seminar „Intelligente Datenbanken“ Henning Lehmacher12. Juli 2005."—  Präsentation transkript:

1 Effiziente Integritätsprüfung für SQL-Constraints Seminar „Intelligente Datenbanken“ Henning Lehmacher12. Juli 2005

2 2 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-ConstraintsÜbersichtÜbersicht Teil 1: Einführung Überprüfung von Constraints Simulation durch Trigger Constraints vs. Trigger Teil 2: Soundcheck-Verfahren Umwandlung: Constraints  effiziente Trigger

3 3 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-ConstraintsQuellenQuellen Hendrik Decker: Soundcheck for SQL I.V. Ramakrishnan (Ed.): PADL2001, LNCS Springer-Verlag, 2001 Hendrik Decker: Integrity Enforcement on Deductive Databases Larry Kerschberg (Ed.): Expert Database Systems. The Benjamin/Cummings Publishing Company, 1987 Andreas Behrend, Rainer Manthey, Birgit Pieper: An Amateur‘s Introduction to Integrity Constraints and Integrity Checking in SQL Andreas Heuer u.a. (Eds.): Datenbanksysteme in Büro, Technik und Wissenschaft (BTW), 9. GI-Fachtagung, Oldenburg, März 2001, Proceedings. Informatik Aktuell Springer 2001

4 4 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Teil I: Einführungsbeispiel Integritätsbedingung: Ein Kennzeichen ist nicht sowohl einem PKW als auch einem LKW zugeordnet KennzeichenFabrikat BN-AB-1234VW... KennzeichenAchsen SU-CD pkwlkw

5 5 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-ConstraintsAssertionsAssertions Assertions Table Constraints Column Constraints Domain Constraints Erinnerung:

6 6 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Umwandlung in Assertion CREATE ASSERTION fahrz1 CHECK (NOT EXISTS (SELECT * FROM pkw, lkw WHERE pkw.kennzeichen = lkw.kennzeichen)); Problem: Kein gängiges DBMS unterstützt Assertions / CHECK-Constraints über mehrere Tabellen. Wo liegen die Schwierigkeiten? Ein Kennzeichen ist nicht sowohl einem PKW als auch einem LKW zugeordnet

7 7 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Überprüfung von Constraints „Naive“ Handhabung durch ein DBMS CREATE ASSERTION fahrz1 CHECK (NOT EXISTS (SELECT * FROM pkw, lkw WHERE pkw.kennzeichen = lkw.kennzeichen));  O( |pkw| * |lkw| ) Vergleiche Überprüfe bei jeder Änderung von pkw und lkw die CHECK-Bedingung (führe die SELECT-Anfrage aus) CHECK pkw lkw

8 8 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints CREATE TRIGGER ins_pkw_1 BEFORE INSERT ON pkw REFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM lkw WHERE inserted.kennzeichen = lkw.kennzeichen)) BEGIN ROLLBACK END; CREATE TRIGGER ins_lkw_1 BEFORE INSERT ON lkw REFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM pkw WHERE inserted.kennzeichen = pkw.kennzeichen)) BEGIN ROLLBACK END; CREATE TRIGGER ins_pkw_1 BEFORE INSERT ON pkw REFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM lkw WHERE inserted.kennzeichen = lkw.kennzeichen)) BEGIN ROLLBACK END; CREATE TRIGGER ins_lkw_1 BEFORE INSERT ON lkw REFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM pkw WHERE inserted.kennzeichen = pkw.kennzeichen)) BEGIN ROLLBACK END; Simulation durch Trigger Zusätzlich noch zwei Update-Trigger (von nun an nur noch Einfügen/Löschen berücksichtigt) ! DELETE-Trigger sind (in diesem Bsp.) nicht erforderlich! Ein Kennzeichen ist nicht sowohl einem PKW als auch einem LKW zugeordnet

9 9 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints CREATE TRIGGER ins_pkw_1 BEFORE INSERT ON pkw REFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM lkw WHERE inserted.kennzeichen = lkw.kennzeichen)) BEGIN ROLLBACK END; CREATE TRIGGER ins_lkw_1 BEFORE INSERT ON lkw REFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM pkw WHERE inserted.kennzeichen = pkw.kennzeichen)) BEGIN ROLLBACK END; CREATE TRIGGER ins_pkw_1 BEFORE INSERT ON pkw REFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM lkw WHERE inserted.kennzeichen = lkw.kennzeichen)) BEGIN ROLLBACK END; CREATE TRIGGER ins_lkw_1 BEFORE INSERT ON lkw REFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM pkw WHERE inserted.kennzeichen = pkw.kennzeichen)) BEGIN ROLLBACK END;PerformancePerformance O( |inserted| * |pkw| ) bzw. O( |inserted| * |lkw| ) Vergleiche bei Einfügungen Bei jeder Änderung O( |pkw| * |lkw| ) Vergleiche Im Gegensatz zu: Vergleiche bei Einfügeoperationen auf pkw oder lkw die neu eingefügten Zeilen mit der jeweils anderen Tabelle

10 10 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Trigger eher imperativ Optimierungsarbeit liegt beim Ersteller des SQL-Codes wenig Optimierungs- möglichkeiten für DBMS unübersichtlicher Constraints vs. Trigger CHECK-Constraints rein deklarativ Optimierungsarbeit liegt beim DBMS hoher Optimierungsbedarf intuitiver Optimierender Compiler

11 11 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Soundcheck-Verfahren Teil II: Das Soundcheck-Verfahren CHECK-Constraint Effizienter Trigger I.Differenz zwischen altem und neuem Zustand bestimmen II.„Idle Updates“ überspringen III.Relevante Integr.-Bedingungen bestimmen IV.Relevante Integr.-Bedingungen spezialisieren V.Spezialisierte Integr.-Bedingungen optimieren VI. Optimierten Trigger überprüfen

12 12 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Phase 1 Phase 1: Differenz zwischen altem und neuem Zustand bestimmen KennzeichenFabrikat BN-AB-1234VW K-VB-1000Ford BM-W-999BMW SU-RF-4545Fiat inserted_pkw BM-W-999BMW SU-RF-4545Fiat + KennzeichenFabrikat BN-AB-1234VW K-VB-1000Ford BM-W-999BMW SU-RF-4545Fiat K-VB-1000Ford BM-W-999BMW deleted_pkw -- Differenztabelle

13 13 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Phase 1 Bei Constraints über Sichten: Effektive Änderungen an den Sichten bestimmen Wichtig für deduktive Datenbanken, würde hier jedoch zu weit führen  Annahme: Keine Constraints über Sichten! Constr. ! !

14 14 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Phase 2 Phase 2: „Idle Updates“ überspringen UPDATE pkw SET fabrikat = `Opel` WHERE kennzeichen = `BN-AA-1234`; kann nicht verletzt werden, da kennzeichen nicht verändert wird Allgemein: Überprüfung, ob ein Update eine „tatsächliche“ Änderung bewirkt, kann fast genauso aufwendig sein wie Überprüfung des Constraints selbst.  Updates / Doppeleinfügungen werden nicht gesondert betrachtet („Update := Löschen + Einfügen“) Ein Kennzeichen ist nicht sowohl einem PKW als auch einem LKW zugeordnet

15 15 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Phase 3: Relevante Integritätsbedingungen bestimmen Phase 3 Constraints Differenztabellen inserteddeleted ? Welche Constraints können verletzt werden? ?

16 16 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Phase 3 KennzeichenFabrikat BN-D-007VW... BM-W-999BMW K-UH-123BMW KennzeichenAchsen K-VB NOT... CHECK ( NOT EXISTS (SELECT * FROM pkw, lkw WHERE pkw.kennzeichen = lkw.kennzeichen)); -- KennzeichenFabrikat BN-D-007VW... KennzeichenAchsen K-VB auf jeden Fall konsistenter DB-Zustand! Kann nicht verletzt werden ! Konsistenter DB-Zustand

17 17 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Phase 3 KennzeichenFabrikat BN-D-007VW... BM-W-999BMW K-UH-123BMW KennzeichenAchsen K-VB NOT... CHECK ( NOT EXISTS (SELECT * FROM pkw, lkw WHERE pkw.kennzeichen = lkw.kennzeichen)); + + Konsistenter DB-Zustand KennzeichenFabrikat BN-D-007VW... KennzeichenAchsen K-VB könnte Konsistenz verletzen Kann u.U. verletzt werden ! BM-W-999BMW K-UH-123BMW

18 18 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Phase 3 Formal: NOT EXISTS (SELECT * FROM pkw, lkw WHERE pkw.kennzeichen = lkw.kennzeichen) atom. Prädikate negativer Polarität Negation-innermost Form Atomare Prädikate sind von „negativer/positiver Polarität“ wenn sie in der Negation-innermost Form negiert bzw. nicht negiert auftreten Prädikatenlogik (Bereichskalkül) ¬ ∃ X [ pkw(X,_) ∧ lkw(X,_) ] Verschiebe Negationen möglichst weit nach innen! ∀ X [ ¬ pkw(X,_) ∨ ¬ lkw(X,_) ]

19 19 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Phase 3 Eine Änderung ist dann relevant, wenn sie auf ein atomares Prädikat „matcht“ und entgegengesetzte Polarität besitzt + t(k,a) -- v(n,p) Muss für alle atom. Prädikate untersucht werden! (Abbruch falls Matching gefunden wurde) X/kX/p Substitution + t(k,a) -- v(n,p) ∀ X [ ¬ t(X,a) ∨ ¬ t(X,b) ] ∃ X [ ¬ u(X,m) ∨ v (n,X) ]

20 20 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Bsp.: ∃ X‘ [ inserted_pkw(X‘,_) ∧ ¬ ∀ X [ ¬ pkw(X,_) ∨ ¬ lkw(X,_) ] ] ∃ X‘ [ inserted_lkw(X‘,_) ∧ ¬ ∀ X [ ¬ pkw(X,_) ∨ ¬ lkw(X,_) ] ] Phase 3 Erstelle für jedes atom. Prädikat t(x 1,...,x n, k 1,...,k m ) der Constraint eine Formel… falls t neg. Polarität hat falls t pos. Polarität hat var.const. Integr.-Bedingung oder Wann ist die Integritätsbedingung verletzt? Auswertung

21 21 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Phase 4 Phase 4: Relevante Integr.-Bedingungen spezialisieren... CHECK (NOT EXISTS (SELECT * FROM pkw, lkw WHERE pkw.kennzeichen = lkw.kennzeichen))... CHECK (NOT EXISTS (SELECT * FROM inserted_pkw, lkw WHERE inserted_pkw.kennzeichen = lkw.kennzeichen)) Spezialisierung Relevante Änderung von pkw BN-AA-1111Volvo... inserted_pkw +

22 22 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Phase 4 Funktioniert das immer?... CHECK (NOT EXISTS (SELECT * FROM pkw, lkw WHERE pkw.kennzeichen = lkw.kennzeichen))... CHECK (EXISTS (SELECT * FROM deleted_pkw, lkw WHERE deleted_pkw.kennzeichen = lkw.kennzeichen)) Spezialisierung ? BN-AA-1111Volvo deleted_pkw -- KennzeichenFabrikat K-VB-110VW BN-AA-1111Volvo KennzeichenAchsen K-VB-1104 BN-AA Bei Existenzaussagen: Betrachtung ganzer Tabelle unvermeidlich! OK

23 23 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Phase 4 Und hier?... NOT EXISTS ( SELECT... WHERE EXISTS (SELECT... WHERE NOT EXISTS... ) AND NOT EXISTS (... WHERE EXISTS... ) );... NOT EXISTS ( SELECT... WHERE EXISTS (SELECT... WHERE NOT EXISTS... ) AND NOT EXISTS (... WHERE EXISTS... ) ); Existenz- oder Universalaussage?

24 24 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Phase 4 Formal: Eine Variable ist ∃ -dominiert wenn links von ihr ein ∃ auftaucht. ∀ X [ ∃ Y [¬p(X,Y) ∧ ∀ Z [ q(Y,Z) ] ] ] ∃ -dominiert nicht ∃ -dominiert Variablen, die in der Negation-innermost Form nicht ∃ -dominiert sind, können spezialisiert werden!

25 25 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Bsp.: Phase 3: ∃ X‘[ inserted_pkw(X‘,_) ∧ ¬ ∀ X [ ¬pkw(X,_) ∨ ¬lkw(X,_) ] ] Phase 4: ∃ X [ inserted_pkw(X,_) ∧ ¬ ( ¬pkw(X,_) ∨ ¬lkw(X,_) ) ] Phase 4 Wann ist die Integr.-Bedingung verletzt? (Formel für atom. Prädikat mit neg. Polarität) Phase 3: ∃ x 1 ‘,...,x n ‘ [inserted_t(x 1 ‘,...,x n ‘,k 1,...,k m ) ∧ ¬IC ] nicht ∃ -dominiert ∃ -dominiert Spezialisierte IC ohne ∃ oder ∀ vor den x 1,...,x s Constraint Spezialisierte Constraint Phase 4: ∃ x 1,...,x s [ ∃ x s+1 ‘,...,x n ‘ [inserted_t(x 1,...,x s,x s+1 ‘,...,x n ‘,k 1,...,k m ) ] ∧ ¬IC S ]

26 26 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Phase 4 ∃ X [ inserted_pkw(X,_) ∧ ( pkw(X,_) ∧ lkw(X,_) ) ]... EXISTS (SELECT * FROM inserted_pkw, pkw, lkw WHERE inserted_pkw.kennzeichen = pkw.kennzeichen AND inserted_pkw.kennzeichen = lkw.kennzeichen) Überprüfung in der Praxis: Lies Belegungen für X aus inserted_pkw … … und prüfe, ob sie in pkw und lkw vorkommen

27 27 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Phase 5 ∃ X [ inserted_pkw(X,_) ∧ pkw(X,_) ∧ lkw(X,_) ]... EXISTS (SELECT * FROM inserted_pkw, pkw, lkw WHERE inserted_pkw.kennzeichen = pkw.kennzeichen AND inserted_pkw.kennzeichen = lkw.kennzeichen) Phase 5: Spezialisierte Integr.-Bedingungen optimieren ∃ X [ inserted_pkw(X,_) ∧ lkw(X,_) ) ]... EXISTS (SELECT * FROM inserted_pkw, lkw WHERE inserted_pkw.kennzeichen = lkw.kennzeichen) nach Einfügen: inserted_pkw  pkw  Abfrage von pkw ist überflüssig

28 28 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Umwandlung in Trigger Constraint ist verletzt wenn...: ∃ X [ inserted_pkw(X,_) ∧ lkw(X,_) ] ∃ X [ inserted_lkw(X,_) ∧ pkw(X,_) ] EXISTS (SELECT * FROM inserted_pkw, lkw WHERE inserted_pkw.kennzeichen = lkw.kennzeichen) EXISTS (SELECT * FROM inserted_lkw, pkw WHERE inserted_lkw.kennzeichen = pkw.kennzeichen) SQL

29 29 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints Umwandlung in Trigger CREATE TRIGGER ins_pkw_1 BEFORE INSERT ON pkw REFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM lkw WHERE inserted.kennzeichen = lkw.kennzeichen)) BEGIN ROLLBACK END; CREATE TRIGGER ins_lkw_1 BEFORE INSERT ON lkw REFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM pkw WHERE inserted.kennzeichen = pkw.kennzeichen)) BEGIN ROLLBACK END; CREATE TRIGGER ins_pkw_1 BEFORE INSERT ON pkw REFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM lkw WHERE inserted.kennzeichen = lkw.kennzeichen)) BEGIN ROLLBACK END; CREATE TRIGGER ins_lkw_1 BEFORE INSERT ON lkw REFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM pkw WHERE inserted.kennzeichen = pkw.kennzeichen)) BEGIN ROLLBACK END; inserted_pkw EXISTS (SELECT * FROM inserted_pkw, lkw WHERE inserted_pkw.kennzeichen = lkw.kennzeichen) EXISTS (SELECT * FROM inserted_lkw, pkw WHERE inserted_lkw.kennzeichen = pkw.kennzeichen)

30 30 Henning Lehmacher - Effiziente Integritätsprüfung für SQL-ConstraintsZusammenfassungZusammenfassung Hoher Optimierungsbedarf bei Überprüfung von CHECK-Constraints Constraints können durch Trigger simuliert werden Soundcheck-Verfahren wandelt beliebige Constraints in effiziente Trigger um Optimierungsmöglichkeiten (z.B.): Bestimmung der Relevanz von Änderungen Spezialisierung von Anfragen in der Constraint


Herunterladen ppt "Effiziente Integritätsprüfung für SQL-Constraints Seminar „Intelligente Datenbanken“ Henning Lehmacher12. Juli 2005."

Ähnliche Präsentationen


Google-Anzeigen