Anish Enos Mathew wrote:
Thank you so much cote, for ur valuable suggestion. I would be greatly
thankful to u if u could send me a simple c program which uses the above
API's to insert some values into the SQLite database.
Anish,

The sample program below shows how to use precompiled inserts in SQLite. On my computer I get the following results for 1,000,000 inserts. This produces a database file that is 46.9 MB.

 Executed 1000000 inserts in 11 seconds, 90909 inserts/sec

For comparison I made a second program that builds equivalent SQL statements and then passes them to SQLite to compile and execute using sqlite3_exec().

 Executed 1000000 inserts in 34 seconds, 29412 inserts/sec

This program takes 3 times longer to execute, so it is spending 2/3 of its time generating and parsing the SQL statements.

Note that surrounding the insert loop with a "begin transaction"/"commit transaction" pair is extremely important to getting these high insert rates. Without a transaction these programs are both much slower since they become I/O bound. They both take about 50 seconds to do 500 inserts at about 10 inserts/sec. This is slower by a factor of about 3000 or 9000.

HTH
Dennis Cote

P.S. I apologize if Anish is not your first name, but I believe that most people use the normal spoken order of their names for when setting up an email account.



Prepared insert statements.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include "sqlite3.h"

// struct for sample records.
typedef struct {
   int     a;
   float   b;
   char    c[50];
} record;

// error checking elimnated for clarity
int main(int argc, char *argv[])
{
   char *database = "test.db";
   sqlite3 *db;
   sqlite3_stmt *insert;
   record sample;
   int samples = 1000000;
   int i;
   time_t bgn, end;
   double t;

   // open a new database (after deleting any previous database)
   remove(database);
   sqlite3_open(database, &db);

   // create a table
sqlite3_exec(db, "create table t (a integer, b float, c text)", NULL, NULL, NULL);

   // open transaction to speed inserts
   sqlite3_exec(db, "begin transaction", NULL, NULL, NULL);

   // compile an SQL insert statement
sqlite3_prepare(db, "insert into t values (?, ?, ?)", -1, &insert, NULL);

   // records start time
   bgn = time(NULL);

   // loop to insert sample values
   for (i = 0; i < samples; i++) {
       // generate the next sample values
       sample.a = i;
       sample.b = i * 1.1;
       sprintf(sample.c, "sample %d %f", sample.a, sample.b );

       // bind parameter values
       sqlite3_bind_int(insert, 1, sample.a);
       sqlite3_bind_double(insert, 2, sample.b);
       sqlite3_bind_text(insert, 3, sample.c, -1, SQLITE_STATIC);

       // execute the insert
       sqlite3_step(insert);

       // reset for next loop
       sqlite3_reset(insert);
}
   // record end time
   end = time(NULL);

   // finalize compiled statement to free memory
   sqlite3_finalize(insert);

   // close transaction
   sqlite3_exec(db, "commit transaction", NULL, NULL, NULL);

   // close the database
   sqlite3_close(db);

   // report timing
   t = difftime(end, bgn);
printf("Executed %d inserts in %.0f seconds, %.0f inserts/sec\n", samples, t, samples / t);
   return 0;
}



Compiled insert statements.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include "sqlite3.h"

// struct for sample records.
typedef struct {
   int     a;
   float   b;
   char    c[50];
} record;

// error checking elimnated for clarity
int main(int argc, char *argv[])
{
   char *database = "test.db";
   sqlite3 *db;
   char insert[200];
   record sample;
   int samples = 1000000;
   int i;
   time_t bgn, end;
   double t;

   // open a new database (after deleting any previous database)
   remove(database);
   sqlite3_open(database, &db);

   // create a table
sqlite3_exec(db, "create table t (a integer, b float, c text)", NULL, NULL, NULL);

   // open transaction to speed inserts
   sqlite3_exec(db, "begin transaction", NULL, NULL, NULL);

   // records start time
   bgn = time(NULL);

   // loop to insert sample values
   for (i = 0; i < samples; i++) {
       // generate the next sample values
       sample.a = i;
       sample.b = i * 1.1;
       sprintf(sample.c, "sample %d %f", sample.a, sample.b );

       // build next insert statement
sprintf(insert, "insert into t values (%d, %#f, '%s')", sample.a, sample.b, sample.c); // execute the insert
       sqlite3_exec(db, insert, NULL, NULL, NULL);
}
   // record end time
   end = time(NULL);

   // close transaction
   sqlite3_exec(db, "commit transaction", NULL, NULL, NULL);

   // close the database
   sqlite3_close(db);

   // report timing
   t = difftime(end, bgn);
printf("Executed %d inserts in %.0f seconds, %.0f inserts/sec\n", samples, t, samples / t);
   return 0;
}

Reply via email to