我需要根据关键字获取一些数据,测试的结果是100%准确,但问题是reader
的加载速度很慢。我已经尝试用一个完全不包含inner join
的查询替换此查询,并且加载非常快。所以我想知道,因为我只选择了一列,为什么DataTable.Load()花了这么多时间?是SQLite
的{{1}}加载整个结果而不仅仅是一列吗?
在使用DataTable之前,执行每个ExecuteReader
的平均时间是7秒。
这是我的代码:
reader.Read()
答案 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中 子句用于使用该索引。但不可能 使用的索引列中的间隙。