从数据库SQLite C#Service Stack读取SQL数据(数百万条记录)的最快方法是什么?

时间:2015-05-05 14:57:06

标签: c# asp.net sql-server sqlite ormlite-servicestack

我正在使用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

3 个答案:

答案 0 :(得分:2)

你可以采取一些措施来加快速度。 (但它可能不会让它快得多)

  1. 根据需要创建索引以提高order by的效果。查看查询的执行计划。或者甚至更好,如果消费者不需要,请删除order by
  2. 如果结果列表已知,则将结果列表的容量设置为接近结果的容量。 new List<ClientSideDataResponse>(1200000);
  3. 而不是与string之间的转换,而是使用数据库中的实际值。 (当然,除非数据库中的值实际上是字符串。然后需要重新设计)
  4. 此:

    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。