Zum Inhalt springen

SQL Plus - Sortiert Ausgabe


sayso

Empfohlene Beiträge

Hallo zusammen,

ich habe ein kleines Problem und bin mir sicher das ihr mir helfen könnt.

Ich habe eine Tabelle TAB1 in der folgende Datensätze sind (ich weiss aber nicht ob sie sortiert in den Datenbank liegen).

TAB1:

DAT BELNR JAHR

010 111111 2005

010 111112 2006

010 111113 2006

Nun wollte ich sehen ob die Datensätze aufsteigend nach BELNR in der Tabelle liegen.

Wenn ich mit sqlplus einen select ausführe ("select BELNR from TAB1") dann sehe ich die BELNR sortiert.

Mache ich das Statement über den OEM mittels view/edit content dann sehe ich die BELNR unsortiert (also erst 111113 und dann 111111 und dann 111112).

Sortiert der SQLPLUS von sich aus, oder stellt es mir die Funktion aus dem OEM falsch dar??

Ich bin etwas vewirrt, wenn die Jungs aus der Applikation die Datensätze mittels "select * from TAB1" machen, dann bekommen sie diese auch unsortiert.. von daher gehe ich davon aus das der sqlplus sortiert...

Kann ich ihm das irgendwie austreiben? oder gibt es evtl. ein anderes Problem?

Die Tabelle hat natürlich noch mehrere Felder... aber die Schlüßelfelder sind DAT BELNR und JAHR...

Würdet mir echt helfen :)

Datenbank ist eine Oracle 9.2. Patchset 7 und auf den Feldern liegt auch ein Index...

Danke!

Link zu diesem Kommentar
Auf anderen Seiten teilen

In einer Relationalen Datenbank wird von sich aus erstmal nix sortiert.

Du musst immer order by angeben.

Kann sein das SQLPLUS von sich aus einzelne Spalten oder Primärschlüssel sortiert, aber warum willst du das deaktivieren?

Gruß Jaraz

Hallo Jaraz,

habe nun etwas anderes festgestellt...

Mach ich einen "select * from TAB1" kommen die Daten unsortiert... mache ich allerdings einen "select BELNR from TAB1" kommt BELNR sortiert...

Der Index liegt über folgenden Feldern: DAT BELNR JAHR

Ich möchte es nicht deaktivieren, aber da die Jungs aus der Anwendung keinen Sort in ihre Applikation implentiert haben und sich auf die sortierte Tabelle verlassen haben stehen wir nun vor einem problem.

Ich möchte einfach sehen wie die Datensätze in der DB liegen....

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich möchte einfach sehen wie die Datensätze in der DB liegen....

das ist speziell bei oracle nur über die ROWID (und tiefergehende berechnungen damit) möglich. ansich ist nicht vorhersehbar, in welcher reihenfolge daten (welche ohne ORDER BY selectiert wurden) daherkommen, da sich speicherplätze der zeilen über tablepaces und instanzen hinweg ändern können.

s'Amstel

Link zu diesem Kommentar
Auf anderen Seiten teilen

achso, also willst du doch alle Spalten ausgeben, aber ohne order by sortiert haben? Das geht nicht. Da müssen die Jungs wohl doch noch eine Sortierung ins Programm einbauen. Alternative: einen View erzeugen der sortiert und den im Programm abfragen.

Hallo,

wenn ich über den Index selektiere (also keinen FULL Table Scan), dann kommen die Daten sortiert ... wie kommt das zu stande?

Gruß und danke :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

weil der optimierer automatisch einen INDEX SCAN macht, es sei denn du gibst ihm einen OPTIMIZER HINT, z.b. den NO_INDEX.

kannst du deinen QUERY PLAN posten?

s'Amstel

Hallo,

hier der QUERY_PLAN:

select * from TB1 where numrow < 666666;

1) <SCHEMA>.TB1 TABLE ACCESS FULL

2) COUNT STOPKEY (da ich ein numrow mitgebe, da die Tabelle zuviele Einträge hat)

3) Select Statement (Costs: 746,848)

select DAT,BELNR,JAHR,BESCH from TB1 where numrow < 666666;

1) <SCHEMA>.TB1~0 INDEX FULL SCAN

2) COUNT STOPKEY (da ich ein numrow mitgebe, da die Tabelle zuviele Einträge hat)

3) Select Statement

Link zu diesem Kommentar
Auf anderen Seiten teilen

was ist NUMROW? ich kenne nur ROWNUM.

versuchs mal mit

SELECT /*+ NO_INDEX(TB1 dein_zusammengesetzter_index) */ DAT, BELNR, JAHR, BESCH from TB1;

Hallo,

ja ich meinte ROWNUM - ich tippe leider alles ab, da ich aus Java Oberfläche (OEM) nicht kopieren kann :-\

Wenn ich den NO_INDEX angebe macht er trotzdem einen Indexscan mittes <SCHEMA>.TB1~0.

Aber die entscheidende Frage ist:

Warum sortiert er mir die Ausgabe aufsteigend wenn er einen Full Indexscan macht und warum bekomm ich sie unsortiert beim FULL Table Scan...

Arbeitet der Indexscan anders, so das er bei niedrigsten Wert anfängt und sich dann nach oben arbeitet?

Mein SQL-Statement mit NO_Index war so:

SELECT /*+NO_INDEX(HOLT.TB1~0)*/ DAT,BELNR,JAHR,BESCH from HOLT.TB1 where numrow < 666666;

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die garantiert einfachste Lösung deines problems ist, dass eure Programmierer an den select, mit dem sie die Daten aus der DB holen, einen "order by" anhängen, oder du einen sortierten View generierst auf den sie zugreifen können (Orginaltabelle Name ändern, View wie Tabelle nennen, den Feldern im View nen identischen alias verpassen wie dieTabfelder hießen, und schon kriegen deine Programmierer ohne Änderungsaufwand die Daten sortiert.)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die garantiert einfachste Lösung deines problems ist, dass eure Programmierer an den select, mit dem sie die Daten aus der DB holen, einen "order by" anhängen

Das werden sie auch tun :-P aber mich interessiert es trotzdem warum es ein anderes ergebniss liefert :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

aber mich interessiert es trotzdem warum es ein anderes ergebniss liefert :)

möglicherweise wird auch ein "index fast full scan" gemacht, während dein (zugegebenermassen, befremdlicher, explain plan) einen "index full scan" anzeigt. es kommt teilweise auch darauf an, um welche art index es sich handelt (b-baum, domain, bitmap join, etc.). experimentiere allenfalls mit weiteren optimizer hints, um dahinterzukommen.

s'Amstel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aber die entscheidende Frage ist:

Warum sortiert er mir die Ausgabe aufsteigend wenn er einen Full Indexscan macht und warum bekomm ich sie unsortiert beim FULL Table Scan...

ein index ist bereits sortiert, daher ist die reihenfolge, in der die einzelnen zeilen zurückgegeben werden, vorgegeben und zwar in exakt der gleichen reihenfolge in der der index aufgebaut ist, weil der zugriffspfad indexentry->rowid ist.

bei einem tablescan wird die tabelle von ersten block bis zur HWM gelesen. bei heap-tables können die rows vollkommen ungeordnet in den blöcken liegen, die reihenfolge entspricht dann der reihenfolge der rows in den blöcken.

-j

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...