主题 : 在嵌入式系统中sqlite的select和update执行时间过长(每个5秒左右)问题如何解决。 复制链接 | 浏览器收藏 | 打印
QT 的布局怎么搞?
级别: 侠客
UID: 5575
精华: 0
发帖: 81
金钱: 485 两
威望: 193 点
综合积分: 162 分
注册时间: 2009-04-29
最后登录: 2013-12-02
楼主  发表于: 2010-06-17 14:45

 在嵌入式系统中sqlite的select和update执行时间过长(每个5秒左右)问题如何解决。

管理提醒: 本帖被 qq2440 从 micro2440技术交流专区 移动到本区(2013-11-18)
/* 求助:在嵌入式系统中sqlite的select和update执行时间过长问题。
* 以下是示意性源代码。请各位帮忙看看,问题何在。
* 软硬件环境S3C2410 203MHz, Linux 2.4 ,sqlite 3.3,
* 数据库在NAND Flash上存储,文件系统是YAFFS
*/
#define RECORD_NUM 1

char QueryData(void)
{
struct timeval tpstart,tpend;
float timeuse;

char ErrorFlag=1;
unsigned int di,dj,dk;
DataBuffer[0]='\0'; //DataBuffer是全局变量,长度384*16

//查询数据库,获得RECORD_NUM条记录,每条记录大约384个字节.
sprintf(sqlstr,"select * from db where isSent=0 limit %d;",RECORD_NUM);
p(semid);

gettimeofday(&tpstart,NULL);
// 添加了事务也没有减少时间消耗
//rc=sqlite3_exec(db,"begin transaction",0,0,&zErrMsg);
rc = sqlite3_exec(db, sqlstr, SQLCallBack, 0, &zErrMsg);

//rc=sqlite3_exec(db,"commit transaction",0,0,&zErrMsg);

gettimeofday(&tpend,NULL);
timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+
tpend.tv_usec-tpstart.tv_usec;
timeuse/=1000000;
printf("sqlite3 select * Used Time:%f\n",timeuse); // 这里打印值为5秒左右


v(semid);

// 更新数据库
sprintf(sqlstr,"update db set isSent=1 where ID in (select ID from db where isSent=0 limit %d);",RECORD_NUM);
p(semid);
gettimeofday(&tpstart,NULL);


rc = sqlite3_exec(db, sqlstr, 0, 0, &zErrMsg);

gettimeofday(&tpend,NULL);
timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+
tpend.tv_usec-tpstart.tv_usec;
timeuse/=1000000;
printf("sqlite3 update Used Time:%f\n",timeuse); // 这里打印值为5秒左右



v(semid);
}
static int SQLCallBack(void *NotUsed, int argc, char **argv, char **azColName)
{

struct timeval tpstart,tpend;
float timeuse;


int i;
char tstr[500];
gettimeofday(&tpstart,NULL);

// argv[0] is ID ,no use for server
sprintf(tstr,"'%s',",argv[1]);
strcat(DataBuffer,tstr);
for(i=2; i<argc; i++){
// printf("%s,",argv ? argv : "N");
sprintf(tstr,"%s,",argv);
strcat(DataBuffer,tstr);
}
strcat(DataBuffer,"\n");

gettimeofday(&tpend,NULL);
timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+
tpend.tv_usec-tpstart.tv_usec;
timeuse/=1000000;
printf("SQLCallBack Used Time:%f\n",timeuse); //这里打印值为0.000280左右

return 0;
}
SBC2410+8' LCD
mini2440+NEt 3.5'
QT 的布局怎么搞?
级别: 侠客
UID: 5575
精华: 0
发帖: 81
金钱: 485 两
威望: 193 点
综合积分: 162 分
注册时间: 2009-04-29
最后登录: 2013-12-02
1楼  发表于: 2010-06-22 16:24
没人回答,我自己来吧! 杯具啊!希望能给他人以帮助。
建立index能够提高数据库操作效率。
所以在数据库中建立了查找条件的索引:
create index idxSent on db(isSent);
再次重新执行我的程序,select的时间变为0.05秒左右,
update的时间变为0.08到0.012秒左右。
的确提高了不少啊。
PS: 我的数据库现在是12万条记录。
SBC2410+8' LCD
mini2440+NEt 3.5'
级别: 新手上路
UID: 23581
精华: 0
发帖: 5
金钱: 25 两
威望: 5 点
综合积分: 10 分
注册时间: 2010-06-22
最后登录: 2011-01-13
2楼  发表于: 2010-06-22 16:29
使用SQlite3数据一定记住要建立索引,要不查询慢死你
蓝色忧郁
级别: 侠客
UID: 26755
精华: 0
发帖: 101
金钱: 505 两
威望: 101 点
综合积分: 202 分
注册时间: 2010-08-13
最后登录: 2017-09-13
3楼  发表于: 2010-08-17 17:53
老大问个问题,我在Makefile中的libs最后添加了 -L/usr/local/sqlite-3.7.0/lib -lsqlite3,在make的时候出现如下错误
QtDatabase.h:1:21: error: sqlite3.h: No such file or directory

QtDatabase是数据库操作类
里面包含了#include "sqlite3.h"