I have tested my Code with the following PRAGMA and still not getting any change in time.
//-------------------------------------------------------------- sqlite3_exec(db, "PRAGMA temp_store=2", NULL, NULL, NULL); sqlite3_exec(db, "PRAGMA synchronous=0", NULL, NULL, NULL); sqlite3_exec(db, "PRAGMA count_changes=OFF", NULL, NULL, NULL); sqlite3_exec(db, "pragma default_cache_size =65536", NULL, NULL, NULL); sqlite3_exec(db, "pragma cache_size = 8192", NULL, NULL, NULL); //-------------------------------------------------------------- Actually I have a data in DBF files each file contain 10,30, 50 Million Records. What I am doing is First I have developed an Application to convert data from DBF to DB for using SQLite for fast data access. The Requirment of the project is like this, because every time i will get data in DBF. so I will link my applcation with another application and will first convert it into DB and then I will run different Select Queries. What I want is Fast Insert And Fast Select. I have to display this hige data in Grid. I am Using MFC to develop this application. Now I am thinking to Use SQLite in Memory Mode , may be it help me to reduce the Time. I don't know much that How to use it memory mode. because the methode I am using is taking more time than DISK mode. here is a small Application in Which I was testing a DISK mode and Memory mode for INSERTION and SELECT. can you guide me how to use it properly in memory mode. I have tested this code on P4, 3Ghz, 2 GB RAM , Windows XP Professional. //****************************************************** #include "stdafx.h" #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include "sqlite3.h" int main(int argc, char *argv[]) { char *database = "backup.db"; // char *database = ":memory:"; sqlite3 *db; sqlite3_stmt *insert; int samples = 3000000; int i; time_t bgn, end; double t; remove(database); bgn = time(NULL); sqlite3_open(database, &db); sqlite3_exec(db, "PRAGMA temp_store=2", NULL, NULL, NULL); sqlite3_exec(db, "PRAGMA synchronous=0", NULL, NULL, NULL); sqlite3_exec(db, "PRAGMA count_changes=OFF", NULL, NULL, NULL); sqlite3_exec(db, "pragma default_cache_size =65536", NULL, NULL,NULL); sqlite3_exec(db, "pragma cache_size = 8192", NULL, NULL, NULL); sqlite3_exec(db, "create table t (a integer, b float, c text,d integer, e float, f text, g float, h text)", NULL, NULL, NULL); sqlite3_exec(db, "begin transaction", NULL, NULL, NULL); sqlite3_prepare(db, "insert into t values (?, ?, ?, ?, ?, ?, ? , ?)", -1, &insert, NULL); for (i = 0; i < samples; i++) { sqlite3_bind_int(insert, 1, 44); sqlite3_bind_double(insert, 2, 444.4); sqlite3_bind_text(insert, 3, "two hundred", -1, SQLITE_STATIC); sqlite3_bind_int(insert, 4, 55); sqlite3_bind_double(insert, 5, 5.5); sqlite3_bind_text(insert, 6, "two hundred", -1, SQLITE_STATIC); sqlite3_bind_double(insert, 7, 66.6); sqlite3_bind_text(insert, 8, "two hundred", -1, SQLITE_STATIC); sqlite3_step(insert); sqlite3_reset(insert); } // Insert Time check //********************************************************************* end = time(NULL); sqlite3_exec(db, "commit transaction", NULL, NULL, NULL); t = difftime(end, bgn); printf("Executed %d inserts in %.0f seconds, %.0f inserts/sec\n", samples, t, samples / t); getch(); //********************************************************************* // Select Time check //********************************************************************* bgn = time(NULL); sqlite3_exec(db, "Select * from t", NULL, NULL, NULL); end = time(NULL); t = difftime(end, bgn); printf("Select in %.0f seconds", t); getch(); //********************************************************************* sqlite3_close(db); } //****************************************************** DISK MODE 3000 000 INSERTS 31 Seconds 96774 INSERTS / Sec "SELECT * from t" 5 Seconds. MEMORY MODE 3000 000 INSERTS 53 Seconds 56604 INSERTS / Sec "SELECT * from t" 5 Seconds. Can I reduce the TIME of DISK mode or this is the limit. WHY the Time in MEMORY mode is higher than DISK in case of INSERTION. For the memory MODE I am just changing one statement is this the way to use memory mode. I changed char *database = "backup.db"; into char *database = ":memory:"; I really Need Help. Thanks in Advance. TAMIMY --------------------------------------------------------------------------- > I think that Derrell has already answered your question. What you > are trying to do is inherently slow. You are doing a cross join of > two large tables and counting the results. Depending upon which > indexes you have defined (i.e. an index on IDC in either HVH or ITM > tables), SQLite needs to scan one table from start to finish, and > for each row in that table it uses an index to locate the matching > rows in the other table. > > You can look at the output of the "explain query plan" command to > see how your tables and indexes are being scanned. > > I suspect that this is a contrived tests case, and that it is not > what you really need to get done. Can you explain what you are > trying to do in more detail? For example, it looks like IDC is, or > should be, the primary key for the ITM table, and that IDC is a > foreign key in the HVH table. Is that true? How many records in the > HVH table match each record in the ITM table; one, a few, or many? > What information do you need to get from these tables (i.e. Is a > count of the results what you are really after)? > > If you can explain what you are trying to do in more detail, someone > here can probably help you to generate a more suitable query. > > HTH > Dennis Cote