sqlite amalgamation 3.7和3.16之间的巨大性能差异

时间:2016-12-05 18:42:59

标签: sqlite preprocessor amalgamation

我有一个MS Window可执行文件,用非托管普通“C”编写,它将GUI包装器放在嵌入式数据库引擎(SQLite)周围。 SQLite功能由amalgamation软件包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替换为来自amalgamation包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配置,项目配置而言,所有事情都是一样的。 我认为性能问题在于合并包中的一些编译器开关。

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

1 个答案:

答案 0 :(得分:0)

此问题很可能是由SQLite的Next Generation Query Planner(在3.8.0版中引入)引起的。找到缓慢的特定查询后,您可以尝试运行以explain为前缀的查询。这将转储查询计划,使您可以看到3.7.14和3.15.2创建的计划之间的差异。

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