Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Elvira Becker Geändert vor über 9 Jahren
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 1990. 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, 7.-9. 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-56784... 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-1124... NOT... CHECK ( NOT EXISTS (SELECT * FROM pkw, lkw WHERE pkw.kennzeichen = lkw.kennzeichen)); -- KennzeichenFabrikat BN-D-007VW... KennzeichenAchsen K-VB-1124... 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-1124... NOT... CHECK ( NOT EXISTS (SELECT * FROM pkw, lkw WHERE pkw.kennzeichen = lkw.kennzeichen)); + + Konsistenter DB-Zustand KennzeichenFabrikat BN-D-007VW... KennzeichenAchsen K-VB-1124... 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-11113 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
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.