SQLite学习笔记,Tree实现细节分析

作者: 数据库信息  发布:2019-11-28

SQLite在蕴藏在外表的数据库是以B-Tree来组织的。关于B-tree的内幕,参照他事他说加以考查
**
** Donald E. Knuth, THE ART OF COMPUTER PROGRAMMING, Volume 3:
** "Sorting And Searching", pages 473-480. Addison-Wesley
** Publishing Company, Reading, Massachusetts.
**

SQLite 的 PRA土霉素A 命令是一个分裂常常的通令,能够用在 SQLite 情状内决定各个景况变量和境况标识。三个 PRA达托霉素A 值能够被读取,也足以依照须求开展设置。

主导思维是文件包蕴的每大器晚成页都不外乎N个数据库入口和N 1个针对子页的指针。文件分为超级多页存款和储蓄。为啥这么干,因为内部存款和储蓄器分页管理机制闹得。外部存款和储蓄器中各类页正是B树的贰个节点。

语法

| Ptr(0) | Key(0) | Ptr(1) | Key(1) | ... | Key(N-1) | Ptr(N) |

Ptr(0)指向的页上的兼具的key的值都低于Key(0)。全部Ptr(1)指向的页和子页的全体的key的值都大于Key(0),小于Key(1)。全部Ptr(N)指向的页和子页的key的值都大于Key(N-1),等等。

为了精通三个一定的key,须要从磁盘上以O(long(M))来读取,个中M是树的阶数。内部存款和储蓄器中找不到了,就生出缺页中断。
第一是消除内部存款和储蓄器中找不到的主题材料。一方面换出来一些。一方面换进去一些。换进去的时候要找到她们再硬盘的哪个页面上啊。
(B树的独特之处正是切合于用块儿存款和储蓄的存款和储蓄设备上。卡塔 尔(英语:State of Qatar)利用所以,能够清楚他们们在哪些页面上。

在SQLite的贯彻中,八个文书能够分包1个或的过独立的BTree。每二个BTree由它的根页的目录来标记。全体入口的key和数据整合了卓有功用载荷(payload)。数据库的风流罗曼蒂克页有贰个恒定的管用载荷总的数量。假设负荷大于了优先设定的值,那么余下的字节就能够被寄放在溢出页上。三个输入的有效载荷再加上前向指针(the preceding pointer卡塔 尔(英语:State of Qatar)构成了一格(cell)。每豆蔻梢头页皆有一个小底部,包括了Ptr(N)指针和别的一些音信,比方key和数指标分寸。

格式细节
叁个文书分为了多少个页。第风流倜傥页叫做页1,第二页叫做页2,一回类推。页的个数为0象征并未有页。页的大小能够从512 到 65536。每大器晚成页只怕是一个btree页,也许是三个freelist页,或然是三个溢出页。
首先页一定是三个btree页。第大器晚成页的日前一百个字节包蕴了一个特别的首部(文件头),它是那一个文件的叙说。
文本头的个数如下:
** OFFSET SIZE DESCRIPTION
** 0 16 Header string(首部字符串卡塔尔: "SQLite format 3\000"
** 16 2 Page size in bytes(页的字节数卡塔尔.
** 18 1 File format write version(文件写操作的本子卡塔尔
** 19 1 File format read version (文件读操作的版本卡塔尔
** 20 1 Bytes of unused space at the end of each page(每风华正茂页结尾未利用的字节卡塔尔
** 21 1 马克斯 embedded payload fraction(最大的内置有效载荷分片卡塔尔国
** 22 1 Min embedded payload fraction(最小的松开有效载荷分片卡塔 尔(英语:State of Qatar)
** 23 1 Min leaf payload fraction(最小的页有效载荷分片卡塔 尔(阿拉伯语:قطر‎
** 24 4 File change counter (文件变化流速计卡塔尔
** 28 4 Reserved for future use (保留字节)
** 32 4 First freelist page (第一个freelist页)
** 36 4 Number of freelist pages in the file (本文件中freelist页的个数卡塔 尔(阿拉伯语:قطر‎
** 40 60 15 4-byte meta values passed to higher layers()
**
有着的卡尺头都以多方面包车型地铁。

历次改善文件时,文件变化流量计都会大增。那一个流速计能够让别的进程知道曾几何时文件被涂改了,他们的cache是还是不是必要清理。

最大嵌入有效载荷分片是意气风发页的富有可用空间,被标准B-tree(非叶数据卡塔 尔(阿拉伯语:قطر‎表的独门的多少个所能使用的总的数量。值255意味百分百。暗中认可情状下,风流罗曼蒂克格(cell)的最大批量被界定为,至稀有4格能力填满风姿浪漫页。因而,私下认可的最大嵌入负荷分片是64。

假若豆蔻梢头页的管用载荷大于了最大使得载荷,那么余下的数目将要被存放到溢出页。大器晚成旦分配了一个溢出页,有望会有众多数量也被撤换来这几个溢出页,然则不会让格cell的大小小于最小嵌入有效载荷分片的。

最小页有效载荷分片与小小嵌入有效载荷分片相仿,但是它是行使于LEAFDATA tree中的叶节点。三个LEAFDATA的最大实用载荷分片为百分之百(可能是值255卡塔 尔(阿拉伯语:قطر‎,它不用再首部钦点。

BTree的每后生可畏页被分成三部分:首部,格(cell卡塔尔指针数组,和格cell的内容。页1还有只怕会在页首部有100字节的文件头。
**
** |----------------|
** | file header | 100 bytes. Page 1 only.
** |----------------|
** | page header | 8 bytes for leaves. 12 bytes for interior nodes
** |----------------|
** | cell pointer | | 2 bytes per cell. Sorted order.
** | array | | Grows downward
** | | v
** |----------------|
** | unallocated |
** | space |
** |----------------| ^ Grows upwards
** | cell content | | Arbitrary order interspersed with freeblocks.
** | area | | and free space fragments.
** |----------------|
**
页首部如下图所示:
**
** OFFSET SIZE DESCRIPTION
** 0 1 Flags. 1: intkey, 2: zerodata, 4: leafdata, 8: leaf
** 1 2 byte offset to the first freeblock
** 3 2 number of cells on this page
** 5 2 first byte of the cell content area
** 7 1 number of fragmented free bytes
** 8 4 Right child (the Ptr(N) value). Omitted on leaves.
**
标注位定义了那个BTree页的格式。叶leaf标识意味着那朝气蓬勃页未有孩子children。zerodata0数据表示那黄金时代页只含有key,未有数量;intkey标志意味着key是三个子弹头,並且是被储存在格cell首部的key大小处,而不是在有效载荷区域。

格cell指针数组从页首部起始。格cell指针数组包涵0个或多余2个字节的数字,那几个数字代表格cell内容区域中的格cell内容从文件早先地点的偏移量。格cell指针式有序的。系统努力确认保证空闲空间位居最终二个格cell指针之后,那样可以保险新的格cell可以十分的快的丰富,而不用重新收拾(defragment卡塔 尔(阿拉伯语:قطر‎那后生可畏页。

格cell内容存款和储蓄在页的末段,且是向文件的初始方向增高。

在格cell内容区域中的未选择的上空被访谈到链表freeblocks上。每三个freeblock最少有4个字节。第多少个freeblock的撼动在页首部给出了。Freeblock是增序的。因为几个freeblock至稀有4个字节,全部在格cell源委区域的3个或是啊嘿与3个的未用空间无法存在于freeblock链表上。这几个3个或个别3个的空余空间被称之为碎片。全数碎片的总个数被记录下来,存款和储蓄于页首部的偏移7的岗位。

** SIZE DESCRIPTION
** 2 Byte offset of the next freeblock
** 2 Bytes in this freeblock
**

格cell是可变长度的。格cell被积存于页的末尾格cell内容区域。指向格cell的cell指针数组紧跟在页首部的末端。格cell不必是三翻五次大概有序的,可是格cell指针是接连和稳步的。

格cell内容丰裕利用了可变长度整数。可变长度整数是从1到9个字节,每种字节的低7位被应用。整个整数由8位的字节组成,在那之中第三个字节的第8位被清零。整数最器重的字节出将来第叁个。可变长度整数日常少之甚少于9个字节。作为少年老成种特有情状,第八个字节的有所8个字节都会被感觉是数量。那就允许了陆十个人整数变编码为9个字节。
** 0x00 becomes 0x00000000
** 0x7f becomes 0x0000007f
** 0x81 0x00 becomes 0x00000080
** 0x82 0x00 becomes 0x00000100
** 0x80 0x7f becomes 0x0000007f
** 0x8a 0x91 0xd1 0xac 0x78 becomes 0x12345678
** 0x81 0x81 0x81 0x81 0x01 becomes 0x10204081
本篇作品来源 Linux公社网址(www.linuxidc.com) 最初的文章链接:

要查询当前的 PRA阿奇霉素A 值,只要求提供该 pragma 的名字:

你可能感兴趣的稿子:

  • Android开荒之SQLite的施用办法
  • SQLite 中文指南之FAQ
  • sqlite普通话乱码难点原因深入分析及减轻
  • SQLite3中的日期时间函数使用小结
  • sqlite3 top的询问及limit语法介绍
  • SQLite优化方法
  • Sqlite 常用函数 推荐
  • SQLite 错误码收拾
  • sQlite常用语句甚至sQlite developer的选取与注册

PRAGMA pragma_name;

要为 PRA创新霉素A 设置一个新的值,语法如下:

PRAGMA pragma_name = value;

设置情势,能够是称呼或等值的偏分头,但回来的值将始终是五个整数。

auto_vacuum Pragma

auto_vacuum Pragma 获取或设置 auto-vacuum 格局。语法如下:

PRAGMA [database.]auto_vacuum;

PRAGMA [database.]auto_vacuum = mode;

在那之中,mode 能够是以下任何生机勃勃种:

0 或 NONE 禁止使用Auto-vacuum。那是暗中认可格局,意味着数据库文件尺寸大小不会减少,除非手动使用 VACUUM 命令。

1 或 FULL 启用 Auto-vacuum,是电动的。在该形式下,允许数据库文件随着数据从数据库移除而压缩。

2 或 INCREMENTAL 启用 Auto-vacuum,可是必得手动激活。在该形式下,援引数据被保险,免费页面只放在免费列表中。那几个页面可在任什么日期候使用 incremental_vacuum pragma 进行覆盖。

cache_size Pragma

cache_size Pragma 可拿到或临时设置在内部存款和储蓄器中页面缓存的最大尺寸。语法如下:

PRAGMA [database.]cache_size;

PRAGMA [database.]cache_size = pages;

pages 值表示在缓存中的页面数。内置页面缓存的暗中认可大小为 2,000 页,最小尺寸为 10 页。

case_sensitive_like Pragma

case_sensitive_like Pragma 调整内置的 LIKE 表达式的大小写敏感度。暗许情状下,该 Pragma 为 false,那表示,内置的 LIKE 操作符忽视字母的分寸写。语法如下:

PRAGMA case_sensitive_like = [true|false];

现阶段尚无艺术查询该 Pragma 的当下意况。

count_changes Pragma

count_changes Pragma 获取或设置数据操作语句的再次来到值,如 INSERT、UPDATE 和 DELETE。语法如下:

PRAGMA count_changes;

PRAGMA count_changes = [true|false];

暗许意况下,该 Pragma 为 false,这一个语句不回去任何事物。借使设置为 true,各种所波及的语句将赶回一个单行单列的表,由三个十足的整数值组成,该整数表示操作影响的行。

database_list Pragma

database_list Pragma 将用来列出了具备的数据库连接。语法如下:

PRAGMA database_list;

该 Pragma 将回到三个单行三列的表格,每当张开或附加数据库时,会付出数据库中的类别号,它的名称和血脉相仿的公文。

encoding Pragma

encoding Pragma 控制字符串怎样编码及仓库储存在数据库文件中。语法如下:

PRAGMA encoding;

PRAGMA encoding = format;

格式值能够是 UTF-8、UTF-16le 或 UTF-16be 之意气风发。

freelist_count Pragma

freelist_count Pragma 重回二个大背头,表示近年来被标识为免费和可用的数据库页数。语法如下:

PRAGMA [database.]freelist_count;

格式值能够是 UTF-8、UTF-16le 或 UTF-16be 之蓬蓬勃勃。

index_info Pragma

index_info Pragma 重回关于数据库索引的音讯。语法如下:

PRAGMA [database.]index_info( index_name );

结果集将为种种满含在给出列种类的目录、表格内的列索引、列名称的列展现豆蔻梢头行。

index_list Pragma

index_list Pragma 列出具有与表相关联的目录。语法如下:

PRAGMA [database.]index_list( table_name );

结果集将为各个给出列连串的目录、索引名称、表示索引是不是唯意气风发的标志彰显风流倜傥行。

journal_mode Pragma

journal_mode Pragma 获取或安装调成天志文件怎样存款和储蓄和管理的日记形式。语法如下:

PRAGMA journal_mode;

PRAGMA journal_mode = mode;

PRAGMA database.journal_mode;

PRAGMA database.journal_mode = mode;

此处扶持多种日志情势:

DELETE 暗中认可方式。在该格局下,在业务结束时,日志文件将被删去。

TRUNCATE 日志文件被阶段为零字节长度。

PE瑞虎SIST 日志文件被留在原地,但底部被重写,表今日志不再有效。

MEMO君越Y 日志记录封存在内部存款和储蓄器中,实际不是磁盘上。

OFF 不保留任何日志记录。

max_page_count Pragma

max_page_count Pragma 为数据库获取或设置允许的最大页数。语法如下:

PRAGMA [database.]max_page_count;

PRAGMA [database.]max_page_count = max_page;

本文由金沙澳门官网发布于数据库信息,转载请注明出处:SQLite学习笔记,Tree实现细节分析

关键词: 金沙澳门官网