Axel Richter: Join Abfrage unheimlich langsam

Beitrag lesen

Hallo,

Ich nehme mal an, das doppelte WHERE war im original SQL nicht vorhanden? ;-)).

SELECT A.auf_index, A.auf_auflagentermin, B.ba_lfnr, B.ba_datum, B.ba_arbeitsvermerk, B.ba_auflagentermin, B.ba_auflagentermin_ok
FROM auftrag A LEFT JOIN ba B ON (A.auf_index=B.auf_index)
where

(A.auf_typ='Auftrag' AND A.auf_auflagentermin IS NOT NULL AND A.auf_auflagentermin_ok IS NULL AND A.auf_auflagentermin>="2004-05-03" AND B.auf_index IS NULL)

OR

(A.auf_typ='BA' AND B.ba_auflagentermin IS NOT NULL AND B.ba_auflagentermin_ok IS NULL AND B.ba_auflagentermin>="2004-05-03"
AND A.auf_index=B.auf_index)

^Wenn das zutrifft, dann gilt: B.auf_index IS NOT NULL

AND

(A.auf_typ='Auftrag' AND B.ba_auflagentermin_ok IS NULL AND B.ba_auflagentermin IS NOT NULL OR A.auf_typ='BA')

=>

(A.auf_typ='Auftrag' AND A.auf_auflagentermin IS NOT NULL AND A.auf_auflagentermin_ok IS NULL AND A.auf_auflagentermin>="2004-05-03" AND B.auf_index IS NULL)
OR
(A.auf_typ='BA' AND B.ba_auflagentermin IS NOT NULL AND B.ba_auflagentermin_ok IS NULL AND B.ba_auflagentermin>="2004-05-03"
AND B.auf_index IS NOT NULL)
AND
(A.auf_typ='Auftrag' AND B.ba_auflagentermin_ok IS NULL AND B.ba_auflagentermin IS NOT NULL OR A.auf_typ='BA')

Zuordnung:
A.auf_typ='Auftrag' = X0
A.auf_auflagentermin IS NOT NULL = X1
A.auf_auflagentermin_ok IS NULL = X2
A.auf_auflagentermin>="2004-05-03" = X3
B.auf_index IS NULL = X4; B.auf_index IS NOT NULL = NOT X4

A.auf_typ='BA' = X5
B.ba_auflagentermin IS NOT NULL = X6;
B.ba_auflagentermin_ok IS NULL = X7;
B.ba_auflagentermin>="2004-05-03" = X8

=>

(X0 AND X1 AND X2 AND X3 AND X4)
OR
(X5 AND X6 AND X7 AND X8 AND NOT X4)
AND
(X0 AND X7 AND X6 OR X5)

http://www-ihs.theoinf.tu-ilmenau.de/~sane/projekte/karnaugh/embed_karnaugh.html
Leider können hier nur maximal 6 Variablen betrachtet werden. Wir betrachten deshalb nur:
(X5 AND X6 AND X7 AND X8 AND NOT X4)
AND
(X0 AND X7 AND X6 OR X5)
und erhalten:
(NOT X4 AND X8 AND X7 AND X6 AND X5)

=>
where (X0 AND X1 AND X2 AND X3 AND X4) OR
(NOT X4 AND X8 AND X7 AND X6 AND X5)

=>
where (A.auf_typ='Auftrag' AND A.auf_auflagentermin IS NOT NULL AND A.auf_auflagentermin_ok IS NULL AND A.auf_auflagentermin>="2004-05-03" AND B.auf_index IS NULL) OR
(B.auf_index IS NOT NULL AND B.ba_auflagentermin>="2004-05-03" AND B.ba_auflagentermin_ok IS NULL AND B.ba_auflagentermin IS NOT NULL AND A.auf_typ='BA')

Angaben ohne Gewähr ;-))

Die Vorgehensweise sollte aber klar sein. Wenn Du Lust hast, kannst Du auch einen eigenen Karnaugh-Plan aufstellen, der dann alle Variablen abdeckt. Zur Theorie des Minimierungsverfahrens nach Karnaugh habe ich auf die Schnelle nichts wirklich umfassendes gefunden. Hier http://maui.theoinf.tu-ilmenau.de/~sane/skript_new/node27.html#SECTION00042100000000000000 wird es kurz und _sehr_ mathematisch beschrieben. Eventuell hat jemand einen besseren Link. Der würde mich auch interessieren.

viele Grüße

Axel