Announcement

Collapse
No announcement yet.

1 Million Datensätze - Quo Vadis Interbase ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 1 Million Datensätze - Quo Vadis Interbase ?

    Hallo,

    ich habe das Problem, in einer Tabelle mehr als 1 Million Datensätze verwalten zu müssen.

    Nun sollen diese mal gefiltert und mal ohne Filter in einem DB-Grid dargestellt werden.

    Bis zu einigen tausend Datensätzen ging mein Konzept (Tabelle --> DBGrid) noch.
    Aber jetzt kann ich Kaffee trinken gehen, bevor der Sanduhrzeiger (SQL) wieder freigegeben wird, wenn im Grid eine Aktion stattfindet.

    Welche Möglichkeit der Darstellung wählt man, bei so einer grossen Datenmenge ?? Ich benötige jedenfalls die Daten "updatebar" in einem Grid.

    Hardware: PIII, 733 MHz, Windows-2000, Delphi 5

    Vielen Dank für rasche Hilfe !

    Gruss<br>Helmut

  • #2
    Hast Du es schon einmal mit TIBQuery in Verbindung mit TIBUpdateSQL versucht? Ich verwende das Pendant schon seit längerem bei der BDE und bin mit den Resultaten recht zufrieden. Ich meine, TIBQuery müsste anders auf die Daten zugreifen, genaueres weiß aber bestimmt Herr Kosch

    Comment


    • #3
      Bin zwar nicht Herr Kosch aber antworte mal.

      Der Zugang über die TTable, weil da wie be Desktop Datenbanken üblich der Client die Filterung macht, also alle 1 Million Datensätze vom Server zum Client und dort durch den Filter laufen, also gähn.

      TQuery,TIBQuery usw mit einer where Klausel, lassen den Server suchen, dafür ist der da. Und dann wird es schnell

      Comment


      • #4
        Hi Helmut,

        1)
        Wie Andreas Tengicki bereits bemerkte, ist ein Filter in Verbindung mit SQL-Datenbanken gruselig. Der SQL-Server ist der Knecht, der gefälligst <b>nur</b> die benötigte Datenmenge zu liefern hat.

        2)
        Die DBGrid-Implementation kann leider ihre Desktop-Herkunft nicht verleugnen und bremst ab einer gewissen Datenmenge durch interne Prüfungen/Gegebenheiten mächtig aus ( 1 mio und auch nur 10% davon ist schon ne ganze Menge... ).

        3)
        Welche Anwendung verlangt denn auch "nur" 100.000 "updatebar" in einem Grid ??

        4)
        Wie stellt man 100.000 Datensätze ( selbst in einem scrollbaren Grid ) 'übersichtlich' auf dem Bildschirm dar ??

        5)
        Muß man trotzdem mit derartig grossen Datenmengen <b>clientseitig</b> operieren, ist ein DBGrid die erste visuelle Komponente, die hinten runter fällt.
        Soll eine so grosse Datenmenge trotzdem angezeigt werden, muss man sich ernsthaft Gedanken über einen Ersatz durch eine eigene bzw. von anderen optimierte Gridversion machen. Diese kann Unzulänglichkeiten unterbinden, die ein TDBGrid aufgrund seiner universellen Natur zwangsläufig mit sich bringt.

        6)
        Mir ist immer noch nicht eingefallen, welcher Nutzer ein Grid mit 100.000 Datensätzen als 'Wohltat' -weil übersichtlich- empfinden könnte ( Er sieht selbst bei kleinster Schriftart und grösstem Bildschirm maximal 0.001% der Datensatzzahl ).

        Fazit:
        Derartige Datenmengen sind ein Klassiker für <b>serverseitige</b> Bearbeitung. Vom Gegenteil lass ich mich gern überzeugen.

        Gruß Gesin

        Comment


        • #5
          IBObjects in der Version 4 (soll in kürze erscheinen) wird Datenmengen mit (simuliertem) bidirektionalem Cursor unterstützen. Damit kannst Du in einer sehr großen Datenmenge mittels Grid navigieren, ohne dass der Client sich u.U. die komplette Datenmenge vom Server holen muß. Falls es Dich interessiert: Es gibt eine beta-Version von IBO-4. Wenn Du damit arbeiten möchtest, kannst Du bei Jason Wharton ([email protected]) nach der beta-Version fragen.

          Gruss
          Karsten Strobe

          Comment


          • #6
            An Alle:<br>
            Danke für die Antworten!

            Speziell für Gesine:<br>
            Hi Gesine,

            Ich habe nicht behauptet, dass im Grid 100.000 Datensätze sind. Die darstellbare Datenmenge welche im Grid erscheint, beläuft sich auf ca. 60 Datensätze, so dass das Grid hiemit keine Probleme hat.

            Dies ändert aber nichts an der Tatsache, dass in der Tabelle mehr als 1 Mill Datensätze sein können.

            Das Problem ist das dynamische Herausfiltern der gerade benötigten Datensätze. Der Filter muss änderbar sein.

            Eine View auf die Tabelle scheidet aus, weil ich hier keine Parameter übergeben kann, um z.B. den Where-Part einzugrenzen.

            Ich werde es mal mit einer Stored-Procedure versuchen, wobei ich noch nicht weiß, ob diese eine updatebare Datenmenge zurückliefert.

            Gruss Helmu

            Comment


            • #7
              Nachtrag:

              Es sollte wie am Anfang erwähnt, wahlweise auch die Darstellung der ungefilterten Datenmenge ersichtlich sein. Natürlich ist es klar, dass man hier auf Grund der Grid-Dimension nur ca. 20 Datensätze sehen kann.

              Aber man kann kontrollieren, ob nicht vielleicht durch eine falsche Filterbedingung Datensätze bei der gefilterten Filterdarstellung rausgefallen sind

              Comment


              • #8
                Hallo,

                wenn man sich absichtlich nicht an die in der C/S-Welt üblichen Regeln hält, darf man dann aber auch nicht den SQL-Server (InterBase) beschuldigen, seine Aufgaben nicht zu erfüllen ;-)<br>
                (Gesine hat hier völlig Recht)

                Wenn man im TDBGrid nur maximal 80 Datensätze anzeigen kann, bedeutet dies, dass man auch immer nur 80 Datensätze von der Datenbank gleichzeitig abfordern muss. Das folgende Beispiel rüstet für den InterBase das nach, was beim Microsoft SQL Server über die SELECT TOP-Funktion intern verfügbar ist:
                <pre>
                CREATE PROCEDURE GetFirstXKunden (rows INTEGER)
                RETURNS (kundenid INTEGER, vorname CHAR(35), nachname CHAR(35)) AS
                BEGIN
                IF (rows <1) THEN EXIT;
                FOR SELECT kundenid, vorname, nachname
                FROM kundenimp
                INTO :kundenid, :vorname, :nachname
                DO
                BEGIN
                SUSPEND;
                rows = rows -1;
                IF (rows <1) THEN EXIT;
                END
                END
                ^
                </pre>
                Die im Beispiel gezeigte Stored Procedure liefert nur die ersten X Datensätze zurück, wobei die Anzahl der zurückzuliefernden Datesätze als Parameter übergeben wird:
                <pre>
                SELECT * FROM GetFirstXKunden(10)
                </pre>
                Wird die SP erweitert und mit 2 Parameters versehen, kann man dann auch Datensätze abfordern, die mitten aus der Ergebnismenge stammen

                Comment

                Working...
                X