Sqlite DB schneller auslesen

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Bady.

    Sqlite DB schneller auslesen

    Hallo Leute.
    In meiner Sqlite DB sind nun fast 40.000 Einträge vorhanden.
    Mein Problem es dauert ne weile bis mein Programm alle Daten in die Datagridview schießt.
    Meine Sql Abfrage:

    VB.NET-Quellcode

    1. Dim SQLconnect As New Sqlite.SqliteConnection()
    2. Dim SQLcommand As SqliteCommand
    3. SQLconnect.ConnectionString = "Data Source=" & My.Settings.DatabasePath & ";"
    4. SQLconnect.Open()
    5. SQLcommand = SQLconnect.CreateCommand
    6. SQLcommand.CommandText = "SELECT * FROM test"
    7. Dim SQLreader As SqliteDataReader = SQLcommand.ExecuteReader()
    8. While SQLreader.Read()
    9. With DataGridView1.Rows
    10. .Add({SQLreader("id"), SQLreader("eintrag1"), SQLreader("eintrag2"), SQLreader("eintrag3"), SQLreader("eintrag4"), SQLreader("eintrag5"), SQLreader("eintrag6")})
    11. End With
    12. End While
    13. SQLcommand.Dispose()
    14. SQLconnect.Close()


    Nun meine Frage: Lässt sich das noch irgendwie beschleunigen?

    Danke schon mal
    LG
    GOOGLE ist mein Meister :)
    1. Nicht alles Abfragen, sondern nur die Top X Datensätze.
    2. Nicht alle Felder der Tabelle abfragen sonder nur die, die man braucht.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Nicht die Daten ins DGV schreiben, sondern in eine passende List(Of T). DGV über eine BindingSource an die List binden. Mit DeinDGV.SuspendLayout und DeinDGV.ResumeLayout mal probieren. Bei den DGV-Spalten ColumnSizeMode nicht auf AllCells oder AllCellsExceptHeader stellen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @mrMo
    Ich brauche leider den gesamten Inhalt (Liste)

    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Das klingt Interessant.
    Hättest du da ev. ein kleines Beispiel wie man die Daten in eine list of T bringt und die Bindingsource an die Liste binden kann?
    Hab mit dem noch nie gearbeitet.

    Danke für euren Beistand :)
    GOOGLE ist mein Meister :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Du legst (am besten in einer eigenen Datei) eine normale Klasse an. Da rein kommen je als Property all die Daten (mit korrektem Typ!), die in Deiner DB stehen:

    VB.NET-Quellcode

    1. Friend Class Car 'passende Benennung der Klasse verwenden! Also z.B. Car, Movie, Customer, …
    2. Property ID As Integer
    3. Property Name As String
    4. '…; was immer Deine Datenklasse für Daten braucht bzw. hat
    5. End Class

    dann in Deiner Form-Klasse:

    VB.NET-Quellcode

    1. Private ReadOnly Cars As New List(Of Car)

    Dann eine BindingSource (BS) auf's Form hauen, Projekt kompilieren und die BS an die Datenklasse binden. Link dazu
    Dann beim DGV einstellen, dass das Ganze datengebunden ist, Datenquelle auf Deine BindingSource einstellen.
    Die Klasseninstanz mit Daten befüllen

    VB.NET-Quellcode

    1. Cars.Add(New Car With {.ID = CINT(SQLreader("id")), .Name = SQLreader("name")})

    Und bei der BS noch das DataBinding resetten: DeineBindingSource.ResetBindings(False)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Bady schrieb:

    ...40.000 Einträge.

    Bady schrieb:

    Klappt wunderbar!


    Hi,
    ich mag solche Aufgaben, einfach weil es sie gibt :) .
    Obwohl das Thema für Dich ja schon erledigt ist, würde mich trotzdem interessieren, wie schnell denn nun die Anzeige bei Dir kommt und ob Du damit zufrieden bist.
    Falls nicht, möchte ich wetten, dass da noch viel mehr geht 8o !

    Lust zum Spielen?
    Das Anzeigen der Einträge dauert nun keine 15 Sekunden :)
    Vor der Bindinggeschichte über 2 minuten ^^

    jedoch wirkt mir nun ein anderes Problem dazwischen, und zwar habe ich ja extra subs geschrieben zum Sortieren der Einträge / editieren /einfärben etc.... die da jetzt durch das BindingSource nicht oder so gut wie gar nicht mehr funktionieren. Da muss ich noch rauskriegen wie was funktioniert da ich wie oben erwähnt noch nie mit Bindings etc gearbeitet hab.
    GOOGLE ist mein Meister :)

    Bady schrieb:

    ...dauert nun keine 15 Sekunden


    Oh, da sollte noch viel mehr gehen :) !
    Ich würde das zum Test gern mal angehen, dazu brauche ich aber eine "Test-Füllung".
    Natürlich sollst Du deine Daten aus der DB nicht offenlegen, aber um einen zumindest gleichwertigen Test zu basteln, müsste man wissen, wie viele Spalten deine Tabelle enthält, welche Datentypen die Spalten darstellen und welche Daten pro Zeile zusammenkommen.
    Kannst Du ein Pseudobeispiel einer Zeile erstellen?
    Oder das Schema der Tabelle exportieren und eine Zeile exportieren und die Daten verfälschen?
    Aus Deiner Query entnehme ich, dass Du nur die Daten aus der einen Tabelle ziehst und keine Joins auf andere Tabellen hast.

    Bady schrieb:

    Sortieren der Einträge / editieren /einfärben

    sortieren kann die BS
    Alternativ könntest Du auch die Daten in der List selber sortieren. Kommt natürlich drauf an, ob die Sortierung dauerhaft sein soll.
    Einfärben geht über passende DGV-Events.
    Editieren über das DGV selbst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Mhhh, das scheint doch ein bisschen kniffliger zu werden :/ ...
    Ich habe eine Testdatenbank erstellt und sie mit 50.000 Datensätzen gefüllt.
    Als Quelle zum Generieren von Testdaten gibt es z.B. diese wunderbare Seite hier, die Zufallsadressen generiert (max. 9999 pro Durchlauf): LINK

    Also im Prinzip ist alles tutti, aber ...
    Derzeit komme ich auf ca. 400 bis 500ms Ladezeit, gemessen vom Klick zum Daten-Laden bis zur kompletten Anzeige.
    Das Editieren und Zurückspeichern in die DB geht auch schon.



    Man sollte meinen das reicht, aber die Ansprüche sind halt unterschiedlich. Für mich reicht es eben nicht.
    Momentan ist das DatagridView nicht gebunden, sondern arbeitet im virtuellen Modus.
    Durch den virtuellen Modus ist halt der Code-Aufwand höher als bei einer normalen Bindung und auch die Sortierung ist nicht so einfach möglich.
    Leider ist der Schritt noch nicht vollständig, denn zum virtuellen Modus fehlt noch die Disziplin "Just-In-Time-Laden von Daten" über ein DataRetriever Interface.

    Erst dann ist die ganze Sache rund und die Anzahl der Datensätze spielt (fast) keine Rolle mehr.
    Es wäre dann egal, ob es sich um 40.000 oder 4 Millionen Datensätze handelt, alles wäre sofort (visuell) verfügbar.

    Naja, ich sag mal so, 50.000 Datensätze in einer halben Sekunde sind ein guter Anfang und ich mache bestimmt weiter, aber momentan ist die Luft erst mal raus.

    Bis neulich, VG
    Ne halbe Sekunde is nix im vergleich xD
    Da sich aber mein Wissen mit DGV und Binding sehr in Grenzen hält werde ich vermutlich nicht umstellen und eben ein bisschen warten bis die Daten geladen sind da sich für mich selbst das editieren löschen etc.. Etwas schwieriger gestaltet als angenommen.
    Ich freu mich dennoch das du Spaß daran hast :)

    LG
    GOOGLE ist mein Meister :)