DataTable阅读器加载速度非常慢

时间:2012-07-10 13:50:44

标签: c# performance sqlite datatable loading

我需要根据关键字获取一些数据,测试的结果是100%准确,但问题是reader的加载速度很慢。我已经尝试用一个完全不包含inner join的查询替换此查询,并且加载非常快。所以我想知道,因为我只选择了一列,为什么DataTable.Load()花了这么多时间?是SQLite的{​​{1}}加载整个结果而不仅仅是一列吗?

在使用DataTable之前,执行每个ExecuteReader的平均时间是7秒。

这是我的代码:

reader.Read()

2 个答案:

答案 0 :(得分:3)

我认为这是由于SQLite的性质和大量的连接而发生的。

尝试重构数据库方案,例如对数据进行非规范化以便更快地访问。

答案 1 :(得分:2)

The SQLite Query Planner提供了有关SQLite查询优化的一些提示。

可能适用于您的问题的一些项目:

1。)由于在SQLite中实现,您可能会尝试重新排序多个连接:

  

SQLite的当前实现仅使用循环连接。那就是   比如,连接实现为嵌套循环。默认顺序   连接中的嵌套循环用于FROM子句中最左侧的表   形成外环和最右边的表来形成内环。

因此,根据JOIN的构造方式,性能可能会有所不同。

SQLite尝试自动对其进行优化,但据我所知,文档并不能保证成功(由我突出显示):

  

但是,如果这样做,SQLite将以不同的顺序嵌套循环   将帮助它选择更好的指数。   [...]   加入重新排序是自动的,通常与程序员一起运行良好   不必考虑它,特别是如果已经习惯使用ANALYZE来收集它   有关可用指数的统计数据。 但偶尔会有一些提示   需要程序员。

2。)另外,请注意INNER JOINS内部转换为WHERE子句,因此文档的WHERE部分中的任何性能提示也可能适用:

  

内连接的ON和USING子句被转换为   WHERE子句分析之前的WHERE子句的附加术语   如上文第1.0段所述。因此,使用SQLite,没有   使用较新的SQL92连接语法的计算优势   旧的SQL89逗号连接语法。他们最终都完成了   内连接上的内容相同。

3.)如果语句中有任何索引,您可以考虑在语句中选择更多列:

  

索引的每一列都不必出现在WHERE中   子句用于使用该索引。但不可能   使用的索引列中的间隙。