effiziente integritätsprüfung für sql-constraints seminar „intelligente datenbanken“ henning...
TRANSCRIPT
Effiziente Integritätsprüfungfür SQL-Constraints
Seminar „Intelligente Datenbanken“
Henning Lehmacher 12. Juli 2005
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
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
QuellenQuellen
Hendrik Decker: Soundcheck for SQLI.V. Ramakrishnan (Ed.): PADL2001, LNCS 1990. Springer-Verlag, 2001
Hendrik Decker: Integrity Enforcement on Deductive DatabasesLarry 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 SQLAndreas 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
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Teil ITeil I: Einführungsbeispiel: Einführungsbeispiel
Integritätsbedingung:
Ein Kennzeichen ist nichtsowohl einem PKW als auch einem LKW zugeordnet
Kennzeichen FabrikatBN-AB-1234 VW
... ...
Kennzeichen AchsenSU-CD-5678 4
... ...
pkw lkw
5
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
AssertionsAssertions
Assertions
Table Constraints
Column Constraints
Domain Constraints
Erinnerung:
6
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Umwandlung in AssertionUmwandlung in Assertion
CREATE ASSERTION fahrz1CHECK (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 nichtsowohl einem PKW als auch einem LKW zugeordnet
7
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Überprüfung von ConstraintsÜberprüfung von Constraints
„Naive“ Handhabung durch ein DBMS
CREATE ASSERTION fahrz1CHECK (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
CHECK
pkw
lkw
8
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
CREATE TRIGGER ins_pkw_1 BEFORE INSERT ON pkwREFERENCING NEW AS insertedWHEN (EXISTS (SELECT * FROM lkw
WHERE inserted.kennzeichen = lkw.kennzeichen))BEGIN ROLLBACK END;
CREATE TRIGGER ins_lkw_1 BEFORE INSERT ON lkwREFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM pkw
WHERE inserted.kennzeichen = pkw.kennzeichen))BEGIN ROLLBACK END;
Simulation durch TriggerSimulation 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
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
CREATE TRIGGER ins_pkw_1 BEFORE INSERT ON pkwREFERENCING NEW AS insertedWHEN (EXISTS (SELECT * FROM lkw
WHERE inserted.kennzeichen = lkw.kennzeichen))BEGIN ROLLBACK END;
CREATE TRIGGER ins_lkw_1 BEFORE INSERT ON lkwREFERENCING 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 beiEinfügeoperationenauf pkw oder lkw ...
... die neu eingefügten Zeilen mit der jeweils anderen Tabelle
10
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Triggereher imperativ
Optimierungsarbeit liegt beim Ersteller des SQL-Codes
wenig Optimierungs-möglichkeiten für DBMS
unübersichtlicher
Constraints vs. TriggerConstraints vs. Trigger
CHECK-Constraintsrein deklarativ
Optimierungsarbeit liegt beim DBMS
hoher Optimierungsbedarf intuitiver
Optimierender Compiler
11
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Soundcheck-Verfahren
Teil IITeil II: Das Soundcheck-Verfahren: 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
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Phase 1Phase 1
Phase 1: Differenz zwischen altem und neuem Zustand bestimmen
Kennzeichen FabrikatBN-AB-1234 VW
K-VB-1000 Ford
BM-W-999 BMW
SU-RF-4545 Fiat
inserted_pkwBM-W-999 BMW
SU-RF-4545 Fiat+
Kennzeichen FabrikatBN-AB-1234 VW
K-VB-1000 Ford
BM-W-999 BMW
SU-RF-4545 Fiat
K-VB-1000 Ford
BM-W-999 BMW
deleted_pkw
--
Differenztabelle
13
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Phase 1Phase 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
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Phase 2Phase 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
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Phase 3: Relevante Integritätsbedingungen bestimmen
Phase 3Phase 3
Constraints
Differenztabellen
inserted deleted
?Welche Constraints können verletzt werden?
?
16
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Phase 3Phase 3
Kennzeichen Fabrikat
BN-D-007 VW
... ...
BM-W-999 BMW
K-UH-123 BMW
Kennzeichen Achsen
K-VB-112 4
... ...
... CHECK (NOTNOT EXISTS (SELECT * FROM pkw, lkwWHERE pkw.kennzeichen = lkw.kennzeichen));
--
Kennzeichen Fabrikat
BN-D-007 VW
... ...
Kennzeichen Achsen
K-VB-112 4
... ...
auf jeden Fall konsistenter DB-Zustand!
Kann nichtverletzt werden !
KonsistenterDB-Zustand
17
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Phase 3Phase 3
Kennzeichen Fabrikat
BN-D-007 VW
... ...
BM-W-999 BMW
K-UH-123 BMW
Kennzeichen Achsen
K-VB-112 4
... ...
... CHECK (NOTNOT EXISTS (SELECT * FROM pkw, lkwWHERE pkw.kennzeichen =
lkw.kennzeichen));
+
KonsistenterDB-Zustand
Kennzeichen Fabrikat
BN-D-007 VW
... ...
Kennzeichen Achsen
K-VB-112 4
... ...
könnte Konsistenz verletzen
Kann u.U.verletzt werden !
BM-W-999 BMW
K-UH-123 BMW
18
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Phase 3Phase 3
Formal:
NOT EXISTS (SELECT * FROM pkw, lkwWHERE 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 Negationenmöglichst weit nach innen!
∀ X [ ¬ pkw(X,_) ¬ lkw(X,_) ]∨
19
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Phase 3Phase 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/k X/pSubstitution
+ t(k,a) -- v(n,p)
∀ X [ ¬ t(X,a) ∨ ¬ t(X,b) ] ∃ X [ ¬ u(X,m) ∨ v(n,X) ]
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 3Phase 3
Erstelle für jedes atom. Prädikat t(x1,...,xn, k1,...,km) der Constraint eine Formel…
IC])k,...,k,'x,...,'(x[deleted_t'x,...,'xIC])k,...,k,'x,...,'t(x[inserted_'x,...,'x
m1n1n1
m1n1n1
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
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Phase 4Phase 4
Phase 4: Relevante Integr.-Bedingungen spezialisieren
... CHECK (NOT EXISTS (SELECT * FROM pkw, lkwWHERE pkw.kennzeichen = lkw.kennzeichen))
... CHECK (NOT EXISTS (SELECT * FROM inserted_pkw, lkwWHERE inserted_pkw.kennzeichen = lkw.kennzeichen))
Spezialisierung
Relevante Änderungvon pkw
BN-AA-1111 Volvo
... ...
inserted_pkw
+
22
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Phase 4Phase 4
Funktioniert das immer?
... CHECK (NOT EXISTS (SELECT * FROM pkw, lkwWHERE pkw.kennzeichen = lkw.kennzeichen))
... CHECK (EXISTS (SELECT * FROM deleted_pkw, lkwWHERE deleted_pkw.kennzeichen = lkw.kennzeichen))
Spezialisierung ?
BN-AA-1111 Volvo
deleted_pkw
--
Kennzeichen Fabrikat
K-VB-110 VW
BN-AA-1111 Volvo
Kennzeichen Achsen
K-VB-110 4
BN-AA-1111 3
Bei Existenzaussagen: Betrachtung ganzer Tabelle unvermeidlich!
OK
23
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Phase 4Phase 4
Und hier?
... NOT EXISTS ( SELECT ... WHEREEXISTS (SELECT ... WHERE
NOT EXISTS ... )AND NOT EXISTS ( ... WHERE
EXISTS ... ) );
Existenz- oder Universalaussage?
24
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Phase 4Phase 4
Formal:
Eine Variable ist -∃ dominiert wenn links von ihr ein auftaucht.∃
∀ X [ ∃ Y [¬p(X,Y) ∧ ∀ Z [ q(Y,Z) ] ] ]
∃-dominiertnicht-dominiert∃
Variablen, die in der Negation-innermost Form nicht -dominiert sind,∃können spezialisiert werden!
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 4Phase 4
Wann ist die Integr.-Bedingung verletzt?(Formel für atom. Prädikat mit neg. Polarität)
Phase 3: ∃x1‘,...,xn‘ [inserted_t(x1‘,...,xn‘,k1,...,km) ¬IC ]∧
nicht-dominiert∃
∃-dominiert
Spezialisierte IC ohne oder vor ∃ ∀
den x1,...,xs
Constraint
Spezialisierte Constraint
Phase 4:∃x1,...,xs [ ∃xs+1‘,...,xn‘ [inserted_t(x1,...,xs,xs+1‘,...,xn‘,k1,...,km) ] ¬∧ ICS ]
26
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Phase 4Phase 4
∃X [ inserted_pkw(X,_) ( ∧ pkw(X,_) ∧ lkw(X,_) ) ]
... EXISTS (SELECT * FROM inserted_pkw, pkw, lkwWHERE inserted_pkw.kennzeichen = pkw.kennzeichenAND inserted_pkw.kennzeichen = lkw.kennzeichen)
Überprüfung in der Praxis:
Lies Belegungen für Xaus inserted_pkw …
… und prüfe, ob sie in pkw und lkw vorkommen
27
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Phase 5Phase 5
∃X [ inserted_pkw(X,_) ∧ pkw(X,_) lkw(X,_) ]∧
... EXISTS (SELECT * FROM inserted_pkw, pkw, lkwWHERE inserted_pkw.kennzeichen = pkw.kennzeichenAND inserted_pkw.kennzeichen = lkw.kennzeichen)
Phase 5: Spezialisierte Integr.-Bedingungen optimieren
∃X [ inserted_pkw(X,_) lkw(X,_) ) ]∧
... EXISTS (SELECT * FROM inserted_pkw, lkwWHERE inserted_pkw.kennzeichen = lkw.kennzeichen)
nach Einfügen:inserted_pkw pkw
Abfrage von pkw ist überflüssig
28
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Umwandlung in TriggerUmwandlung in Trigger
Constraint ist verletzt wenn...:
∃X [ inserted_pkw(X,_) lkw(X,_) ]∧ ∃X [ inserted_lkw(X,_) pkw(X,_) ]∧
EXISTS (SELECT * FROM inserted_pkw, lkwWHERE inserted_pkw.kennzeichen = lkw.kennzeichen)
EXISTS (SELECT * FROM inserted_lkw, pkwWHERE inserted_lkw.kennzeichen = pkw.kennzeichen)
SQL
29
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
Umwandlung in TriggerUmwandlung in Trigger
CREATE TRIGGER ins_pkw_1 BEFORE INSERT ON pkwREFERENCING NEW AS insertedWHEN (EXISTS (SELECT * FROM lkw
WHERE inserted.kennzeichen = lkw.kennzeichen))BEGIN ROLLBACK END;
CREATE TRIGGER ins_lkw_1 BEFORE INSERT ON lkwREFERENCING NEW AS inserted WHEN (EXISTS (SELECT * FROM pkw
WHERE inserted.kennzeichen = pkw.kennzeichen))BEGIN ROLLBACK END;
inserted_pkw
EXISTS (SELECT * FROM inserted_pkw, lkwWHERE inserted_pkw.kennzeichen = lkw.kennzeichen)
EXISTS (SELECT * FROM inserted_lkw, pkwWHERE inserted_lkw.kennzeichen = pkw.kennzeichen)
30
Henning Lehmacher - Effiziente Integritätsprüfung für SQL-Constraints
ZusammenfassungZusammenfassung
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