我的应用程序使用 SQLite 来存储数据,并且我有一个经常运行的查询。当我分析应用程序时,准备查询语句 (
sqlite_prepare_v2
) 花费了大部分时间。实际上获取数据(sqlite3_step
)只需要很少的时间。
我使用bind args作为查询的参数,并且我知道在SQL Server或MySQL等大型数据库系统中,使用bind args的优点之一是数据库引擎可以重用查询计划。根据我对带有和不带有绑定参数的 SQLite 的性能测试(
select id from foo where bar = 1
vs select id from foo where bar = ?
),它似乎没有内置的查询计划缓存。是否可以自己构建一个,通过缓存 sqlite3_stmt
指针并稍后将新参数重新绑定到它,或者类似的东西?
编辑:作为进一步的细节,如果我重用
sqlite3_stmt
对象,我理想情况下希望制作它的副本,因为我处于多线程环境中,并且我希望多个线程能够使用立即准备好声明。否则我必须做一些有趣的事情,涉及每个缓存的准备好的语句都有自己的互斥体。那么如何复制 sqlite3_stmt
对象呢?
调用
sqlite3_reset(prepared_statement)
将准备好的语句重置为其原始状态。然后,您可以在调用 sqlite3_step
之前使用各种绑定函数重新绑定占位符。如果您打算长期保留准备好的语句,您可以使用prepare_v3给它一个提示标志,表明您正在使用这样的准备好的语句。
至于它如何影响性能,这可能取决于许多不同的因素,您很可能需要进行分析以找出最适合您的用例的方法。