2017-01-03 3 views
1

Ich habe eine SQLite-Datenbank mit rund 22 Millionen Datensätzen. Ich habe Indizes für die rechten Spalten (in den "Where" -Spalten) Wenn ich eine Abfrage (die ungefähr 80.000 Zeilen zurückgibt) mit sqlitestudio (einem SQLite-Editor) mache, dauert die Abfrage etwa eine Sekunde. Aber ich vermute, dass dies auf irgendeine Art von Seitenumbruch zurückzuführen ist.Wie beschleunigt man den Datenzugriff?

Allerdings .. wenn ich die gleiche Abfrage in C# mit system.sqlite.data ausführen, dauert es sehr lange, diese 80.000 Datensätze zu durchlaufen.

Gibt es eine Möglichkeit, dies zu beschleunigen? Sollte ich vielleicht einen Wrapper auf die sqlite.dll selbst schreiben?

Ich überprüfte den Ausführungsplan und es ist das gleiche in SQLite Studio und in der C# -Code. Similar issue

Während vermutete Antworten geschätzt werden und einen Einblick bieten können (und manchmal auch eine Antwort) Ich würde konkrete Antworten zu schätzen wissen (dh diejenigen, die Sie wissen, dass tatsächlich funktioniert)

Heres der Code ...

using (var command = new SQLiteCommand(conn)) 
{ 
    command.CommandText = "select cell, lat, lon from cell_towers where mcc = @mcc and net = @net "; 
    command.Parameters.AddWithValue("@mcc", MCC); 
    command.Parameters.AddWithValue("@net", MNC); 
    using (SQLiteDataReader rdr = command.ExecuteReader()) 
    { 
     // In here it takes around 1-2 minutes to loop through. Even with no code inside the loop 
     while (rdr.Read()) 
     { 

     } 
    } 
} 

Edit 1:

ich die gleiche Abfrage mit sqlite3.exe ausgeführt haben (das Kommandozeilen-Programm ein von sqlite.org herunterladen können) ein nd sein Ausgang wird zum Konsolenfenster gehen. Es dauert eine lange Zeit, um alle Datensätze durchzulaufen und es in das Befehlsfenster zu drucken .. aber erinnern Sie sich ... sein DRUCKEN an das BEFEHLSFENSTER ...

+0

Keine Ahnung, was war ich - aber .. dauert es 1-2 Minuten pro Schleife? das scheint unglaublich langsam, was passiert, wenn (aus Mangel an etwas besser zu tun), wie Sie es in der Schleife versteckt haben Sie einfach die Daten aus Ihrem Leser und schreiben Sie einfach das rohe Objekt auf lokale Festplatte .. so nichts Optimiert es, dauert es noch so lange? – BugFinder

+0

So lange dauert es, bis das gesamte Ergebnis durchgeschleift wird, selbst wenn NICHTS in der Schleife ist. Das ist der Teil, der mich verrückt macht. Aber selbst mit dem Code in (einfache Zuweisung von Klasseneigenschaften aus Spalten) dauert es immer noch so lange. Glauben Sie, dass ein Index zu den Ergebnisspalten hilft? – Eminem

+0

Eine kleine Änderung an meinem Code-Kommentar gemacht – Eminem

Antwort

0

Nur die Indexierung jeder Spalte ist nicht immer nützlich. Ein Nachschlag auf zwei Säulen würde einen einzigen Index auf beiden Spalten erfordern:

CREATE INDEX cell_towers_mcc_net ON cell_towers(mcc, net); 

Ein covering index für diese Abfrage könnte sogar schneller, durch ein wenig sein:

CREATE INDEX cell_towers_mcc_net_cov ON cell_towers(mcc, net, cell, lat, lon); 

aber wahrscheinlich mehr Speicher benötigt als es wert ist.

Wenn die mcc/net Spalten der Primärschlüssel sind, sollten Sie stattdessen clustered index verwenden.

+0

Danke für die Antwort. Ich habe mich nur gefragt. Ich habe Indizes für diese Spalten (mcc, net) Ich benutze nur die sqlite3.exe, um die Daten in CSV zu exportieren. Es dauert ungefähr 20 Sekunden. Das ist viel schneller als die Minute oder 2 muss ich warten. Also überlege ich, ob ich Dinge in die Datei ablegen und dann von dort aus mit StreamReader lesen soll – Eminem