如何加快数据访问速度?

时间:2017-01-03 11:20:34

标签: c# sqlite datareader system.data.sqlite

我有一个sqlite数据库,有大约2200万条记录。我在右列上有索引(在“where”列上)当我使用sqlitestudio(sqlite编辑器)进行查询(返回大约80 000行)时,查询大约需要一秒钟才能运行。但我怀疑这是由于某种形式的分页。

然而..当我使用system.sqlite.data在C#中运行相同的查询时,需要很长时间才能遍历该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(可以从sqlite.org下载的命令行程序)运行相同的查询,其输出将进入控制台窗口。它花了很长时间循环遍历所有记录并将其打印到命令窗口..但请记住......它打印到COMMAND WINDOW ....

1 个答案:

答案 0 :(得分: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);

但可能需要更多的存储而不是它的价值。

如果mcc / net列是主键,请考虑改为使用clustered index