【发布时间】:2025-12-31 22:50:01
【问题描述】:
我有一个包含大约 2200 万条记录的 sqlite 数据库。我在右列上有索引(在“where”列上)当我使用 sqlitetudio(一个 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 下载的命令行程序)运行了相同的查询,它的输出将进入控制台窗口。循环所有记录并将其打印到命令窗口需要很长时间.. 但请记住...它正在打印到命令窗口....
【问题讨论】:
-
不知道,不是我 - 但是..每个循环需要 1-2 分钟?这看起来确实慢得令人难以置信,如果(因为想要更好的事情做)当你隐藏了它在循环中所做的事情时会发生什么,你只需从你的阅读器中获取数据并将原始对象写入本地磁盘......所以什么都没有优化出来了,还需要那么长时间吗?
-
这是循环整个结果集所需的时间,即使循环中没有任何内容。那就是让我发疯的部分。但即使使用(从列中简单地分配类属性)中的代码,它仍然需要很长时间。您认为结果列上的索引可能会有所帮助吗?
-
对我的代码注释稍作改动
-
这取决于,所以.. 假设需要 2 分钟,sql lite 服务器是本地的吗?你能监控它,看看发生了什么,主要的磁盘 io 吗? cpu负载?如果您使用其他任何东西连接,返回相同的速度是否一样慢?那张表上到底有什么索引?
-
它在我的本地机器上。索引位于 mcc 和 net 列(where 子句中的那些) 对监控说明的好思考。我去看看
标签: c# sqlite datareader system.data.sqlite