I've written the following program to test the sqlite performance for a specific scenario I have.
I've used most tricks I've found but still when the database gets big the performance gets unacceptable.
The performance problem happens of course only if the indexes are defined.
Since I need the indexes, is there any other option that can make it faster ?
When the database gets big the insert rate gets to 50 rows per second.
Thanks in advance.
* It seems that the larger the DB gets, the journal copies more and more pages out of the database into the file, which kills performance.
================================================================================= // sqlite_test.cpp : Defines the entry point for the console application. // #include <stdio.h> #include <stdlib.h> #include <time.h> #include <windows.h>
#include "sqlite.h"
#define CHECK_SQL(stat) \ if ((l_nErr=stat) != 0) \ { \ printf("Error in sql %d, %s\n\n\n\n\n\n", l_nErr, l_pszError);\ exit(-1); \ }
#define REPORT_SQL(stat) \ if ((l_nErr=stat) != 0) \ { \ printf("Error in sql %d, %s\n", l_nErr, l_pszError);\ }
int main(int argc, char* argv[]) { char * l_pszError; int l_nErr; if (unlink("test.db")!=0) { printf("Failed to delete old database\n"); } if (unlink("test.db-journal")!=0) { printf("Failed to delete old database journal\n"); }
sqlite *l_hDB= sqlite_open("test.db", 0, &l_pszError);
CHECK_SQL(
sqlite_exec(
l_hDB,
"PRAGMA default_cache_size = 100000;",
NULL,
NULL,
&l_pszError));
CHECK_SQL( sqlite_exec( l_hDB, "PRAGMA default_synchronous = OFF;", NULL, NULL, &l_pszError));
REPORT_SQL( sqlite_exec( l_hDB, "create table test ( parent_id INTEGER, age INTEGER)", NULL, NULL, &l_pszError));
REPORT_SQL( sqlite_exec( l_hDB, "create index test_parent_id on test(parent_id)", NULL, NULL, &l_pszError));
REPORT_SQL( sqlite_exec( l_hDB, "create index test_age on test(age)", NULL, NULL, &l_pszError));
REPORT_SQL( sqlite_exec( l_hDB, "begin transaction", NULL, NULL, &l_pszError));
for (int i=0; i<10000; ++i) { static int l_nTrans=0; DWORD l_nCurrTime=GetTickCount();
for (int j=0; j<300; ++j) { REPORT_SQL( sqlite_exec_printf( l_hDB, "insert into test values(%d, %d)", NULL, NULL, &l_pszError, i, rand()));
}
if (!((++l_nTrans) % 100))
{
REPORT_SQL(
sqlite_exec(
l_hDB,
"commit",
NULL,
NULL,
&l_pszError));
REPORT_SQL(
sqlite_exec(
l_hDB,
"begin transaction",
NULL,
NULL,
&l_pszError));
printf("Entered %d events\n", i);
}
DWORD l_nEndTime=GetTickCount();
static int l_nPr=0;
if (!((++l_nPr) % 100))
printf("%d\n", l_nEndTime-l_nCurrTime);
}
REPORT_SQL( sqlite_exec( l_hDB, "commit", NULL, NULL, &l_pszError));
return 0; }
=================================================================================
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]