SQLite的DBSTAT 虚拟表(三十六)

返回:SQLite—系列文章目录   

上一篇:SQLite运行时可加载扩展(三十五)

下一篇:SQLite—系列文章目录   

1. 概述

DBSTAT 虚拟表是一个只读的同名虚拟表,返回 有关用于存储内容的磁盘空间量的信息 的 SQLite 数据库。 示例用例 DBSTAT 虚拟表包括 sqlite3_analyzer.exe 实用程序和表大小饼图 Fossil 实现的版本控制系统 对于 SQLite。

当使用 SQLITE_ENABLE_DBSTAT_VTAB 编译时选项构建 SQLite 时,DBSTAT 虚拟表在所有数据库连接上都可用。

DBSTAT 虚拟表是同名的虚拟表,意思是 运行 CREATE VIRTUAL TABLE 以创建 dbstat 虚拟表的实例,然后再使用它。“dbstat” 模块名称可以像表名一样使用,以查询 dbstat 虚拟表。例如:

SELECT * FROM dbstat;

如果需要使用 dbstat 模块的命名虚拟表, 然后是创建 dbstat 实例的推荐方法 虚拟表如下:

CREATE VIRTUAL TABLE temp.stat USING dbstat(main);

请注意虚拟表名称 (“stat”) 之前的 “temp.” 限定符。这 限定符使虚拟表是临时的 - 仅存在 当前数据库连接的持续时间。这是 推荐的方法。

dbstat 的“main”参数是默认模式 为此提供信息。默认值为“main”,并且 因此,在上面的例子中使用“main”是多余的。对于任何 特定查询,则可以通过指定 作为虚拟表的函数参数的替代架构 name 在查询的 FROM 子句中。(有关详细信息,请参阅 FROM 子句中对表值函数的进一步讨论。

DBSTAT 虚拟表的架构如下所示:

CREATE TABLE dbstat(
  name       TEXT,        -- Name of table or index
  path       TEXT,        -- Path to page from root
  pageno     INTEGER,     -- Page number, or page count
  pagetype   TEXT,        -- 'internal', 'leaf', 'overflow', or NULL
  ncell      INTEGER,     -- Cells on page (0 for overflow pages)
  payload    INTEGER,     -- Bytes of payload on this page or btree
  unused     INTEGER,     -- Bytes of unused space on this page or btree
  mx_payload INTEGER,     -- Largest payload size of all cells on this row
  pgoffset   INTEGER,     -- Byte offset of the page in the database file
  pgsize     INTEGER,     -- Size of the page, in bytes
  schema     TEXT HIDDEN, -- Database schema being analyzed
  aggregate  BOOL HIDDEN  -- True to enable aggregate mode
);

DBSTAT 表仅报告数据库文件中 btree 的内容。 自由列表页面、指针映射页面和锁定页面被省略 分析。

默认情况下,DBSTAT 表中每个 DBSTAT 都有一行 btree 页面数据库文件。每行提供 有关该页的空间利用率的信息 数据库。但是,如果隐藏列“aggregate”为 TRUE,则 结果是聚合的,并且 DBSTAT 表中只有一行 对于数据库中的每个 btree,提供有关空间的信息 整个 btree 的利用率。

2. dbstat 虚拟表的 “path” 列

“path”列描述了从 btree 结构的根节点添加到每个页面。这 根节点本身的“路径”是“/”。 当“aggregate”为 TRUE 时,“path”为 NULL。 根目录最左边子页面的“路径” btree 页面为 '/000/'。(Btrees 存储内容从左到右的顺序 因此,左边的页面比右边的页面具有更小的键。 根页最左边的子项是 '/001',依此类推, 每个同级页面都由 3 位十六进制值标识。 第 451 个最左边的兄弟姐妹的孩子有这样的路径 如 '/1C2/000/, '/1C2/001/' 等。 溢出页面通过附加“+”字符和 六位十六进制值到它们所链接的单元格的路径 从。例如,链中的三个溢出页面链接自 识别根页的第 450 个子页面的最左边单元格 通过路径:

'/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. 汇总数据

从 SQLite 版本 3.31.0 (2020-01-22) 开始,DBSTAT 表 有一个名为“aggregate”的新隐藏列,如果将其约束为 TRUE 将导致 DBSTAT 在数据库中为每个 b tree 生成一行, 而不是每页一行。在聚合模式下运行时, “path”、“pagetype” 和 “pgoffset” 列始终为 NULL,并且 “pageno”列保存整个 btree 中的页数,而不是 比与行对应的页码。

下表显示了 (非隐藏) 列的含义 正常模式和聚合模式下的 DBSTAT:

正常含义聚合模式含义
名字实现的表或索引的名称 当前行的 btree
路径请参阅上面的描述始终为 NULL
页码当前行的数据库页的页码当前行的 btree 中的总页数
页面类型“叶子”或“内部”始终为 NULL
ncell(英语:ncell)当前页面或 btree 上的单元格数
有效载荷当前页面或 btree 上有用有效负载的字节数
闲置当前页面或 btree 上未使用的字节
mx_payload在当前页面中任意位置找到的最大有效负载 或 btree。
pgoffset到页面开头的字节偏移量始终为 NULL
pgsize的当前页面或 btree 使用的总存储空间。

4. dbstat 虚拟表的示例用法

要查找用于在模式“aux1”中存储表“xyz”的总页数, 使用以下两种查询之一(第一种是传统方式, 第二个显示了聚合特征的使用):

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

要查看表内容在磁盘上的存储效率, 计算用于保存实际内容的空间量 按已用磁盘空间的总量。这个数字越接近 是100%,包装效率越高。(在此示例中, 假定“xyz”表位于“main”模式中。同样,那里 是两个不同的版本,显示了 DBSTAT 的使用,两者都没有 和新的聚合功能。

SELECT sum(pgsize-unused)*100.0/sum(pgsize) FROM dbstat WHERE name='xyz';
SELECT (pgsize-unused)*100.0/pgsize FROM dbstat
 WHERE name='xyz' AND aggregate=TRUE;

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

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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/564654.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

陈奂仁联手 The Sandbox 推出“Hamsterz Doodles”人物化身系列

全新人物化身系列结合艺术与实用性 开创元宇宙新篇章 著名亚洲唱作歌手兼香港电影金像奖得主陈奂仁携手 The Sandbox,兴奋地宣布推出新的元宇宙人物化身系列 —— Hamsterz Doodles 仓鼠涂鸦。 陈奂仁在 The Sandbox 推出 Hamsterz Doodles 系列,将艺术与…

3i平台体验性能加持,13600KF+B760M+撼与科技A770 TITAN装机体验

在2022年,intel重启显卡线,带来了多款性价比十分不错的显卡。而近段时间,又有传言说intel第二代产品e即将面世,甚至已经有数款Battlemage GPU曝光,让不少intel忠实粉丝直呼期待,或许在今年年底,…

【新知实验室 - TRTC 实践】音视频互动 Demo、即时通信 IM 服务搭建

一、TRTC 初识 TRTC 是什么 TRTC(Tencent RTC)腾讯实时音视频,源自于 QQ 音视频团队,是基于 QQ 音视频多年来的音视频技术积累,位于腾讯云的 RTC 云服务。TRTC 支持腾讯会议、企业微信直播、微信视频号、腾讯云课堂、…

AI大模型探索之路-实战篇2:基于CVP架构-企业级知识库实战落地

目录 前言 一、概述 二、本地知识库需求分析 1. 知识库场景分析 2. 知识库应用特点 3. 知识库核心功能 三、本地知识库架构设计 1. RAG架构分析 2. 大模型方案选型 3. 应用技术架构选型 4. 向量数据库选型 5. 模型选型 三、本地知识库RAG评估 四、本地知识库代码落地 1. 文件…

leetcode最大间距(桶排序+Python)

虽然直接排完序,再求最大差值更快,这里我们还是学一下桶排序。 桶排序主要维护一个bucket,初始bucket【i】 0,遍历nums,当i存在时,令bucket【i】 1,表示存在。遍历完nums,bucket中有…

【点云语义分割】弱监督点云语义分割-双教师指导的对比学习

Weakly Supervised Learning for Point Cloud Semantic Segmentation With Dual Teacher 摘要: 为了增强特征学习能力,我们在这项工作中引入了双教师指导的对比学习框架,用于弱监督点云语义分割。双教师框架可以减少子网络耦合,促…

Java web应用性能分析之服务端慢[网络慢]

Java web应用性能分析之服务端慢,如果是网络原因引起的服务端慢,经常会被忽略,很多时候我们第一时间不会去排查网络原因。出现这种情况也很正常,因为应用的外部网络都是超100M的大宽带服务器,而内部则是千兆网卡或者万…

SpringCloud 与 Dubbo 的区别详解

一、Spring Cloud 和 Dubbo 的概述 1.1 SpringCloud 简介 SpringCloud 是一个用于构建云原生应用的框架集合,它为开发者提供了一套完整的工具链,用于快速搭建分布式系统。SpringCloud 基于 SpringBoot 开发,具有如下特点: 提供…

mysql常见语法操作笔记

1. 数据库的基本操作 1.1. MYSQL登录与退出 D:\phpstudy_pro\Extensions\MySQL5.7.26\bin 输入 mysql -uroot -proot -h127.0.0.1 退出的三种方法 mysql > exit; mysql > quit; mysql > \q; 1.2. MYSQL数据库的一些解释 注意:数据库就相当于文件夹 …

类和对象(2)——封装(封装的概念、包、staic)

前言 面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节。 一、什么是封装 1.1 概念 将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节&…

CXL论文阅读笔记整理(持续更新)

CXL 介绍 An Introduction to the Compute Express LinkTM (CXLTM) Interconnect arXiv Paper 对CXL技术进行介绍,包括CXL 1.0、CXL 2.0、CXL 3.0,对各规范的提升做介绍。整理了现有的CXL实现方法,延迟测试结果,对未来发展进行…

三分钟带你读懂面向对象的三大特征:封装,继承,多态

很多小伙伴在学面向对象的时候觉得非常抽象,尤其是对于面向对象的三大特征:封装,继承,多态不理解,那这期文章呢,九九就给大家安排,三分种带你迅速掌握封装,继承,多态。 …

17.基础乐理-调式、自然大调式(C大调、D大调。。。)

调式: 若干个音,按照某种规则排列起来,就是调式,调式是一个非常大,非常抽象的概念,调式这两个字是一个统称,当明确了 若干个音 到底有几个音,某种规则到底是什么规则之后&#xff0c…

刚拿到的《HarmonyOS应用开发者高级认证》,全网整理的题目,将近300题,100%通过

刚拿到《HarmonyOS应用开发者高级认证》,现在把题目和答案分享一下,这些题目是我根据其他网站整理的,宁滥勿缺,有个别题目是重复的,抽半天时间看一下,应该是稳过的。当然建议还是先跟着文档学一下鸿蒙或者看…

【UE5.1】使用MySQL and MariaDB Integration插件——(4)修改、插入、删除数据

目录 效果 步骤 一、修改 二、插入、删除 在上一篇博客(【UE5.1】使用MySQL and MariaDB Integration插件——(3)表格形式显示数据)基础上继续实现修改、插入和删除数据库数据的功能 效果 修改数据: 插入数据&…

【YOLO系列PR、F1绘图】更改v5、v7、v8(附v8训练、验证方式),实现调用val.py或者test.py后生成pr.csv,然后再整合绘制到一张图上(使用matplotlib绘制)

目录 1. 前提 效果图2. 更改步骤2.1 得到PR_curve.csv和F1_curve.csv2.1.1 YOLOv7的更改2.1.1.1 得到PR_curve.csv2.2.1.2 得到F1_curve.csv 2.1.2 YOLOv5的更改(v6.1版本)2.1.3 YOLOv8的更改(附训练、验证方式) 2.2 绘制PR曲线 …

在CSDN创作了6个月,我收获了什么?文末送书~

作者主页:阿玥的小东东主页! 正在学习:python和C/C 期待大家的关注哦 目录 一次很好的机会,让我开始了CSDN之旅 首先来看看我的几位领路人 创作动力 1W粉丝 在CSDN我收获了什么? 很高的展现量 认证创作者身份 社…

Linux 网络操作命令FTP

FTP命令 引言 文件传输协议(FTP)是一种用于在网络上进行文件传输的协议。在Linux系统中,FTP可以作为一个非常有用的工具来上传、下载和管理文件。本文将介绍如何在Linux系统中安装FTP服务器,以及如何使用FTP客户端进行文件传输。…

RabbitMQ进阶学习

在之前的练习作业中,我们改造了余额支付功能,在支付成功后利用RabbitMQ通知交易服务,更新业务订单状态为已支付。 但是大家思考一下,如果这里MQ通知失败,支付服务中支付流水显示支付成功,而交易服务中的订…

充电器进阶,原边恒流,单片机控制小电流(预充电)的方案

前言 很多充电器,为了能控制电流输出,也就是充电时需要有小电流、大电流的情况,都会用副边及单片机进行控制,但因为是副边控制,需要一个比较器、一个二极管、若干电阻、若干电容,整体BOM成本可能多了三毛钱…