SQLITE_STMT 虚拟表

、概述

SQLITE_STMT 扩展实现了一个仅同名的虚拟表,该表提供有关与数据库连接关联的所有准备好的语句的信息。

SQLITE_STMT 扩展包含在合并中,但默认情况下它是禁用的。使用SQLITE_ENABLE_STMTTVTAB编译时选项启用 SQLITE_STMT 扩展。SQLITE_STMT 扩展也可以在运行时加载,方法是使用https://sqlite.org/src/file/ext/misc/stmt.c上的源代码将扩展编译到共享库或 DLL 中,并按照以下说明进行操作如何编译可加载扩展

SQLITE_STMT 扩展在命令行 shell的默认构建中启用。

2.用法

SQLITE_STMT 虚拟表是一个只读表,可以直接查询以访问有关当前数据库连接上所有准备好的语句的信息。例如:

SELECT * FROM sqlite_stmt;

可以在调用 sqlite3_close()之前立即运行上述语句,以确认所有准备好的语句都已 完成,并帮助识别和追踪“泄漏”和错过完成的准备好的语句。

SQLITE_STMT 虚拟表还可用于访问有关准备好的语句的性能信息,以帮助优化应用程序。例如,要找出从未 使用过的准备好的语句使用了多少内存,可以运行:

SELECT sum(mem) FROM sqlite_stmt WHERE run=0;

2.1.

SQLITE_STMT 虚拟表提供的列由此处显示的假设 CREATE TABLE 语句总结:

CREATE TABLE sqlite_stmt(
  sql    TEXT,    -- Original SQL text
  ncol   INT,     -- Number of output columns
  ro     BOOLEAN, -- True for "read only" statements
  busy   BOOLEAN, -- True if the statement is current running
  nscan  INT,     -- Number of full-scan steps
  nsort  INT,     -- Number of sort operations
  naidx  INT,     -- Number of automatic index inserts
  nstep  INT,     -- Number of byte-code engine steps
  reprep INT,     -- Number of reprepare operations
  run    INT,     -- Number of times this statement has been run
  mem    INT      -- Heap memory used by this statement
);

未来的版本可能会添加新的输出列,并且可能会更改旧列的顺序。下面提供了有关 SQLITE_STMT 虚拟表中每一列含义的更多详细信息:

  • sql:准备好的语句的原始 SQL 文本。如果准备好的语句是使用sqlite3_prepare()接口编译的,那么 SQL 文本可能没有保存,在这种情况下该列将为 NULL。

  • ncol:查询结果集中的列数。对于 DML 语句,此列的值为 0。

  • ro:“只读”列。如果 SQL 语句是查询,则此列为真(非零),如果它是 DML 语句,则此列为假(零)。

  • busy:如果准备好的语句当前正在运行,则此字段为真。换句话说,如果sqlite3_step()已在准备好的语句上至少调用一次但尚未调用 sqlite3_reset()来重置它,则此字段为真。

  • nscan:该字段是字节码引擎作为全表扫描的一部分逐步遍历表的次数。如果此字段为大数,则可能表示有机会通过添加索引来提高性能。该字段等效于SQLITE_STMTSTATUS_FULLSCAN_STEP 值。

  • nsort:该字段是字节码引擎必须排序的次数。此字段中的正值可能表示有机会通过添加索引来提高性能,这将使查询结果以所需的顺序自然出现。该字段等效于SQLITE_STMTSTATUS_SORT值。

  • naidx:这个字段是已经插入到 自动索引中的行数。该字段中的正值可能表示有机会通过添加命名索引来代替自动索引来提高性能。该字段等效于SQLITE_STMTSTATUS_AUTOINDEX值。

  • nstep:该字段是为准备好的语句执行的字节码引擎操作的数量。该字段可用作语句使用了多少 CPU 时间的代理。该字段等效于SQLITE_STMTSTATUS_VM_STEP值。

  • reprep:此字段是由于模式更改或参数绑定更改而必须重新准备语句的次数。该字段等效于SQLITE_STMTSTATUS_REPREPARE值。

  • run:该字段是语句运行的次数。该字段等效于SQLITE_STMTSTATUS_RUN值。

  • mem:该字段是准备好的语句使用的堆存储的字节数。该字段等效于SQLITE_STMTSTATUS_MEMUSED值。