【冠亚体育手机网站】Tree实现细节分析,SQLite学习笔记

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 的 PRAGMA 命令是叁个奇特的吩咐,能够用在 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树的长处就是相符于用块儿存款和储蓄的存款和储蓄设备上。)利用所以,可以清楚她们们在哪些页面上。

在SQLite的落到实处中,贰个文本可以包含1个或的过独立的BTree。每二个BTree由它的根页的目录来标志。全部入口的key和多少整合了有效载荷(payload)。数据库的一日千里页有三个固定的管事载荷总的数量。借使负荷大于了早期设定的值,那么余下的字节就能被积攒在溢出页上。三个入口的有效载荷再增加前向指针(the
preceding
pointer)构成了旭日初升格(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(最小的嵌入有效载荷分片)
** 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位被清零。整数最根本的字节出现在第4个。可变长度整数平日相当少于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;

私下认可值是 1,073,741,823,那是一个千兆的页面,即只要默许 1 KB
的页面大小,那么数据库中加强起来的三个兆字节。

page_count Pragma

page_count Pragma 重临当前数据库中的网页数量。语法如下:

PRAGMA [database.]page_count;

数据库文件的大小应该是 page_count * page_size。

page_size Pragma

page_size Pragma 获取或安装数据库页面包车型客车分寸。语法如下:

PRAGMA [database.]page_size;

PRAGMA [database.]page_size = bytes;

暗中同意情状下,允许的尺寸是 512、1024、2048、4096、8192、16384、32768
字节。改造现成数据库页面大小的独步一时方法就是设置页面大小,然后立刻 VACUUM
该数据库。

parser_trace Pragma

parser_trace Pragma 随着它剖判 SQL 命令来调控打字与印刷的调和景况,语法如下:

PRAGMA parser_trace = [true|false];

默许境况下,它棉被服装置为 false,但设置为 true 时则启用,此时 SQL
剖析器会随着它分析 SQL 命令来打字与印刷出它的场合。

recursive_triggers Pragma

recursive_triggers Pragma
获取或设置递归触发器功效。如若未启用递归触发器,五个接触动作将不会触发另三个接触。语法如下:

PRAGMA recursive_triggers;

PRAGMA recursive_triggers = [true|false];

schema_version Pragma

schema_version Pragma
获取或安装存款和储蓄在多少库头中的的架构版本值。语法如下:

PRAGMA [database.]schema_version;

PRAGMA [database.]schema_version = number;

那是三个 31个人有标识整数值,用来追踪架构的转移。每当一个架构退换命令推行(比方CREATE… 或 DROP…)时,那一个值会递增。

secure_delete Pragma

secure_delete Pragma 用来调节内容是什么样从数据库中删去。语法如下:

PRAGMA secure_delete;

PRAGMA secure_delete = [true|false];

PRAGMA database.secure_delete;

PRAGMA database.secure_delete = [true|false];

平安删除标记的默许值平时是停业的,可是那是足以通过
SQLITE_SECURE_DELETE 创设选项来退换的。

sql_trace Pragma

sql_trace Pragma 用于把 SQL 追踪结果转储到显示器上。语法如下:

PRAGMA sql_trace;

PRAGMA sql_trace = [true|false];

SQLite 必需通过 SQLITE_DEBUG 指令来编写翻译要引用的该 Pragma。

synchronous Pragma

synchronous Pragma 获取或安装当前磁盘的联合方式,该格局调控积极的 SQLite
如何将数据写入物理存款和储蓄。语法如下:

PRAGMA [database.]synchronous;

PRAGMA [database.]synchronous = mode;

SQLite 辅助下列同步情势:

0 或 OFF 不开展协同。

1 或 NORMAL 在主要的磁盘操作的种种体系后一只。

2 或 FULL 在各样入眼的磁盘操作后联手。

temp_store Pragma

temp_store Pragma 获取或安装不时数据库文件所使用的积攒方式。语法如下:

PRAGMA temp_store;

PRAGMA temp_store = mode;

SQLite 帮忙下列存款和储蓄情势:

0 或 DEFAULT 暗中认可使用编写翻译时的方式。经常是 FILE。

1 或 FILE 使用基于文件的仓库储存。

2 或 MEMOLANDY 使用基于内部存款和储蓄器的蕴藏。

temp_store_directory Pragma

temp_store_directory Pragma
获取或设置用于有的时候数据库文件的岗位。语法如下:

PRAGMA temp_store_directory;

PRAGMA temp_store_directory = ‘directory_path’;

user_version Pragma

user_version Pragma
获取或设置存款和储蓄在数据库头的客户自定义的版本值。语法如下:

PRAGMA [database.]user_version;

PRAGMA [database.]user_version = number;

那是多少个 32 位的有号子整数值,能够由开采职员设置,用于版本追踪的目标。

writable_schema Pragma

writable_schema Pragma 获取或安装是不是能够修改系统表。语法如下:

PRAGMA writable_schema;

PRAGMA writable_schema = [true|false];

例如设置了该 Pragma,则表以 sqlite_ 早先,能够创造和改动,包括sqlite_master 表。使用该 Pragma
时要小心,因为它只怕导致整个数据库损坏。

参考:

冠亚体育手机网站 1

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注