Guten Morgen
Wie im Titel schon erwähnt, habe ich hier ein Performance-Problem mit Oracle.
Ausgangslage
Eine Oracle Datenbank (10g) und C+±Clients, die per OCI darauf zugreifen. Das ganze läuft unter Red Hat Enterprise Linux ES4 und ist eine verteilte und replizierte Applikation. Der Datenzugriff erfolgt per Views. Damit das Lesen und das Schreiben von Daten per Views möglich ist, werden INSTEAD OF TRIGGER (INSERT; UPDATE; DELETE) eingesetzt.
Problem
Der Datenzugriff erfolgt bei einem bestimmten View, beim aller ersten Mal, sehr langsam. Das heisst, wurden Daten neue geschrieben erfolgt der erste Zugriff auf dieselben sehr langsam. Jede nachfolgende Abfrage ist annehmbar schnell. Dieser Vorgang wiederholt sich jeweils beim Neustart eines C+±Clients für denselben.
Derselbe Effekt kann bei dem Konsolentool sqlplus und dem DB-Manager-Tool Tora beobachtet werden.
Beschreibung des Views
Was den langsamen View von anderen unterscheidet, ist die Anzahl Joins (Inner und Outer/Left Joins). Der View basiert auf einer Tabelle, die einen Zusammenzug von Fremdschlüsseln abbildet. Diese Tabelle verweisst achtmal, per CONSTRAINT, auf eine hierarchisch übergeordnete Tabelle. Kurz gesagt, der View soll eine Matrix von Abhängigkeiten darstellen; wer gehört zu wem (SQL Source, siehe unten).
Tuning versuche
Folgendes habe ich bereits versucht:
- Zusätzliche Indexes (CREATE UNIQUE INDEX)
- MERGE JOIN /*+ USE_MERGE ( t1, t2 ) */
- NESTED LOOPS /*+ INDEX (t) */
- HASH JOIN /*+ USE_HASH (t) */
Die bringen auch eine Verbesserung, aber leider nur ab dem zweiten Datenzugriff.
Was muss ich tun, um den ersten Datenzugriff schneller zu machen?
Vielen Dank für die Hilfe
Olli
CREATE OR REPLACE VIEW
( )
AS
SELECT FROM
(
table\_8 T8
-- join 0 ---------------------------------------------------
JOIN table\_7 T7
ON T7.pk = T8.fk0\_t7 -- FK0 T7 (PK)
JOIN table\_6 T6
ON T6.pk = T7.fk\_t6
LEFT JOIN table\_5 T5
ON T5.pk = T6.fk\_t5
JOIN table\_4 T4
ON T4.pk = T5.fk\_t4
JOIN table\_3 T4
ON T3.pk = T4.fk\_t3
-- join 1 ---------------------------------------------------
LEFT JOIN table\_7 T7\_1
ON T7\_1.px = T8.fk1\_t7 -- FK1 T7
LEFT JOIN table\_6 T6\_1
ON T6\_1.pk = T7\_1.fk\_t6
LEFT JOIN table\_5 T5\_1
ON T5\_1.pk = T6\_1.fk\_t5
LEFT JOIN table\_4 T4\_1
ON TT4\_1.pk = T5\_1.fk\_t4
LEFT JOIN table\_3 T3\_1
ON T3\_1.pk = T4\_1.fk\_t3
-- join 2 ---------------------------------------------------
LEFT JOIN table\_7 T7\_2
ON T7\_2.pk = T8.fk2\_t7 -- FK2 T7
LEFT JOIN table\_6 T6\_2
ON T6\_2.pk = T7\_2.fk\_t6
LEFT JOIN table\_5 T5\_2
ON T5\_2.pk = T6\_2.fk\_t5
LEFT JOIN table\_4 T4\_2
ON T4\_2.pk = T5\_2.fk\_t4
LEFT JOIN table\_3 T3\_2
ON T3\_2.pk = T4\_2.fk\_t3
-- join 3 ---------------------------------------------------
LEFT JOIN table\_7 T7\_3
ON T7\_3.pk = T8.fk3\_t7 -- FK3 T7
LEFT JOIN table\_6 T6\_3
ON T6\_3.pk = T7\_3.fk\_t6
LEFT JOIN table\_5 T5\_3
ON T5\_3.pk = T6\_3.fk\_t5
LEFT JOIN table\_4 T4\_3
ON T4\_3.pk = T5\_3.fk\_t4
LEFT JOIN table\_3 T3\_3
ON T3\_3.pk = T4\_3.fk\_t3
-- join 4 ---------------------------------------------------
LEFT JOIN table\_7 T7\_4
ON T7\_4.pk = T8.fk4\_t7 -- FK4 T7
LEFT JOIN table\_6 T6\_4
ON T6\_4.pk = T7\_4.fk\_t6
LEFT JOIN table\_5 T5\_4
ON T5\_4.pk = T6\_4.fk\_t5
LEFT JOIN table\_4 T4\_4
ON T4\_4.pk = T5\_4.fk\_t4
LEFT JOIN table\_3 T3\_4
ON T3\_4.pk = T4\_4.fk\_t3
-- join 5 ---------------------------------------------------
LEFT JOIN table\_7 T7\_5
ON T7\_5.pk = T8.fk5\_t7 -- FK5 T7
LEFT JOIN table\_6 T6\_5
ON T6\_5.pk = T7\_5.fk\_t6
LEFT JOIN table\_5 T5\_5
ON T5\_5.pk = T6\_5.fk\_t5
LEFT JOIN table\_4 T4\_5
ON T4\_5.pk = T5\_5.fk\_t4
LEFT JOIN table\_3 T3\_5
ON T3\_5.pk = T4\_5.fk\_t3
-- join 6 ---------------------------------------------------
LEFT JOIN table\_7 T7\_6
ON T7\_6.pk = T8.fk6\_t7 -- FK6 T7
LEFT JOIN table\_6 T6\_6
ON T6\_6.pk = T7\_6.fk\_t6
LEFT JOIN table\_5 T5\_6
ON T5\_6.pk = T6\_6.fk\_t5
LEFT JOIN table\_4 T4\_6
ON T4\_6.pk = T5\_6.fk\_t4
LEFT JOIN table\_3 T3\_6
ON T3\_6.pk = T4\_6.fk\_t3
-- join 7 ---------------------------------------------------
LEFT JOIN table\_7 T7\_7
ON T7\_7.pk = T8.fk7\_t7 -- FK6 T7
LEFT JOIN table\_6 T6\_7
ON T6\_7.pk = T7\_7.fk\_t6
LEFT JOIN table\_5 T5\_7
ON T5\_7.pk = T6\_7.fk\_t5
LEFT JOIN table\_4 T4\_7
ON T4\_7.pk = T5\_7.fk\_t4
LEFT JOIN table\_3 T3\_7
ON T3\_7.pk = T4\_7.fk\_t3
);