解释

1.语法

sql-stmt:

EXPLAIN QUERY PLAN alter-table-stmt analyze-stmt attach-stmt begin-stmt commit-stmt create-index-stmt create-table-stmt create-trigger-stmt create-view-stmt create-virtual-table-stmt delete-stmt delete-stmt-limited detach-stmt drop-index-stmt drop-table-stmt drop-trigger-stmt drop-view-stmt insert-stmt pragma-stmt reindex-stmt release-stmt rollback-stmt savepoint-stmt select-stmt update-stmt update-stmt-limited vacuum-stmt

2.说明

SQL 语句前面可以有关键字“EXPLAIN”或短语“EXPLAIN QUERY PLAN”。任一修改都会使 SQL 语句表现为查询,并返回有关在省略 EXPLAIN 关键字或短语的情况下 SQL 语句将如何运行的信息。

EXPLAIN 和 EXPLAIN QUERY PLAN 的输出仅用于交互式分析和故障排除。输出格式的详细信息可能会从一个 SQLite 版本到下一个版本发生变化。应用程序不应使用 EXPLAIN 或 EXPLAIN QUERY PLAN,因为它们的确切行为是可变的并且只有部分记录。

当 EXPLAIN 关键字单独出现时,它会导致该语句表现为一个查询,该查询返回 虚拟机指令序列,如果 EXPLAIN 关键字不存在,它将用于执行该命令。当 EXPLAIN QUERY PLAN 短语出现时,该语句返回有关将要使用的查询计划的高级信息。

此处更详细地描述了 EXPLAIN QUERY PLAN 命令

2.1. EXPLAIN 在运行时运行,而不是在准备时运行

EXPLAIN 和 EXPLAIN QUERY PLAN 前缀影响使用sqlite3_step()运行准备好的语句的行为。使用sqlite3_prepare()或类似方法生成新准备语句的过程(大部分)不受 EXPLAIN 的影响。(上一句的例外是,在构建 EXPLAIN QUERY PLAN 准备语句时,省略了 EXPLAIN QUERY PLAN 使用的一些特殊操作码,作为性能优化。)

这意味着在 sqlite3_prepare() 期间发生的操作不受 EXPLAIN 的影响。

  • 一些PRAGMA语句在 sqlite3_prepare() 期间而不是在 sqlite3_step() 期间完成它们的工作。这些 PRAGMA 语句不受 EXPLAIN 的影响。无论有没有 EXPLAIN 前缀,它们的操作都是一样的。不受 EXPLAIN 影响的 PRAGMA 语句集可能因一个版本而异。某些 PRAGMA 语句根据其参数在 sqlite3_prepare() 期间运行。为获得一致的结果,请避免在 PRAGMA 语句上使用 EXPLAIN。

  • 无论是否存在 EXPLAIN 或 EXPLAIN QUERY PLAN,都会调用 授权方回调。