2017-01-03 11 views
1

私は約2200万レコードのsqliteデータベースを持っています。私は右の列( "where"列)にインデックスを持っています。sqlitestudio(sqliteエディタ)を使用してクエリを実行すると(約80,000行を返します)、クエリの実行に約2秒かかります。しかし、私はこれが何らかの形式のページネーションによるものだと考えています。データアクセスを高速化するにはどうすればよいですか?

しかし、C#でsystem.sqlite.dataを使用して同じクエリを実行すると、その80,000レコードを繰り返し処理するのに時間がかかります。

これをスピードアップする方法はありますか?おそらく、sqlite.dll自体にラッパーを書くべきでしょうか?

sqlitestudioとc#コードで実行計画とその実行計画を確認しました。 Similar issue

ている間は...答えが高く評価され、洞察(そして時には答え)私は(つまり、もの、あなたが実際に動作していることを知っている)相続人

コードを、具体的な答えを感謝を提供することができます推測

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()) 
     { 

     } 
    } 
} 

編集1:

私はsqlite3.exe(1がsqlite.orgからダウンロードすることができますコマンドラインプログラム)Aを使用して、同じクエリを実行しましたその出力はコンソールウィンドウに表示されます。すべてのレコードをループしてコマンドウィンドウに印刷するのに長い時間がかかりますが、覚えています...コマンドウィンドウへの印刷....

+0

いいえ、考えられませんでしたが、ループごとに1〜2分かかりますか?ループの中で何をしているのかを隠してしまった場合には、読者からデータを取り出して、ローオブジェクトをローカルディスクに書き込むだけで、何が起こるのでしょうか?それを最適化する、それはまだそれを取るか? – BugFinder

+0

ループ内でNOTHINGを指定しても、結果セット全体がループするのにどれくらいの時間がかかります。それは私のナットを運転している部分です。しかし、(列からのクラスプロパティの単純な割り当ての)コードでも、それはまだ長くかかります。結果列のインデックスが役立つと思われますか? – Eminem

+0

私のコードのコメント – Eminem

答えて

0

各列にインデックスを付けるだけでは必ずしも有用ではありません。このクエリの

CREATE INDEX cell_towers_mcc_net ON cell_towers(mcc, net); 

covering index少しにより、さらに高速かもしれません:

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

おそらく多くのストレージを必要とする2列の検索は、両方の列上の単一のインデックスを必要としますそれは価値があるよりも。

mcc/netの列が主キーの場合は、代わりにclustered indexを使用することを検討してください。

+0

答えをありがとう。私はちょうどこれについて疑問に思っていた。これらの列(mcc、net)にインデックスがあります。単にsqlite3.exeを使用してcsvにデータをエクスポートします。それは約20秒かかります。それは分よりもはるかに速く、私は待たなければなりません。だから私は物事をファイルにダンプし、そこからStreamReaderで読むことを検討しています – Eminem

関連する問題