0

我有一个 MS Window 可执行文件,用非托管纯“C”编写,它在嵌入式数据库引擎 (SQLite) 周围放置一个 GUI 包装器。SQLite 功能由合并包 3.7.14.1 提供,特别是 2 个文件 sqlite3.h 和 sqlite3.c 我对“开箱即用”文件所做的唯一更改是添加以下行:#define SQLITE_ENABLE_COLUMN_METADATA 1

它全部使用 Visual Studio 2008 在 Win 7(64 位)系统上编译,但我将其编译为 32 位应用程序。

我已经将文件 sqlite3.h 和 sqlite3.c 换成了合并包 3.15.2 中的文件,唯一的更改是添加以下行:#define SQLITE_ENABLE_COLUMN_METADATA 1

我没有更改我的项目配置。我只交换2个文件!

我有一个复杂的脚本,它将一个大约 600 MB 的大型 DB 加载到内存中,然后执行大量 SELECTS,并将结果传输到 Excel(使用我的 GUI 包装器中的功能)。

我的问题。使用合并包3.7.14.1的版本性能比合并包3.15.2一百倍以上。我正在使用完全相同的“脚本”。

我尝试了合并包 3.16 并没有更好。我可以看到性能损失在 SQL 引擎中(通过在进入和离开 SQL 机器时显示弹出窗口。就我的 GUI 包装器、Visual Studio 配置、项目配置而言,一切都是一样的。我假设性能问题在于合并包中的一些编译器开关。

有谁知道我应该从哪里开始看?

4

1 回答 1

0

该问题可能是由版本 3.8.0 中引入的 SQLite 的Next Generation Query Planner引起的。一旦您发现特定的查询速度较慢,您可以尝试运行以 . 为前缀的查询explain。这将转储查询计划,让您看到 3.7.14 和 3.15.2 创建的计划的差异。

如果不查看查询或数据库,很难确切地说出问题是什么,但通常查询性能可以通过索引来提高,所以我首先会在计划中寻找可以通过添加索引来避免的任何表扫描。另一件要尝试的事情是analyze在您的数据库上运行以生成帮助规划器构建最佳查询计划的统计表。

于 2019-06-11T22:11:20.363 回答