我正在使用SQLite作为数据库处理Ormlite-ServiceStack。 我正在单个Select查询(C#DotNet和Database is SQLite(v4.0.30319))中从SQLite数据库表中检索数百万(1195935)的记录,如下所示。
SQLite不支持存储过程。
整个过程花费超过30秒来通过单个查询检索数据。如何提高毫秒级的性能。我已尝试过其他方式,如Entity Framework,SQLiteData Adapter,但无法提高从毫秒级数据库中获取数据的速度。
我的机器也是非常快的固态硬盘,16 GB RAM,基于X64的Windows 7专业版。
locals
答案 0 :(得分:2)
你可以采取一些措施来加快速度。 (但它可能不会让它快得多)
order by
的效果。查看查询的执行计划。或者甚至更好,如果消费者不需要,请删除order by
。new List<ClientSideDataResponse>(1200000);
string
之间的转换,而是使用数据库中的实际值。 (当然,除非数据库中的值实际上是字符串。然后需要重新设计)此:
if (!string.IsNullOrEmpty(reader["ID"].ToString()) == true)
{
newItem.ID = Convert.ToInt32(reader["ID"]);
}
反而是:
if(!reader.IsDBNull(0)) //0 is the index of the column.
newItem.ID = reader.GetInt32(0);
查询的所有其他结果相同。
答案 1 :(得分:2)
ServiceStack具有为您完成所有这些操作的选择方法。
Chek ServiceStack.OrmLite项目。它也处理SQLite数据库。
你只需要打电话:
var results = Db.Select<ClientSideDataResponse>(); // That's all folks!
答案 2 :(得分:0)
我很惊讶没有人告诉你不要从单个查询中检索数百万条记录。特别是因为它标记为asp.net
(网络)。只需提取当前页面所需的总计数和记录。现在确定您的页面大小并创建自定义分页,并在用户点击页面'n'时检索该第n页。对于第n页,算法将是
records.Skip( (n-1) * page_size ).Take( page_size )
如果您使用的是EntityFramework。