Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 了解sqlite3“步骤及其原因”;“需要时间”;迭代之间_C_Sqlite - Fatal编程技术网

C 了解sqlite3“步骤及其原因”;“需要时间”;迭代之间

C 了解sqlite3“步骤及其原因”;“需要时间”;迭代之间,c,sqlite,C,Sqlite,我想知道为什么有时候查询结果返回得很快,而有时候在sqlite3\u step()调用之间似乎需要一段时间。例如: rc = sqlite3_prepare_v2(db, "SELECT * FROM mytable m GROUP BY field1, field2, field3, field4, field5 LIMIT 500", -1, &stmt, NULL); while ((rc = sqlite3_step(stmt)) == SQLITE_ROW); 当我查看pri

我想知道为什么有时候查询结果返回得很快,而有时候在
sqlite3\u step()
调用之间似乎需要一段时间。例如:

rc = sqlite3_prepare_v2(db, "SELECT * FROM mytable m GROUP BY field1, field2, field3, field4, field5 LIMIT 500", -1, &stmt, NULL);
while ((rc = sqlite3_step(stmt)) == SQLITE_ROW);
当我查看print语句时,每个
sqlite3\u步骤花费的时间大致相同,fetch语句加起来大约花费
6.5s

然后,对于一个正常、快速的未聚合查询,
sqlite3\u步骤
几乎是即时的:

rc = sqlite3_prepare(db, "SELECT * FROM mytable LIMIT 500", -1, &stmt, NULL);
在上面的查询中,所有内容都需要在
0.1s
下进行查询和检索

我理解为什么查询本身会慢得多,但似乎
sqlite3\u stmt
并不是真的在“做任何事情”,所有的SQL查询工作都会进入
sqlite3\u步骤
,并在每个步骤中展开。这其中有几个问题:

  • 为什么不一次获取结果集,然后立即返回后续步骤(对于一个小查询集,例如上面的记录少于1K的查询集)
  • sqlite3\u prepare
    到底在做什么?它是否接触到实际的文件(或内存)数据,或者只是为运行查询进行“设置”
  • SQLite在每个
    sqlite3_步骤之间做什么?如果查询已经“执行”了,那么它在每个步骤之间需要额外的时间
这个方法的文档已经列出了,但是除了说明它可能会给出什么返回代码之外,它并没有说明它实际上做了什么。从文档中:

此例程用于计算先前由sqlite3_prepare()接口创建的已准备好的语句。语句的计算将一直到第一行结果可用为止。要前进到第二行结果,请再次调用sqlite3_step()。继续调用sqlite3_step(),直到语句完成。不返回结果的语句(例如:INSERT、UPDATE或DELETE语句)在对sqlite3_step()的单个调用中运行到完成

在这种情况下,“完成”是什么意思?它基本上只是执行一个
LIMIT 1
,用户需要再次调用它来执行
OFFSET 1
,或者这到底是什么意思?

sqlite3\u prepare()
将语句编译成sqlite的
sqlite3_step()
计算字节码直到返回一行或不再有行为止。下一个调用将在该点恢复评估;它并不总是一次计算所有结果行,但通常一次只计算一行
sqlite3_step()
可能需要不同的时间,这取决于获取下一行所需的工作量(如不同大小的处理组),如果页面必须从光盘中提取,而不是出现在页面缓存中,等等。

sqlite3_prepare()
将语句编译成sqlite的
sqlite3_step()
计算字节码直到返回一行或不再有行为止。下一个调用将在该点恢复评估;它并不总是一次计算所有结果行,但通常一次只计算一行
sqlite3_step()
可能需要不同的时间,这取决于获取下一行所需的工作量(如不同大小的处理组),如果页面必须从光盘中提取,而不是出现在页面缓存中,等等