(见下面的更新)
从 C#.Net 应用程序(约 5 秒)中查询大约 500,000 行的非常简单的 Sqlite 数据表时,我遇到了查询性能缓慢的问题。
我使用 LinqPad 以及 2 个数据库浏览器(均基于 QtSql)在完全相同的数据库上尝试了完全相同的查询,它的运行速度提高了 10 倍(约 0.5 秒)。相同的查询,相同的数据库,不同的应用程序,只有我的运行速度不快。
无论我是返回值还是只是一个 Count(*),它的区别可以忽略不计。
我试过了:
- 为每个 .Net 3.5/4/4.5 构建
- 为每个 AnyCPU/x86/x64 构建
- 使用 System.Data.Sqlite、sqlite-net 以及通过 COM 直接访问 sqlite3 dll
- 为每个 WPF/WinForms 构建
- 查询的不同变体
这些都不会对查询时间产生任何明显的影响。
我知道使用 JOIN 重写查询可能会有所帮助,但我无法弄清楚为什么相同的查询在 LinqPad/Sql 浏览器中运行良好,但在我尝试创建的任何应用程序中却没有。我一定错过了一些非常基本的东西。
示例表:
"CREATE TABLE items(id INTEGER PRIMARY KEY, id1 INTEGER, id2 INTEGER, value INTEGER)"
示例查询字符串(尽管基本上任何使用子查询的查询都需要很长时间):
SELECT count(*)
FROM items WHERE
id2 IN
(
SELECT DISTINCT id2 FROM items WHERE id1 IN
(
SELECT DISTINCT id1 FROM items WHERE id2 = 100000 AND value = 10
)
AND value = 10
)
AND value = 10
GROUP BY id2
我知道这可能会使用 JOINS 和索引来重新编写以加快速度,但事实仍然是,此查询在其他应用程序中的运行速度要快得多。我在这里缺少什么,为什么无论我尝试什么,相同的查询都会运行得这么慢?
更新:似乎 sqlite 的版本与该问题有关。使用旧的 System.Data.Sqlite v1.0.66.0 查询就像其他应用程序一样运行,但是使用更新的版本很慢。我还没有确定具体在哪个版本发生了变化,但我很确定这与底层的 sqlite3 版本有关,而不是专门针对 System.Data.Sqlite。如果有人知道在这种情况下可能发生的变化会导致子查询速度变慢,或者如果有设置或某些东西可以使新版本的 sqlite 中的子查询运行得更快,请告诉我!
同样,该查询是一个示例,并不理想且部分冗余……问题更多是关于为什么它在一个而不是另一个中起作用。
提前感谢您提供任何额外的输入!
更新:已解决
请看下面我的回答。