当前位置:  开发笔记 > 数据库 > 正文

在SQLite中,准备好的语句真的能提高性能吗?

如何解决《在SQLite中,准备好的语句真的能提高性能吗?》经验,为你挑选了2个好方法。

我听说过SQLite准备好的语句可以提高性能.我写了一些代码来测试它,并没有看到使用它们的性能有任何差异.所以,我想也许我的代码不正确.如果您发现我这样做有任何错误,请告诉我......

[self testPrep:NO dbConn:dbConn];
[self testPrep:YES dbConn:dbConn];

reuse=0
recs=2000
2009-11-09 10:39:18 -0800
processing...
2009-11-09 10:39:32 -0800

reuse=1
recs=2000
2009-11-09 10:39:32 -0800
processing...
2009-11-09 10:39:46 -0800

-(void)testPrep:(BOOL)reuse dbConn:(sqlite3*)dbConn{
    int recs = 2000;
    NSString *sql;
    sqlite3_stmt *stmt;

    sql = @"DROP TABLE test";
    sqlite3_exec(dbConn, [sql UTF8String],NULL,NULL,NULL);

    sql = @"CREATE TABLE test (id INT,field1 INT, field2 INT,field3 INT,field4 INT,field5 INT,field6 INT,field7 INT,field8 INT,field9 INT,field10 INT)";
    sqlite3_exec(dbConn, [sql UTF8String],NULL,NULL,NULL);

    for(int i=0;i

Ben S.. 22

准备好的语句通过在查询优化器找到最佳计划后缓存查询的执行计划来提高性能.

如果您正在使用的查询没有复杂的计划(例如没有连接的简单选择/插入),那么准备好的语句将不会给您带来很大的改进,因为优化器将很快找到最佳计划.

但是,如果您使用具有少量连接并使用某些索引的查询运行相同的测试,您将看到性能差异,因为每次查询时都不会运行优化程序.



1> Ben S..:

准备好的语句通过在查询优化器找到最佳计划后缓存查询的执行计划来提高性能.

如果您正在使用的查询没有复杂的计划(例如没有连接的简单选择/插入),那么准备好的语句将不会给您带来很大的改进,因为优化器将很快找到最佳计划.

但是,如果您使用具有少量连接并使用某些索引的查询运行相同的测试,您将看到性能差异,因为每次查询时都不会运行优化程序.


此外 - 可能有**可用于更多迭代的差异.
即使是简单的查询也有很大的不同.我在游戏中对每个状态更新做了几个简单的插入,这是一个明显的口吃与平稳运行的问题.

2> Mike Willeke..:

是的-它使一个巨大的是否你使用的差异sqlite3_exec()sqlite3_prepare_v2() / sqlite3_bind_xxx() / sqlite3_step()对于批量插入.

sqlite3_exec()只是一种方便的方法.在内部它只是调用相同的序列 sqlite3_prepare_v2() and sqlite3_step().您的示例代码sqlite3_exec()在文字字符串上调用over-over-over:

for(int i=0;i

我不知道SQLite解析器的内部工作原理,但是解析器可能足够聪明,可以识别出您使用相同的文字字符串,然后在每次迭代时跳过重新解析/重新编译.

如果您尝试使用更改的值进行相同的实验 - 您会发现性能差异更大.

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有