在线文档教程
Sqlite
其他 | Miscellaneous

The DBSTAT Virtual Table

DBSTAT 虚拟表

1.概述

DBSTAT 虚拟表是只读的同名虚拟表,它返回有关架构中哪些表和索引使用数据库文件的哪些页面的信息。DBSTAT 虚表是用来实现 sqlite3_analyzer.exe 应用程序,并帮助计算表大小饼图化石实现 SQLite 的版本控制系统。

dbstat 当 SQLite 是使用 SQLITE_ENABLE_DBSTAT_VTAB 编译时选择建立的虚拟表可在所有的数据库连接。dbstat 虚拟表提供有关数据库文件中 btree 和溢出页面的底层信息。

dbstat 虚拟表是一个同名的虚拟表,这意味着在使用 CREATE VIRTUAL TABLE 来创建 dbstat 虚拟表的实例之前,不需要使用CREATE VIRTUAL TABLE。可以像使用表名直接查询 dbstat 虚拟表一样使用 “dbstat” 模块名称。例如:

SELECT * FROM dbstat;

如果需要使用 dbstat 模块的命名虚拟表,那么建议创建 dbstat 虚拟表实例的方法如下:

CREATE VIRTUAL TABLE temp.stat USING dbstat(main

注意“温度”。虚拟表名称(“stat”)之前的限定符。该限定符会导致虚拟表是临时的 - 仅在当前数据库连接期间存在。这是推荐的方法。

The "main" argument to dbstat is default schema for which information is to be provided. The default is "main", and so the use of "main" in the example above is redundant. For any particular query, the schema can be changed by specifying the alternative schema as a function argument to the virtual table name in the FROM clause of the query. (See further discussion of table-valued functions in the FROM clause for more details.)

dbstat 虚拟表的模式是这样的:

CREATE TABLE dbstat( name TEXT, -- Name of table or index path TEXT, -- Path to page from root pageno INTEGER, -- Page number pagetype TEXT, -- 'internal', 'leaf' or 'overflow' ncell INTEGER, -- Cells on page (0 for overflow) payload INTEGER, -- Bytes of payload on this page unused INTEGER, -- Bytes of unused space on this page mx_payload INTEGER, -- Largest payload size of all cells on this page pgoffset INTEGER, -- Offset of page in file pgsize INTEGER, -- Size of the page schema TEXT HIDDEN -- Database schema being analyzed

数据库文件中的每个页面都有一行 dbstat 表。数据库文件的 Freelist 页面,锁页面和指针映射页面不会出现在 dbstat 虚拟表中。

2. dbstat 虚拟表的“路径”列

“路径”列描述了从 btree 结构的根节点到每个页面的路径。根节点本身的“路径”是“/”。btree 页面根目录的最左侧子页面的“路径”是“/ 000 /”。(Btree 存储的内容从左到右排列,因此左侧的页面比右侧的页面小。)根页面的最左边的孩子的下一个是'/ 001',依此类推,每个兄弟页面由3位十六进制值标识。第451个最左边的兄弟姐妹的孩子具有诸如 '/ 1c2 / 000 /,'/ 1c2 / 001 /'等的路径。通过向路径附加“+”字符和六位十六进制值来指定溢出页面到他们链接的单元格。例如,

'/1c2/000+000000' // First page in overflow chain '/1c2/000+000001' // Second page in overflow chain '/1c2/000+000002' // Third page in overflow chain

如果路径使用 BINARY 整理序列进行排序,则与单元格关联的溢出页面将按排序顺序比它的子页面更早出现:

'/1c2/000/' // Left-most child of 451st child of root

3.使用 dbstat 虚拟表的示例

要查找架构 “aux1” 中用于存储表 “xyz” 的页面总数,请使用:

SELECT count(*) FROM dbstat('aux1') WHERE name='xyz';

要查看表的内容在磁盘上的存储效率如何,请计算用于容纳实际内容的空间量除以所用磁盘空间总量。这个数字越接近100%,包装效率越高。(在这个例子中,'xyz' 表被假定为'主'模式。)

SELECT sum(pgsize-unused)/sum(pgsize) FROM dbstat WHERE name='xyz';

要查找表格的平均扇出,请运行:

SELECT avg(ncell) FROM dbstat WHERE name='xyz' AND pagetype='internal';

当磁盘访问是连续的时,现代文件系统运行得更快。因此,如果数据库文件的内容位于顺序页面上,SQLite 将运行得更快。要找出数据库中页面的哪一部分是顺序的(从而获得可能有助于确定何时进行 VACUUM 的测量),请运行如下所示的查询:

CREATE TEMP TABLE s(rowid INTEGER PRIMARY KEY, pageno INT INSERT INTO s(pageno) SELECT pageno FROM dbstat ORDER BY path; SELECT sum(s1.pageno+1==s2.pageno)*1.0/count(*) FROM s AS s1, s AS s2 WHERE s1.rowid+1=s2.rowid; DROP TABLE s;