Announcement

Collapse
No announcement yet.

SQL-Server mit über 1000000 Datensetzen in einer Tabelle???

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

  • SQL-Server mit über 1000000 Datensetzen in einer Tabelle???

    Hallo Leute!

    Ich habe einen Tabelle im SQL-Server, die wie folgt aufgebaut ist (ist so vorgegeben und kann nicht geändert werden):

    <PRE>
    Name Datentyp Größe

    Letzter_Zeitstempel datetime 8
    Knotenname char 10
    Tagname char 30
    Beschreibung char 133
    Wert char 13
    Einheit char 13
    Alarmstatus char 9
    Alarmpriorität char 10
    Alarmbereiche char 255
    Bedienername char 32
    Bedienerstation char 10
    Meldungstyp char 11
    Erster_Zeitstempel datetime 8
    </PRE>

    Die Tabelle enthält über 1000000 Datensätze!

    Ich muss eine Oberfläche entwickeln (Windowsforms), mit der die Anwender diese Datenbank auswerten kann.
    Es kann vorkommen, dass bei einer Filterabfrage 20000 und mehr Datensätze zurückgegeben werden, die in einem Grid angezeigt werden sollen. Die Abfrage lässt sich nicht weiter eingrenzen, deshalb muss ich mit der großen Datenmenge arbeiten!

    Wenn ich mit SqlDataAdapter und Datagrid arbeite ist die Abfrageperformance akzeptabel aber es platz mir der Arbeitsspeicher, da alle Daten im RAM abgelegt werden.

    Mit SqlDataReader und ListView kann ich die Datenmenge im RAM verringern, da ich allen Müll (Strings haben feste Länge und die ganzen Leerzeichen werden entfernt) bereinige bevor ich den ListView fülle, aber die Abfrage mit 'while (myData.Read())' dauert ewig (Minuten bis Stunden)!

    Was ich brauche ist ganz einfach das Verhalten des 'SQL Query Analyzers'. Die Abfrage geht schnell und die Daten werden in einer Datei abgelegt von der immer nur ein Teil in das Grid zum scrollen geladen wird.

    Ach ja die Daten in der Tabelle muss ich bei der Anzeige nach 'Letzter_Zeitstempel' sortieren.

    Bitte, bitte Hilfe!!!! , ich beiße sonst noch in den Tisch, mir fällt einfach nichts mehr ein.

    Grüsse und vielen Dank,

    H.-P.

  • #2
    Hallo,

    das sollte nicht so schwierig sein,
    in Delphi bigt es eine Option CacheSize in der Man angeben kann wieviele datensätze vom Provider abgerufen werden sollen. Wird der letzte Datensatz erreicht, werden dann die nächsten 20 Datensätze abgerufen. IN C# habe ich das noch nicht versucht.

    Gruß
    Sasch

    Comment


    • #3
      Hallo,

      für diese Aufgabe gibt es mehrere Umsetzungsalternativen. Die geringste Speicherbelastung auf der Client-Seite entsteht, wenn der Anwender im Datenbestand "blättern" muss (niemand kann 20.000 Datensätze gleichzeitig im DataGrid auswerten):

      1. Die SELECT-Abfrage verwendet eine TOP 100-Begrenzung, um nur die ersten 100 Treffer der Ergebnismenge der WHERE-Einschränkung zurückzuliefern.

      2. Der SqlDataAdapter füllt das DataSet mit den Daten, über ein DataView werden die Controls (DataGrid) angebunden.

      3. Wenn der Benutzer zu den nächsten 100 Treffern "blättern" will, liest das Programm den höchsten Wert der Sortierspalte aus, um diesen als zusätzlich Einschränkung für die nächste SELECT TOP 100-Abfrage zu verwenden.

      Mit diesem Modus bekommt der Client immer nur kleine Häppchen vorgesetzt

      Comment


      • #4
        Hallo,

        danke für die Antwort!

        An Paging habe ich auch schon gedacht und damit experimentiert.

        Ich habe dabei aber zwei Probleme:

        1.
        Brauche ich meinem Wissen nach eine Spalte mit eindeutigen Werten um Anfang und Ende der Seiten zum Blättern festzulegen und die habe ich leider nicht.

        2.
        Die Daten in der Tabelle bei der Anzeige im Grid nach der Spalte 'Letzter_Zeitstempel' sortiert werden müssen.

        Ich muss also erst das Abfrageergebnis sortieren, um auf den Seiten zum Blättern dann die Ergebnisse in der richtigen Reihenfolge (1. Seite = 1. Zeitstempel = 2004-03-19 15:44:58.050 / letzte Seite = Letzter Zeitstempel = 2004-03-19 16:57:53.130) darstellen zu können.
        Wenn ich dieses Sortieren dem SQL-Server überlasse braucht dieser sehr viele Ressourcen!

        Ich hoffe ich liege falsch und Sie können mir weiter helfen!

        Gruß,

        H.-P

        Comment


        • #5
          Hallo Sascha,

          was machst Du wenn die Datensätze nicht in der Reihenfolge in der Tabelle stehen wie Du sie anzeigen willst?

          Gruß H.-P

          Comment


          • #6
            <PRE>
            Hallo HP,
            leider habe ich da auch keine Patentlösung...

            Aber :
            Es gibt eine Möglichkeit, die mir da schon mal weitergeholfen hat.
            Dein Select hat 20.000 Datensätze und bestimmt eine Primär-ID.
            Du füllst eine @Tempdb( ID Identity, Fremd_ID int ) mit der Unsortierten Datenmenge und
            ziehst automatisch den ID mit hoch. Nun Hast du die Unsortierte Datenmenge mit Fortlaufenden IDs.
            Nun führst du dein Select auf die @Tempdb mit einem Join auf die 20.000 Datensätze aus und zwar mit den IDs von 1 bis 100.
            Wenn du nun am 100.ten angekommen bist, lädst du die Neue Datenmenge.

            Wenn du deine Datenbankverbindung nun Kappst, wird aiutomatisch auch die @TempDB gelöscht.

            Ich hoffe, ich konnte die Thematik einigermaßen rüberbringen...

            Gruß
            Sascha
            </PRE&gt

            Comment


            • #7
              Hallo HP,
              leider habe ich dafür auch keine direkte lösung, aber...
              ich habe das Problem schon mal forlgendermaßen gelöst :
              Deiene Tabelle hat doch bestimmt einen Primärschlüssel, oder. Du Erstellst nun deine Query in der Gewünschten Sortierung. Dein Select Gibt aber in der ersten version nur den PK zurück. Mit diesen Informationen füllst du eine @TempDB (Lauf_ID int identity(1,1), Fremd_PK int )
              Nun hast du in der @TempDM eine fortlaufende Liste mit den Sortieren PKs deiner Abfrage.
              Nun machst du einen Select auf die @TempDB mit dem lauf_ID von 1 - 100 und Joinst dir dein Eigendliches Select Statement über den fremd_PK dazu.
              Nun kannst du beim erreichen von dem 100sten DS ganz einfach die mächsten 100 Laden indem du ein ernetes Select von lauf_ID 1001-200 Ausführst.
              Übrigends wird die @TempDP nach schließen der verbindung automatisch vom SQL-Server gelöscht

              Gruß
              Sascha
              &#10

              Comment


              • #8
                Ich würde auf die Spalte mit dem Zeitstempel einen Index setzen, dann klappt das sortieren viel schneller, und es dann mit Paging machen

                Comment

                Working...
                X