title: In SQLite, do prepared statements really improve performance?
body: <p>I have heard that prepared statements with <a href="http://en.wikipedia.org/wiki/SQLite" rel="noreferrer">SQLite</a> should improve performance.  I wrote some code to test that, and did not see any difference in performance with using them.  So, I thought maybe my code was incorrect.  Please let me know if you see any errors in how I'm doing this...</p>
  
  <pre><code>[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&lt;recs;i++){
          sql = @"INSERT INTO test (id,field1,field2,field3,field4,field5,field6,field7,field8,field9,field10) VALUES (%d,1,2,3,4,5,6,7,8,9,10)";
          sqlite3_exec(dbConn, [sql UTF8String],NULL,NULL,NULL);
      }
  
      sql = @"BEGIN";
      sqlite3_exec(dbConn, [sql UTF8String],NULL,NULL,NULL);
  
      if (reuse){
          sql = @"select * from test where field1=?1 and field2=?2 and field3=?3 and field4=?4 and field5=?5 and field6=?6 and field6=?6 and field8=?8 and field9=?9 and field10=?10 and id=?11";
          sqlite3_prepare_v2(dbConn, [sql UTF8String], -1, &amp;stmt, NULL);
      }
  
      NSLog(@"reuse=%d",reuse);
      NSLog(@"recs=%d",recs);
      NSDate *before = [NSDate date];
      NSLog([before description]);
      NSLog(@"processing...");
      for(int i=0;i&lt;recs;i++){
          if (!reuse){
              sql = @"select * from test where field1=?1 and field2=?2 and field3=?3 and field4=?4 and field5=?5 and field6=?6 and field6=?6 and field8=?8 and field9=?9 and field10=?10 and id=?11";
              sqlite3_prepare_v2(dbConn, [sql UTF8String], -1, &amp;stmt, NULL);
          }
          sqlite3_bind_int(stmt, 1, 1);
          sqlite3_bind_int(stmt, 2, 2);
          sqlite3_bind_int(stmt, 3, 3);
          sqlite3_bind_int(stmt, 4, 4);
          sqlite3_bind_int(stmt, 5, 5);
          sqlite3_bind_int(stmt, 6, 6);
          sqlite3_bind_int(stmt, 7, 7);
          sqlite3_bind_int(stmt, 8, 8);
          sqlite3_bind_int(stmt, 9, 9);
          sqlite3_bind_int(stmt, 10, 10);
          sqlite3_bind_int(stmt, 11, i);
  
          while(sqlite3_step(stmt) == SQLITE_ROW) {
          }
          sqlite3_reset(stmt);
      }
  
      sql = @"BEGIN";
      sqlite3_exec(dbConn, [sql UTF8String],NULL,NULL,NULL);
  
      NSDate *after = [NSDate date];
      NSLog([after description]);
  }
  </code></pre>