SQlite優化查詢的例子

前端之家收集整理的这篇文章主要介绍了SQlite優化查詢的例子前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

http://www.techRSS.cn/html/2009/03-08/227379.htm

上次讲到了sqlite的查询优化代码中的具体实现,现在来看一下它的几个实例:

  1 #include "stdio.h"  2 #include "sqlite3.h"  3 #include <windows.h>  4 void query(sqlite3 *db,sqlite3_stmt *stmt,char * sql);  5  6 int main(int argc,char **argv)  7 {  8     sqlite3 *db;  9     char *zErr; 10     int rc; 11     char *sql; 12     sqlite3_stmt *stmt=0; 13     rc = sqlite3_open("memory.db",&db); 14     if(rc) { 15         fprintf(stderr,"Can't open database: %sn",sqlite3_errmsg(db)); 16         sqlite3_close(db); 17     } 18 19     //下面是所建的各个表的结构 20     sql="CREATE TABLE t1 (num int,word TEXT NOT NULL)"; 21     //sql="CREATE TABLE t4 (num INTEGER NOT NULL,word TEXT NOT NULL)"; 22     //sql="CREATE TABLE t3 (num INTEGER NOT NULL,word TEXT NOT NULL)"; 23     rc = sqlite3_exec(db,sql,NULL,&zErr); 24     if(rc != sqlITE_OK) { 25         if (zErr != NULL) { 26             fprintf(stderr,"sql error: %sn",zErr); 27             sqlite3_free(zErr); 28         } 29     } 30 31     //下面是对所以插入进行手动提交,这样可以加快插入速度 32     //sqlite3_exec(db,"BEGIN",&zErr); 33     //插入1000000条记录 34     //for (int i=0;i<1000000;i++) 35     //{ 36     //    sql = sqlite3_mprintf("insert into t1 values(%d,'%s')",i,"goodc"); 37     //    rc = sqlite3_exec(db,&zErr); 38     //} 39     //sqlite3_exec(db,"COMMIT",&zErr); 40     41     sql="create index t1nwindex on t1(num)"; 42     rc=sqlite3_exec(db,&zErr); 43     if(rc != sqlITE_OK) { 44         if (zErr != NULL) { 45             fprintf(stderr,zErr); 46             sqlite3_free(zErr); 47         } 48     } 49 50     //sql="drop index t1nwindex"; 51     //sql="drop index t3index"; 52     //sql="delete from t2"; 53     rc=sqlite3_exec(db,&zErr); 54     if(rc != sqlITE_OK) { 55         if (zErr != NULL) { 56             fprintf(stderr,zErr); 57             sqlite3_free(zErr); 58         } 59     } 60 61     printf("查询结果是:n"); 62     //sql="select * from t1 where num=3000 or num=2000";//有INTEGER PRIMARY KEY,快 63     //sql="select * from t2 where num=3000 or num=2000";//没有索引,慢 64     //sql="select * from t3 where num=3000 or num=2000";//有索引,快 65     66     //这里交换位置了,但是结果用的时间想差比较大的原因是,t1是用索引存储的,但是它不是由create index 67     //而创建的,所以系统还不会把它作为索引处理,所以这两个表就只是无索引的表,在内部优化计算代价只是对它 68     //进行估计,因为源代码中没有捕获到下面的查询条件,所以都是系统最大值(源代码中有),所以就嵌套顺序没 69     //变,所以出现下面的差异。 70     //sql="SELECT count(*) FROM t3,t1 WHERE t1.num = t3.num";//比下面的快,由于内层少 71     //sql="SELECT count(*) FROM t1,t3 WHERE t1.num = t3.num";//比上面的慢,由于内层多 72 73     //下面这个已经内部实现优化,所以所用时间是相同的 74     //sql="SELECT * FROM t2,t3 WHERE t2.num = t3.num";//有索引,稍快 75     //sql="SELECT * FROM t3,t2 WHERE t2.num = t3.num";//同上,内部已经优化 76 77     //sql="select * from t3 where num=8000";//有索引,快 78     //sql="select * from t1 where num%2=0";//有索引,但不能用,很慢 79     //sql="select * from t1 where num=8000";//没有索引,慢 80     81     //BETWEEN的转换优化---内部已经实现优化,如果有索引的话快一点 82     //sql="select count(*) from t2 where word between 'goodl' and 'goodm'";//BETWEEN 83     //sql="select count(*) from t2 where word >='goodl' and word<'goodm'";//BETWEEN的转换 84 85     //LIKE的转换优化---内部已经实现优化 86     //sql="select count(*) from t2 where word like 'goodl%'";//有索引不起作用 87     //sql="select count(*) from t2 where word >='goodl' and word <'goodm'";//如果有索引会更快 88 89     //IN的转换优化---内部没有实现优化,但此时如果可以用索引的话就会很好 90     //如果不用索引则在这里体现不出IN比OR优,而如果有索引则差别很明显 91     //sql="select count(*) from t2 where word in('goodllll','goodkkkk','goodaaaa')"; 92     //sql="select count(*) from t2 where word ='goodllll' or word ='goodkkkk' or word='goodaaaa'"; 93 94     int start=GetTickCount(); 95     query(db,stmt,sql); 96     printf("the time has pass:%dmsn",GetTickCount()-start); 97     sqlite3_close(db); 98     return 0;    99 }100101 void query(sqlite3 *db,char * sql){102     int rc,ncols,i;103     const char *tail;104     rc = sqlite3_prepare(db,-1,&stmt,&tail);105     if(rc != sqlITE_OK) {106         fprintf(stderr,sqlite3_errmsg(db));107     }108     rc = sqlite3_step(stmt);109     ncols = sqlite3_column_count(stmt);110     while(rc == sqlITE_ROW) {   111         for(i=0; i < ncols; i++) {112             fprintf(stderr,"'%s' ",sqlite3_column_text(stmt,i));113         }114         fprintf(stderr,"n");115         rc = sqlite3_step(stmt);116     }117 }

原文链接:https://www.f2er.com/sqlite/202834.html

猜你在找的Sqlite相关文章