Performance Tabellenabfrage

FUT320

Benutzer
Beiträge
9
Hallo,

ich versuche mich gerade an der Abfrage einer Oracle Datenbank. Grundkenntnisse in SQL habe ich aber wie und wann eine Abfrage performant ist, kann ich nicht richtig beantworten.
In meiner Abfrage werden mir zwar alle Datensätze angezeigt (11), jedoch bin ich mit der Abfragezeit etwas unzufrieden.

Code:
select a.feld1, a.feld2, SUBSTR(a. feld3,10,4) As feld3_kurz, a.feld4/1000 As feld4_kurz, a.feld5/1000 as feld5_kurz, a.feld6/100 As feld6_kurz, a.feld7/100 As feld7_kurz, b.feld8/100 As feld8_kurz, a.datum, a.zeit from tabelle1 a Left Join tabelle2 b ON a.feld3 = b.feld3 where a.datum = '20160929' AND a.zeit > '0600' AND a.zeit < '2200'  AND a.personalnummer = '10'

tabelle1 hat 11.417.052 Datensätze und tabelle2 6.388.082.

Die Abfragezeit beträgt 12,3 Sekunden. Nun weiß ich überhaupt nicht, ob das für diese Menge an Datensätzen in Ordnung ist oder ob es Verbesserungsbedarf gibt. Habt ihr evtl. Tipps, wie ich meine Abfrage besser gestalten kann?

Gruß
 
Werbung:
Was sagt denn Explain dazu? Wie viele Datensätze purzeln denn unten raus? Was für Indexe sind gesetzt?

Aus dem Bauch heraus erscheinen mir 12 Sekunden deutlich zu viel.
 
Also für 11 Datensätze sind 12,3 Sekunden erstmal unterirdisch, produktiv eigentlich nicht nutzbar. Nun liegt die Ursache mit hoher Warscheinlichkeit in der Menge der zugrunde liegenden Datensätze und der Tatsache, das du per WHERE und im Join nach bestimmten Eigenschaften suchst. Diese Suche erfordert einen Full Table Scan und kann vermutlich mit einem passenden Index beschleunigt werden.

Du solltest dich mit EXPLAIN befassen, das zeigt dir wo deine Performance drauf geht. Über Indexe solltest du dich auch grundlegend mal Informieren bevor du einen erstellst.

Natürlich können auch noch andere Faktoren eine Rolle spielen, die Hardware z.B.. Aber das würde ich erstmal ausklammern.
 
Danke für die sehr schnellen Antworten!
Ich versuche mal, aus dem Explain Plan schlau zu werden. Indexe könnten die Abfrage vielleicht beschleunigen, jedoch darf an der Datenbank keine Änderung vorgenommen werden und die Erstellung eines Index zählt, denke ich mal, unter solches.
 
Ja durchaus, Indexe verlangsammen auch die Schreibgeschwindigkeit. Aber ohne wird es nicht viele Möglichkeiten geben es sei denn du baust dir die DB nach für Analysezwecke und erstellst z.B. dort den Index. Das macht natürlich nicht immer Sinn.
 
Danke für die sehr schnellen Antworten!
Ich versuche mal, aus dem Explain Plan schlau zu werden. Indexe könnten die Abfrage vielleicht beschleunigen, jedoch darf an der Datenbank keine Änderung vorgenommen werden und die Erstellung eines Index zählt, denke ich mal, unter solches.

Du kannst den Execution Plan sicher auch hier Posten. Dann können mehrere Augen darauf schauen und helfen.
 
jedoch darf an der Datenbank keine Änderung vorgenommen werden und die Erstellung eines Index zählt, denke ich mal, unter solches.

Was mir dazu einfällt: ein CREATE INDEX benötigt einen exclusiven lock, in PG (vermutlich auch/ähnlich in Oracle) kann man das via CREATE INDEX CONCURRENTLY vermeiden. Du solltest also wirklich auch aufpassen mit dem, was du tust. Andererseits: wenn es an einem fehlenden Index liegt, ist der beste Weg, das Problem zu lösen, den Index zu erstellen.
 
Werbung:
Zurück
Oben