Laden...

SQLite - Daten per Query oder Linq filtern?

Erstellt von Sebastian1989101 vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.482 Views
Sebastian1989101 Themenstarter:in
241 Beiträge seit 2010
vor 6 Jahren
SQLite - Daten per Query oder Linq filtern?

Ich habe eine Datenbank mit ca. 5.000 Bildern. Der Kunde, welcher diese zur Verfügung stellt, möchte diese nun in seiner Xamarin.Forms App eingebunden haben. Meine Frage ist hierbei einfach, wie kann ich möglichst performant auf diese Daten zugreifen? Hier stehen für mich folgende zwei Implementierungen über SQLite-net-PCL gegenüber:


public ImageEntry GetImageByName(string name)
{
    using (var connection = DependencyService.Get<ISQLite>().GetConnection(Database.Data))
        return connection.Query<ImageEntry>("SELECT id, name, width, height, data FROM images WHERE `name` = ?", name).FirstOrDefault();
}


public ImageEntry GetImageByName(string name)
{
    using (var connection = DependencyService.Get<ISQLite>().GetConnection(Database.Data))
        return connection.Table<ImageEntry>().FirstOrDefault(e => e.Name == name);
}

Da es sich um einer mobilen App handelt, wäre es mir hier schon wichtig nach Möglichkeit alles an Zeit einzusparen was nur geht.

WAGO Kontakttechnik GmbH & Co. KG / Software Notion
Softwareentwicklung

C# .NET with WPF, ASP, Xamarin and Unity
Personal Blog: Development Blog

3.003 Beiträge seit 2006
vor 6 Jahren

Schreibt net-PCL nicht das generierte SQL in die Debug-Ausgabe?

Müsste eigentlich. Wenn ja, kannst du ja vergleichen.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

2.079 Beiträge seit 2012
vor 6 Jahren

Ich kenne jetzt nicht im Detail, was Du nutzt, aber ich würde sagen, das nimmt sich nicht viel.

Was Variante 2 tut, ist eine String-Abfrage zu bauen.
Das kostet vermutlich nicht viel Leistung. Neben der eigentlichen Abfrage dürfte das verschwindend gering sein und kann vernachlässigt werden.
Danach wird's ähnlich sein, wie Variante 1

Viel spannender ist dagegen die Frage, ob Variante 1 kapiert, dass Du nur den ersten Eintrag brauchst.
Dein Code-Snippet sieht danach aus, dass es das nicht kann, Du müsstest also manuell ein TOP 1 mit ins Statement schreiben.

Als nächste große Frage:
Was steht alles noch zusätzlich in der Tabelle?
Wenn Du z.B. nur ID und Name brauchst und weißt, in Data stehen mehrere MB Bild-Daten, dann würde ich nicht mit dem Typ ImageEntry arbeite, sondern stattdessen nur die Spalten selecten, die ich brauche und mit einem DataReader das Ergebnis auseinander nehmen.

Prinzipiell solltest Du aber erst einmal schauen, ob sich der Aufwand überhaupt lohnt.
Viel Leistung beim Handy wird das nicht kosten.
Der Flaschenhals wird das Aufbauen der Verbindung und das Downloaden der Daten sein - je nachdem, wie groß das Ergebnis ist.
Das solltest Du erst einmal testen, bevor Du viel Zeit investierst um dann von z.B. 200ms auf 100ms Zeit sparst. Die 200ms wären vorher vielleicht gar nicht aufgefallen

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

Sebastian1989101 Themenstarter:in
241 Beiträge seit 2010
vor 6 Jahren

Ein Download findet dort gar nicht statt. Die Datenbank wird mit der App ausgeliefert (zumindest derzeit). Theoretisch ist mir der Name sogar egal den ich brauche nur die Roh-Daten, also das byte[]. Um einen Render-Cyclus später zu sparen nehme ich gleich noch Breite und Höhe mit um das Control vor dem hinzufügen der Bild-Daten schon korrekt zu skalieren.

Ob SQLite-net-PCL das Query printet, werde ich mir gleich mal ansehen. Ist mir aber bisher nicht aufgefallen. Muss dafür irgendwas gesetzt werden?

WAGO Kontakttechnik GmbH & Co. KG / Software Notion
Softwareentwicklung

C# .NET with WPF, ASP, Xamarin and Unity
Personal Blog: Development Blog

16.835 Beiträge seit 2008
vor 6 Jahren

Es kommt mehr oder minder darauf an, was Du genau für Queries absetzen will.
Linq ist bei einfachen Queries schon relativ auf Augenhöhe. Sobald aber was gruppiert werden soll o.Ä. nimmt die Effizient stark ab.

Sebastian1989101 Themenstarter:in
241 Beiträge seit 2010
vor 6 Jahren

Generell finde ich nur das Query aus dem ersten Post ein wenig zeitlich schwierig. Die Bilder werden zwar asynchron nachgeladen und ploppen dann so auf, wäre aber natürlich schön wenn dies möglichst ohne Delay passieren würde (gefühlt ist da so 1-3 sec an Delay derzeit). Andererseits möchte ich natürlich auch alles Einheitlich halten. Die anderen Methoden sind allerdings auch alles nur einfache Selects mit maximal ein Order. Grouping brauche ich derzeit nicht da alle Komponenten von einander losgelöst sind.

WAGO Kontakttechnik GmbH & Co. KG / Software Notion
Softwareentwicklung

C# .NET with WPF, ASP, Xamarin and Unity
Personal Blog: Development Blog

16.835 Beiträge seit 2008
vor 6 Jahren

Asynchrones Verhalten ist ein Muss auf Mobilen Geräten. Du kannst es maximal optimieren aber nicht entfernen.

D
985 Beiträge seit 2014
vor 6 Jahren

Wie groß sind denn diese Bilder bzw. der Blob-Stream?

Dieser Delay von 1-3 Sekunden kommt daher, dass es ab einer bestimmten Blob-Göße unvorteilhaft ist, diese in der Datenbank zu halten, weil es langsamer ist, als wenn man diese Daten direkt von der Platte lädt.

Siehe Internal Versus External BLOBs in SQLite

3.003 Beiträge seit 2006
vor 6 Jahren

Ob SQLite-net-PCL das Query printet, werde ich mir gleich mal ansehen. Ist mir aber bisher nicht aufgefallen. Muss dafür irgendwas gesetzt werden?

Möglich, kann ich dir aus dem Hut nicht sagen. Sollte aber gut googlebar sein 😉. (Ich hab das mal bei einem Kollegen gesehen, der genau wie du wissen wollte, wie gut die per Linq erzeugten Abfragen sind.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)