gpt4 book ai didi

c - 了解 sqlite3_step 以及为什么它在迭代之间为 "takes time"

转载 作者:太空宇宙 更新时间:2023-11-04 01:43:40 26 4
gpt4 key购买 nike

我想知道为什么有时查询结果返回得非常快,而其他时候似乎在 sqlite3_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);

当我查看打印语句时,每个 sqlite3_step 花费的时间大致相同,而 fetch 语句加起来大约需要 6.5s

然后通过正常、快速的未聚合查询,sqlite3_step 几乎是即时的:

rc = sqlite3_prepare(db, "SELECT * FROM mytable LIMIT 500", -1, &stmt, NULL);

在上面的查询中,所有的查询和检索时间都在0.1s之内。

我明白为什么查询本身会慢得多,但似乎 sqlite3_stmt 并没有真正“做任何事”,所有 SQL 操作都进入了 sqlite3_step 并在每个步骤中展开。几个问题:

  • 为什么不提取一次结果集,并立即返回连续的步骤(对于小型查询集,例如上面记录少于 1K 的查询集)?
  • sqlite3_prepare 到底在做什么?它会触及实际文件(或内存中)数据,还是只是“设置”以运行查询?
  • SQLite 在每个 sqlite3_step 之间做了什么,它在步骤之间花费了额外的时间(如果查询已经“执行”)?

列出了此方法的文档 here , 但除了说明它可能给出的返回码外,它并没有说明它实际做了什么。来自文档:

This routine is used to evaluate a prepared statement that has been previously created by the sqlite3_prepare() interface. The statement is evaluated up to the point where the first row of results are available. To advance to the second row of results, invoke sqlite3_step() again. Continue invoking sqlite3_step() until the statement is complete. Statements that do not return results (ex: INSERT, UPDATE, or DELETE statements) run to completion on a single call to sqlite3_step().

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

最佳答案

sqlite3_prepare() 将语句编译成sqlite的internal bytecode . sqlite3_step() 评估字节码直到返回一行或没有更多行为止。下一次调用将在此时恢复评估;它并不总是一次计算所有结果行,但通常一次只计算一个。 sqlite3_step() 可能需要不同的时间,具体取决于需要完成多少工作才能获得下一行(例如处理不同大小的组),如果页面必须从磁盘中获取而不是存在于页面缓存等

关于c - 了解 sqlite3_step 以及为什么它在迭代之间为 "takes time",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58089599/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com