有没有办法在运行时测量sqlite中的查询时间?

时间:2012-11-16 22:32:33

标签: sqlite profiling query-optimization

我想测量sqlite中每个sql语句的执行时间。

我理解在sqlite shell中你可以做.timer,但我想知道如何以可编程的方式做到这一点,这样我就可以知道当应用程序实时访问数据库时sql语句花了多少时间,不仅仅是之后在shell中重放那个语句吗?

我可以为sqlite_profile提供一个插件函数吗?

非常感谢

2 个答案:

答案 0 :(得分:1)

在阅读shell.c的代码后,我在文件顶部找到了以下相关信息:

/* Saved resource information for the beginning of an operation */
static struct rusage sBegin;

/*
** Begin timing an operation
*/
static void beginTimer(void){
  if( enableTimer ){
    getrusage(RUSAGE_SELF, &sBegin);
  }
}

/* Return the difference of two time_structs in seconds */
static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
   return (pEnd->tv_usec - pStart->tv_usec)*0.000001 + 
         (double)(pEnd->tv_sec - pStart->tv_sec);
}

/*
** Print the timing results.
*/
static void endTimer(void){
  if( enableTimer ){
    struct rusage sEnd;
    getrusage(RUSAGE_SELF, &sEnd);
    printf("CPU Time: user %f sys %f\n",
       timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
       timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
  }
}

这意味着,SQLite本身不提供某种分析,因此您必须使用语言功能(例如endtime-startime)来完成这项工作。

答案 1 :(得分:0)

sqliteman提供了一些基本的分析功能。它显示查询执行时间。        虽然查询执行在不同的处理器上(即X86与ARM相比),但它仍然可以帮助您在sqlite上编写优化的原始查询。 例如。我刚用没有索引的where子句测试了一个select查询,它花了大约0.019秒,创建索引后它只用了0.008。

以下是sqlite man http://sourceforge.net/projects/sqliteman/

的链接