Das Laden des DataTable Readers ist sehr langsam

8

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%     
iCantSeeSharp 10.07.2012, 13:50
quelle

2 Antworten

2

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.

    
Jens H 10.07.2012, 14:27
quelle
3

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.

    
abatishchev 10.07.2012 13:54
quelle