我有一个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 ....
答案 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。