The SQLITE_STMT Virtual Table
SQLITE_STMT虚拟表
1.概述
SQLITE_STMT扩展实现了一个仅用于名称的虚拟表,该表提供有关与数据库连接关联的所有预备语句的信息。
SQLITE_STMT扩展包含在合并包中,尽管它默认是禁用的。使用SQLITE_ENABLE_STMTVTAB编译时选项来启用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文本。如果事先声明是使用sql
ite3_prepare()接口编译的,那么SQL文本可能尚未保存,在这种情况下,此列将为NULL。
ncol
:查询结果集中的列数。对于DML语句,此列的值为0。
ro
:“只读”列。如果SQL语句是查询,则此列为真(非零),如果是DML语句,则此列为假(零)。
busy
:如果预准备语句当前正在运行,则此字段为true。换句话说,如果sqlite3_step()在预处理语句中至少调用了一次,但sqlite3_reset()尚未调用以重置它,则该字段为true。
nscan
:该字段是字节码引擎作为全表扫描的一部分逐步通过表的次数。如果此字段可能表示有机会通过添加索引来提高性能,则数量很大。该字段等同于SQLITE_STMTSTATUS_FULLSCAN_STEP值。
nsort
:这个字段是字节码引擎必须排序的次数。此字段中的正值可能表示通过添加一个索引来提高性能的机会,该索引将使查询结果以所需顺序自然出现。该字段等同于SQLITE_STMTSTATUS_SORT值。
naidx
:该字段是插入到自动索引中的行数。此字段中的正值可能表示有机会通过添加替代自动索引的指定索引来提高性能。该字段等同于SQLITE_STMTSTATUS_AUTOINDEX值。
nstep
:这个字段是已经为预处理语句执行的字节码引擎操作的数量。该字段可用作代表语句使用了多少CPU时间。该字段等同于SQLITE_STMTSTATUS_VM_STEP值。
reprepp
:此字段是因模式更改或参数绑定更改而必须重新生成语句的次数。该字段等同于SQLITE_STMTSTATUS_REPREPARE值。
run
:该字段是语句运行的次数。该字段等同于SQLITE_STMTSTATUS_RUN值。
mem
:该字段是准备好的语句使用的堆存储的字节数。该字段等同于SQLITE_STMTSTATUS_MEMUSED值。
SQLite is in the Public Domain.