Anmelden

View Full Version : sql durch empfolene zugriffe langsamer



Seiten : 1 2 [3]

B.Hauser
23-10-15, 12:37
SQL generiert so gut wie keine temporären Dateien (auch nicht für CTEs oder verschachtelte Sub-Selects!). Die Erstellung und Verarbeitung von temporären Dateien ist viel zu aufwändig. SQL hat ganz andere weit performantere Methoden als temporäre Dateien zu bilden.

Was wir hier tun ist reine Spekulation!
Ohne die aktuellen Daten zu kennen und ohne zu wissen welche Indices vorliegen, stochern wir nur im Trüben und raten uns einen ab.

Wie Andreas schon sagt, es muss analysiert werden. Lass die Abfrage über Visual Explain laufen und analysiere im Anschluss die einzelnen Knoten.

EVIs und Derived/Sparsed Indices machen durchaus Sinn! Aber ob und welche in der gezeigten Abfrage sinnvoll sind, lässt sich anhand der Abfrage ohne Daten nicht sagen!
Ich würde z.B. als erstes einen Index für die 1. CTE anlegen, mit dem dec(substr(inhacd, 1, 2), 2, 0) und den in den WHERE-Bedingungen angegebenen Spalten als Schlüssel. Für die folgenden CTEs sollte damit ein Index Only Access auf diese Tabelle möglich sein. ... und dann weiter sehen.

"Normale" Indices sollten nicht mehr als DDS beschriebene logische Dateien, sondern als echte Indices angelegt werden. (DDS ist "stabilized" und SQL Indices haben per Default eine größere Page Size).

Birgitta

andreaspr@aon.at
23-10-15, 12:44
Mit WITH hast du viele vorteile. Angefangen von der Lesbarkeit bis hin die einzelnen Sub-Queries einfacher zu testen.
Es ist aber ähnlich wie bei einer View.
Wenn du das ganze SQL in eine View packst und dann ein Select * From View machst ändert sich auch nichts.
Einen Performance gewinn kannst du dann erhalten, wenn du es so aufsplittest wie ich es oben im Beispiel beschrieben habe.

Über das Forum ist es ab einer gewissen Stelle schwierig zu helfen.
In solchen Situationen biete ich bei meinen Kunden auch unterstützung via Telefon & TeamViewer an.

Im Visual Explain solltest du alles finden können, man muss halt nur wissen wo man suchen muss.
Es ist zugegeben anfangs nicht ganz einfach durchzublicken, aber es ist eines der wichtigstens Werkzeuge bei der Analyse

Fuerchau
23-10-15, 13:10
Mir wäre lieber, wenn SQL viel öfters temporäre Tabellen erstellen würde und auch Indizes auf diese erstellt, dann müsste ich dies nicht dauernd selber machen.
Durch die ständige Wiederholung der Subselects auf der Einzelsatzebene ist es wirklich effektiver ein Zwischenergebnis mit Index zu erstellen als alle in ein dickes SQL zu packen.
Laufzeiten von Minuten sinken da oft auf Sekunden.

Ich habe schon früher temporäre Tabellen vorab erstellt, was heute ja per "Create as Select" viel einfacher ist.
Selbst wenn das tausende Sätze gibt, dauert das häufig unter einer Sekunde.
Mit anschließendem Index und verjoinen auf andere (auch temporäre) Daten gewinnt man enorm.

Der Optimizer kann ja auch nur raten was man eigentlich will.
Also gedanklich manchmal einen oder 2 Schritt/e zurück und dann noch mal.