SQLITE_STMT 扩展实现了一个仅同名虚拟表,提供与数据库连接相关的所有预处理语句的信息。
SQLITE_STMT 扩展包含在合并文件中,但默认情况下是禁用的。使用SQLITE_ENABLE_STMTVTAB编译时选项启用 SQLITE_STMT 扩展。SQLITE_STMT 扩展也可以在运行时加载,方法是使用位于https://sqlite.ac.cn/src/file/ext/misc/stmt.c的源代码将扩展编译成共享库或 DLL,并按照有关如何编译可加载扩展的说明进行操作。
在命令行 shell的默认版本中启用了 SQLITE_STMT 扩展。
SQLITE_STMT 虚拟表是一个只读表,可以直接查询以访问当前数据库连接上所有预处理语句的信息。例如
SELECT * FROM sqlite_stmt;
在调用sqlite3_close()之前立即运行上述语句,可以确认所有预处理语句都已完成,并有助于识别和追踪那些“泄漏”而未完成的预处理语句。
SQLITE_STMT 虚拟表还可以用于访问预处理语句的性能信息,以帮助优化应用程序。例如,要找出从未使用过的预处理语句使用了多少内存,可以运行
SELECT sum(mem) FROM sqlite_stmt WHERE run=0;
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值。
此页面上次修改于2022-01-08 05:02:57 UTC