是否有工具来分析sqlite查询?

bry*_*ryn 46 sqlite profiling

我正在使用SQLite数据库,并希望加快我的查询,可能是索引或完全重组它们.

是否有一个工具来分析查询,这可能有助于我决定哪些方面正在放慢速度?

我知道我可以在SQLite管理员这样的工具中输入查询来计算它们,但我正在寻找比这更有系统性的东西 - 也许是在后台的东西,看着我输入的所有查询期间,给出任何瓶颈的细分.

Roh*_*lls 37

这只会回答问题的一部分(不幸的是,这是最无益的部分).

我搜索了这个,因为我正在寻找时间查询的东西,而sqlite3客户端有一个计时器元命令.

sqlite> .timer

从那里开始,所有查询结果都会附加cpu计时器统计信息.希望这有助于至少一点点.

  • 虽然这不能回答这个问题,但我敢打赌,这个页面中有50%的人正在寻找 (6认同)

Sam*_*eff 23

你在这里有各种各样的问题.要查看运行的查询以及每个查询需要多长时间,您需要修改sqlite3.dll(如果应用程序链接到该应用程序)或者如果它是您自己的应用程序,则可以更轻松地将其写入代码(我们这样做并且所有查询,交易,时间等).

对于个别查询分析,您可以使用EXPLAIN.它不会告诉您查询中各个步骤的时间,但它会告诉您查询的执行方式.

http://www.sqlite.org/lang_explain.html

SQL语句前面可以是关键字"EXPLAIN"或短语"EXPLAIN QUERY PLAN".这两种修改都会导致SQL语句表现为查询,并返回有关如果省略EXPLAIN关键字或短语后SQL语句将如何操作的信息.

当EXPLAIN关键字本身出现时,它会使该语句表现为一个查询,该查询返回如果没有EXPLAIN关键字,它将用于执行命令的虚拟机指令序列.当EXPLAIN QUERY PLAN短语出现时,该语句返回有关将使用哪些索引的高级信息.

EXPLAIN和EXPLAIN QUERY PLAN的输出仅用于交互式分析和故障排除.输出格式的详细信息可能会从SQLite的一个版本更改为下一个版本.应用程序不应使用EXPLAIN或EXPLAIN QUERY PLAN,因为它们的确切行为是未记录的,未指定的和可变的.


And*_*sev 6

现在 SQLite 具有实验性sqlite3_tracesqlite3_profile(有关详细信息,请参阅https://www.sqlite.org/c3ref/profile.html)。在长时间的测试中,它们可以派上用场进行统计/调查罪魁祸首。

  • 如果能提供一个简单的例子来说明如何使用它,那就太好了。 (2认同)

Jef*_*rey 5

这个古老的话题值得一个现代的答案:是的

使用SQLite 客户端,您可以启用以下功能来帮助您在迭代查询时对查询进行基准测试和分析:

  1. .timer on将计时信息输出到标准输出,例如
sqlite> select * from foo;
a|1
b|2
Run Time: real 0.000 user 0.000056 sys 0.000053
Run Code Online (Sandbox Code Playgroud)
  1. .eqp fullEXPLAIN QUERY PLAN为您的查询启用
sqlite> select * from foo;
QUERY PLAN
`--SCAN foo
addr  opcode         p1    p2    p3    p4             p5  comment      
----  -------------  ----  ----  ----  -------------  --  -------------
0     Init           0     8     0                    0   Start at 8
1     OpenRead       0     2     0     2              0   root=2 iDb=0; foo
2     Rewind         0     7     0                    0   
3       Column         0     0     1                    0   r[1]=foo.x
4       Column         0     1     2                    0   r[2]=foo.y
5       ResultRow      1     2     0                    0   output=r[1..2]
6     Next           0     3     0                    1   
7     Halt           0     0     0                    0   
8     Transaction    0     0     1     0              1   usesStmtJournal=0
9     Goto           0     1     0                    0   
a|1
b|2
Run Code Online (Sandbox Code Playgroud)
  1. .trace stdout --profile启用分析器输出,例如
sqlite> select * from foo;
a|1
b|2
select * from foo; -- 0 ns
Run Code Online (Sandbox Code Playgroud)

.read <file>如果您正在分析文件中的现有查询并且不想手动修改解释语句,则这种有状态方法非常有效。您可以为参数化查询提供查询参数.parameter set <name> <value>