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()
可能需要不同的时间,这取决于获取下一行所需的工作量(如不同大小的处理组),如果页面必须从光盘中提取,而不是出现在页面缓存中,等等