SQLITE_STMT扩展实现了仅提供别名的虚拟表,该表提供有关与数据库连接关联的所有准备好的语句的信息。
SQLITE_STMT扩展名包括在合并中,但默认情况下处于禁用状态。使用SQLITE_ENABLE_STMTVTAB编译时选项启用SQLITE_STMT扩展。也可以在运行时加载SQLITE_STMT扩展,方法是使用https://sqlite.org/src/file/ext/misc/stmt.c上的源代码并将扩展编译为共享库或DLL,并按照说明进行操作。如何编译可加载的扩展。
在命令行shell的默认构建中启用了SQLITE_STMT扩展。
SQLITE_STMT虚拟表是一个只读表,可以直接查询该表以访问有关当前数据库连接上所有准备好的语句的信息。例如:
SELECT * FROM sqlite_stmt;
可以在调用sqlite3_close()之前立即运行诸如上述的语句, 以确认所有准备好的语句已经 完成,并有助于识别和跟踪“泄漏”和错过了最终效果的准备好的语句。
SQLITE_STMT虚拟表也可以用于访问有关准备语句的性能信息,以帮助优化应用程序。例如,要找出从未使用过的准备好的语句正在使用多少内存,可以运行以下语句:
从sqlite_stmt处选择sum(mem),运行= 0;
由SQLITE_STMT虚拟表提供的列由假设的CREATE TABLE语句汇总,如下所示:
创建表sqlite_stmt( sql TEXT,-原始SQL文本 ncol INT,-输出列数 ro BOOLEAN,-对于“只读”语句为true busy BOOLEAN,-如果该语句当前正在运行,则为true nscan INT,-全扫描步骤数 nsort INT,-排序操作数 naidx INT,-自动索引插入的数量 nstep INT,-字节码引擎步骤数 reprep INT,-reprepare操作数 运行INT,-此语句已运行的次数 mem INT-此语句使用的堆内存 );
将来的版本可能会添加新的输出列,并可能更改旧列的顺序。下面提供了有关SQLITE_STMT虚拟表中各列的含义的更多详细信息:
sql:准备好的语句的原始SQL文本。如果准备好的语句是使用sqlite3_prepare()接口编译的,则SQL文本可能尚未保存,在这种情况下,此列将为NULL。
ncol:查询结果集中的列数。对于DML语句,此列的值为0。
ro:“只读”列。如果SQL语句是查询,则此列为true(非零),如果是DML语句,则为false(零)。
busy:如果准备好的语句当前正在运行,则此字段为true。换句话说,如果该字段为真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:此字段是prepared语句使用的堆存储的字节数。该字段等效于SQLITE_STMTSTATUS_MEMUSED值。