我听说过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解析器的内部工作原理,但是解析器可能足够聪明,可以识别出您使用相同的文字字符串,然后在每次迭代时跳过重新解析/重新编译.
如果您尝试使用更改的值进行相同的实验 - 您会发现性能差异更大.