MoveLast ( Anfängerfrage )



  • Hallo,

    wie oben schon bemerkt, bin ich absoluter Anfänger auf dem Gebiet der
    Oracle ODBC Programmierung. Immerhin habe ich es geschafft, mit den ganzen
    Links hier, mir eine kleine Stammdatenverwaltung zu schreiben, die auch
    prinzipiell funktioniert. Im Prinzip kann ich durch meine Datenbank durchblättern, ändern, einfügen oder auch löschen ( Die Datenbank besteht
    aus ca. 90000 Datensätzen, die einen Primary und zwei Secondary Keys haben ).

    Jetzt zu meiner eigentlichen Frage; ich brauche noch eine Funktion, die auf den letzten Datensatz in der Datenbank ( Primary Key ) positioniert, damit ich dann von da aus zurückgehen kann ( man 'blättert' jeweils 50 Datensätze vor oder zurück, diese werden dann in einer Listctrl angezeigt ). Dummerweise braucht das MoveLast () ewig lang, mindestens im 15 Sek. Bereich; dies ist
    mir nicht klar, da der Primary Key doch eigentlich sortiert sein müßte.

    Oder liegt der Fehler am anfänglichen Select Befehl, der
    SELECT * from ... ORDER BY Primary Index heißt ( jedenfalls so
    ähnlich, habe ich jetzt nicht hier )

    Falls die Frage ( das Problem ) zu trivial sein sollte, sorry

    vielleicht hat ja einer eine tolle Info für mich

    tschüss Dieter



  • Sagen wir mal er steht am Anfang auf 0:

    select * from tabelle where key between 0 and 50 order by key;
    

    Dann will er weiterblättern und die Datensätze 50-100 lesen:

    select * from tabelle where key between 50 and 100 order by key;
    

    Wie leicht auffällt, musst du in deinem Programm nur startIndex speichern und jeweils 50 für endIndex dazuaddieren. startIndex darf zusätzlich nicht <0 werden und nicht >anzEinträge.

    Ich weiß nicht was du da mit MoveLast() machst, ich habe fast die Befürchtung du gibts ein Query für alle Datensätze ab und wundest dich dann warum 90000KB ~ 90MB in deinem Speicher nicht schnell durchforstet werden 🙂

    MfG SideWinder



  • nur statt between wäre limit besser - denn was machst du, wenn die IDs nicht fortlaufend sind?

    die höchste ID (um von hinten nach vorne zu gehen) bekommst du per
    select max(id) from ...
    die anzahl der einträge per
    select count(id) from ...

    und per limit kann man angeben wieviele datensätze gelesen werden sollen



  • erstmal, werde ich nachher mal ausprobieren; die Idee, daß bei einem
    MoveLast () offensichtlich über die ganze Tabelle gescrollt wird,
    hatte ich natürlich auch schon; stellt sich die Frage, warum das Open
    mit dem entsprechenden Select * from recordset ... blitzschnell da ist,
    und man von anfang an perfekt durchsuchen ( und zwar blitzschnell ) kann.
    Muß doch eigentlich von rückwärts genauso gut gehen ?
    Vielleicht fehlt mir auch nur das Verständnis für solch eine relationale
    Datenbank, da ich bisher nur mit rein indexorientierten Datenbanken
    zu tun hatte.

    tschüss, Dieter



  • Weil du vermutlich das Resultset auf dem Server läßt.
    Somit werden die Daten nicht auf den Client übertragen was ja bei der Anzahl Datensätze erhebliche Zeit beansprucht.

    Ob ODBC bei MoveLast alles Datensätze auf den Client lädt und dann ein MoveLast durchführt weiß ich leider nicht. Hängt von ODBC-Treiber ab.
    Anzunehmen ist es aber bei deinem Problem.



  • Shade Of Mine schrieb:

    nur statt between wäre limit besser - denn was machst du, wenn die IDs nicht fortlaufend sind?

    Oracle kennt den Befehl limit nicht, dieser ist MySQL Spezifisch...


Anmelden zum Antworten