Wie wird eine Oracle-Datenbank durchsucht?

lindin

Erfahrenes Mitglied
Hallo, da ich ein paar Probleme bei der Ausführung von Datenbankinternen Funktionen auf bestimmte Datensätze habe interessiert mich, wie eine Oracle-Datenbank durchsucht wird!

Ich dachte immer, es wird vielleicht anhand des Primary Keys die Suche "geordenet" also daß man mit dem kleinsten Element des Primary Keys beginnt, doch das scheint nicht der Fall zu sein!

Kann mir da jemand weiter helfen?

Ich greife einmal per TOAD auf die Datenbank zu und einmal per jdbc aus einem JAva-Programm heraus, kann es sein, daß diese beiden Anfragen auch unterscheidlich behandelt werden?
 
Hallo!

TOAD verwendet IMHO überweigend das Oracle Call Interface (OCI) um mit der Oracle Datenbank zu sprechen.

Von Java aus kannst du natürlich auch per JDBC über das OCI gehen jedoch verwendet man dort meißt die "Thin" Version des Oracle JDBC Treibers.

Wie das auffinden von Datensätzen in einer Datenbank geschieht ist seeeeeeeehr komplex und bedarf ausführlicher Fachliteratur zur vollständigen Klärung.

Gruß Tom
 
Wenn man nicht mit select distinct... oder ... order by ... arbeitet, kann man davon ausgehen, dass die records ungeordnet zurückkommen.
 
Hm, ich dachte, da Datenbanken dazu da sind, Daten in strukturierter Form zu speichern, daß es da auch einen "strukturierten" Zugriff auf die Dateinbank gibt...

Aber wenn ich jetzt mit distinct auf den Primary Key einen select machen würde, (Gibt es eh nur immer einen Datensatz von) dann würde das geordnet zurückkommen?
 
lindin hat gesagt.:
... dazu da sind, Daten in strukturierter Form zu speichern, daß es da auch einen "strukturierten" Zugriff auf die Dateinbank gibt...

Ein RDBMS ist keine Exceltabelle die dir genau die gleiche Zeilenanordnung wieder zurückgibt, die du irgendwann gespeichert hast. Es sind ziemlich komplexe Systeme, die insert, update, delete usw. eigenständig verwalten.

Die Funktionen für den "strukturierten" Zugriff auf die Datenbank sind doch alle vorhanden.

mit einem select distinct auf den Primary Key bekommst du nur den PKey zurückgeliefert, wenn dir das reicht.
Ansonsten ... order by ...
Du könntest es auch mit einem Index versuchen, der die gleichen Spalten, und Reihenfolge, wie deine where-clause enthält.
 
Also prinzipiell kannst du nie erwarten dass Oracle dir Werte geordnet zurückliefert, es sei denn du verwendest eine Operation wie GROUP BY oder eben implizit ORDER BY.
Bei GROUP BY sortiert Oracle die Daten um sie schneller zu gruppieren. Ein DISTINCT ist vom vorgehen mit GROUP BY vergleichbar.

Mit welchem Programm du auf Oracle zugreifst (TOAD/OCI/Thin JDBC) ist vollkommen egal, letztendlich entscheided der Optimizer der das Statement parst ob es sinnvoll ist die Daten für die Ausgabe zu sortieren.

Ein SSELECT Distinct auf den PK macht überhaupt kein Sinn da ein PK wie schon gesagt UNIQUE ist. Ein ORDER BY wäre da besser, da für jeden PK automatisch ein Btree Index angelegt wird und dieser kann nun über seine Blätter einfach sortiert abgerufen werden.

Wenn du sicher gehen willst ob Oracle dein Statement nun sortiert oder nicht solltest du einen EXPLAIN PLAN machen. Da steht ganz genau drin wie der Optimizer dein Statement parst und ob er für die Ausführung sortiert. Bei komplexen Abfragen werden manchmal z.B. nur Untermengen aus Subselects sortiert, weshalb man die Gesamtmenge trotzdem sortieren muss.
 
Zurück