Ich muss einige Daten basierend auf einem Schlüsselwort abrufen, die Abfrage wird zu 100% genau getestet, aber das Problem ist, dass das Laden von reader
ziemlich langsam ist. Ich habe versucht, diese Abfrage durch eine zu ersetzen, die inner join
s überhaupt nicht enthält, und das Laden war ziemlich schnell. Ich frage mich also, warum DataTable.Load () so viel Zeit braucht, weil ich nur eine Spalte auswähle. Ist es das SQLite
s ExecuteReader
, das die gesamten Ergebnisse und nicht nur die eine Spalte lädt?
Vor der Verwendung der DataTable betrug die durchschnittliche Ausführungszeit für jede reader.Read()
7 Sekunden.
Das ist mein Code:
%Vor%Der SQLite-Abfrageplaner bietet einige Hinweise zur Abfrageoptimierung für SQLite.
Einige Elemente, die auf Ihre Frage zutreffen:
1.) Aufgrund der Implementierung in SQLite könnten Sie versuchen, die mehrfache Verknüpfung neu zu ordnen:
Die aktuelle Implementierung von SQLite verwendet nur Schleifen-Joins. Das ist zu sagen wir, Joins werden als verschachtelte Schleifen implementiert. Die Standardreihenfolge der Nested Loops in einem Join sind für die äußerste linke Tabelle in der FROM-Klausel Bilden Sie die äußere Schleife und die am weitesten rechts liegende Tabelle, um die innere Schleife zu bilden.
Je nachdem, wie die JOINs aufgebaut sind, kann es also zu Leistungsunterschieden kommen.
SQLite versucht dies automatisch zu optimieren, aber soweit ich die Dokumentation verstanden habe gibt es keine Garantie für den Erfolg (Highlights von mir):
SQLite verschachtelt die Schleifen jedoch in einer anderen Reihenfolge wird es helfen, bessere Indizes zu wählen. [...] Join Neuordnung ist automatisch und funktioniert in der Regel gut genug, dass Programmierer Ich muss nicht darüber nachdenken, besonders wenn ANALYSE verwendet wurde, um sich zu versammeln Statistiken über die verfügbaren Indizes. Aber gelegentlich einige Hinweise von der Programmierer werden benötigt.
2.) Beachten Sie außerdem, dass INNER JOINS intern in WHERE-Klauseln konvertiert werden. Daher können auch die Performance-Tipps im WHERE-Abschnitt des Dokuments gelten:
Die ON- und USING-Klauseln eines inneren Joins werden in konvertiert Zusätzliche Bedingungen der WHERE-Klausel vor der WHERE-Klauselanalyse oben in Absatz 1.0 beschrieben. Mit SQLite gibt es also keine Berechnungsvorteil, um die neuere SQL92 Join Syntax über die ältere SQL89-Komma-Join-Syntax. Beide enden genau Das Gleiche gilt für innere Joins.
3.) Sie könnten erwägen, mehr Spalten in Ihrer Anweisung auszuwählen, wenn es Indizes für sie gibt:
Es ist nicht notwendig, dass jede Spalte eines Indexes in einer WHERE erscheint Klauselbegriff, damit dieser Index verwendet werden kann. Aber da kann nicht sein Lücken in den Spalten des Index, die verwendet werden.
Ich denke, das passiert aufgrund der Beschaffenheit von SQLite und der großen Anzahl von Joins.
Versuchen Sie, das Datenbankschema zu refaktorieren, z. B. Denormalisierung von Daten für einen schnelleren Zugriff.
Tags und Links c# sqlite performance datatable loading