sqlite日志模式范文模板 13页.docx
- 文档编号:4254753
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:11
- 大小:23.60KB
sqlite日志模式范文模板 13页.docx
《sqlite日志模式范文模板 13页.docx》由会员分享,可在线阅读,更多相关《sqlite日志模式范文模板 13页.docx(11页珍藏版)》请在冰豆网上搜索。
sqlite日志模式范文模板13页
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!
==本文为word格式,下载后可方便编辑和修改!
==
sqlite日志模式
篇一:
SQLite文件分析
SQLite文件分析
作者:
饶珺
1前言
在移动终端APP开发中,数据存储的性能是影响APP整体性能的重要因素之一,当今主流手机操作系统:
IOS、Android、WindowsPhone等平台最常使用的数据库是SQLite,研究SQLite对于深度优化移动APP数据存储性能会比较有帮助。
本文重点介绍SQLite主数据文件的操作原理,文中没有过多介绍具体字节级的含义,而较多使用了图例来方便大家理解。
本文没有讨论SQLite日志文件等临时文件,日志文件主要用于保障主数据文件的完整性。
1.1预备知识
(1)Btree,B-tree,B+tree
文中涉及到的最重要的数据结构是B树,SQLite文件大体就是许多棵B树的集合。
每一张数据表、表的每一个索引都是以B树的形式存储在文件中的。
读本文前需要了解B树相关知识。
在SQLite中,存储表数据用B+tree,存储表索引用B-tree。
表索引和表数据采用不同的B树的原因是为了提高IO效率。
注:
后面文中在不区分B-tree和B+tree的地方统一用Btree来统称这两种B树。
(2)Page(页)
SQLite数据库文件由固定大小的“页(page)”组成。
页的大小可以在512~32768之间(包含这两个值,必须是2的指数),默认大小为1024个字节。
页大小可以在数据库刚创建时设置,创建数据库之后,Page大小不再改变。
Page是SQLite中B树的结构单元,也是磁盘读写的单元。
数据文件中的Page从1开始编号,顺序排列在文件中,通过Page号可以很方便定位出Page在文件中的具体位置。
(3)rowid每张表里的每条记录都会有一个唯一的整数id:
rowid,这个是用于查找记录的关键key值。
如果建表时创建了integer型主键,该值就作为rowid使用。
如果没有创建,则系统自动生成integer的rowid,rowid用变长整数来表示。
(4)变长整数
变长整数是SQLite的特色之一,它既可以处理大整数,又可以节省存储空间。
可变长整数由1~9个字节组成,每个字节的低7位有效,第8位是标志位。
在组成可变长整数的各字节中,前面字节(整数的高位字节)的第8位置1,只有最低一个字节的第8位置0,表示整数结束。
可变长整数可以不到9个字节,即使使用了全部9个字节,也可以将它转换为一个64-bit整数。
下面是一些可变长整数的例子,例子取自源文件btree.c中的注释:
0x00转换为0x000000000x7f转换为0x0000007f0x810x00转换为0x000000800x820x00转换为0x000001000x800x7f转换为0x0000007f
0x8a0x910xd10xac0x78转换为0x12345678,该值与本人验算不一致,应是笔误。
0x810x810x810x810x01转换为0x1020408
上面例子取自源文件bree.c中的(来自:
:
sqlite日志模式)注释,但0x12345678这个似乎是错误的,欢迎大家验算纠正。
相应的计算函数是sqlite3GetVarint和sqlite3PutVarint。
2文件格式
2.1系统表sqlite_master
SQLite数据库文件由多棵Btree构成,每棵Btree至少占用一个完整的页,每个页是Btree的一个结点单元。
每个表或索引的第1个页为根页(rootpage),所有表或索引的根页编号都存储在系统表sqlite_master中,表sqlite_master的根页为page1。
sqlite_master是SQLite系统表,保存了数据库的结构(schema)信息,它包含5个字段:
2.2Page的格式
每个页由四个部分构成:
首先介绍“单元”的概念:
Btree页内部以单元(cell)为单位来组织数据,一个单元包含一个(或部分,当使用溢出页时)payload(也称为Btree记录)。
由于各类数据大小各不相同,每个单元的大小也就是可变的,所以Btree页内部的空间需要进行动态分配。
页内所有单元的内容集中在页的底部,称为“单元内容区”,由下向上增长。
由于单元的大小可变,因此需要对每个单元在页内的起始位置(称为单元指针)进行记录。
单元指针保存在单元指针数组中,位于页头之后。
单元指针数组包含0个或多个指针,由上向下增长。
单元指针数组和单元内容区相向增长,中间部分为未分配空间。
系统尽量保证未分配空间位于最后的指针之后,这样,就很容易增加新的单元,而不需要整理碎片。
单元不需要是相邻和有序的,但单元指针是相邻和有序的。
每个指针占2个字节,表示该单元在单元内容区中距页开始处的偏移。
页中单元的数量保存在页头中。
2.3Page1的格式
之所以把Page1单独说明,是因为Page1的前100个字节为文件信息头,记录整个数据库文件的相关配置信息和一些状态信息。
从第101个字节开始,同普通Page页的结构相同。
从Page1的101字节开始,是系统表sqlite_master的表内容信息。
2.4溢出页
溢出页很好理解,因为有的记录长度很大,会超过一个Page的容量,这时系统就会分配溢出页来存放记录信息。
溢出页的使用如下图示例:
2.5DEMO演示
现在创建一个简单的表同时为该表创建一个索引来看看Page中的数据是如何组织的。
创建一个表,包含两个字段(水果名,水果的索引号)createtablefruit(namenvarchar(32),fruitIdxnvarchar(32));
这里fruitIdx用的是字符串型,查看下面图例时比较方便理解。
该表没有创建整数主键,则系统会为每条记录自动创建整数rowid。
另外一种创建方法如下:
createtablefruit(IDintegerprimarykeyautoincrement,namenvarchar(32),fruitIdxnvarchar(32));
则ID作为记录的rowid,系统不会再另外分配rowid,同时系统会创建一个表sqlite_sequence,这个表有两个字段(name,seq),分别记录表名和rowid当前最大值。
创建索引
Createindextesttable_idxONfruit(fruitIdx);
插入数据
insertintofruit(name,fruitIdx)values('apple','02');insertintofruit(name,fruitIdx)values('coconut','09');insertintofruit(name,fruitIdx)values('orange','01');insertintofruit(name,fruitIdx)values('banana','03');
由于demo数据量不大,所以一个page就可以保存所有数据。
表和索引是两棵分开单独的Btree,所以这里表数据会是一个page,索引数据是另一个单独的page,这两个page也都是叶子页并且是根页。
2.5.1表叶子页格式分析
来看下图示:
2.5.2索引页格式分析
再来看看索引页中的内容和结构。
篇二:
SQLITE的技术要点
SQLITE的技术要点
1、内存数据库代码少,对数据库执行的速度会快(执行代码时间少,
很快能返回结果);内存数据库进程是运行用户的会话进程当中(如果是APP连接,那就在APP连接进程中),因此当会话被释放,那么SQLITE的实例和进程就随即消失。
2、SQLITE也无用户和权限,也无存储过程。
3、文件可跨平台,直接COPY平台下的数据文件到另一个任意平
台后,直接连接就可以访问。
迁移数据比较友好。
4、SQLITE和ORACLE的在处理SQL语句的区别。
SQLITE和oracle一
样需要解析SQL,在解析后,SQLITE会生成VDBE(二进制编码),然后放入虚拟机直接执行。
而oracle会生成执行树,然后优化器择执行计划---即最优路劲。
因此简单SQL语句,SQLITE执行会比较快。
复杂SQL执行性能就体现不出来很好的优势。
5、SQLITE和ORACLE在处理回滚的时候,区别。
SQLITE会生成一
个日志文件,提供回滚。
如果SQL语句大,那么日志文件会很大。
ORACLE会将日志写往回滚段,在撤销表空间里头管理。
6、连接到SQLITE上的数据库会话不可以共享其他的MEMORY。
7、SQLITE的特新和设计理念(P20),到P86,P91
8、SQLITE的死锁理解。
篇三:
SQLite物理文件结构
Contents
1概念介绍........................................................................................................................................1
1.1Btree、B-tree和B+tree:
.................................................................................................1
1.2auto-vacuum数据库:
.......................................................................................................2
1.3数据库映像、数据库文件和日志文件:
........................................................................3
2数据库存储结构............................................................................................................................3
2.1、数据库头结构..................................................................................................................3
2.2、sqlite_master表.............................................................................................................4
2.3、页结构..............................................................................................................................4
2.3.1.页结构总体概述......................................................................................................4
2.3.2.页头结构分析..........................................................................................................5
2.3.3表数据存储格式(B+Tree)..................................................................................6
2.3.3.1B+tree格式介绍...........................................................................................6
2.3.3.2B+tree内部页格式分析..............................................................................7
2.3.3.3B+tree叶子页格式分析.............................................................................8
2.3.4索引数据存储格式(B-Tree).............................................................................11
2.3.4.1索引内部页.................................................................................................11
2.3.4.2索引叶子页.................................................................................................12
3附录.............................................................................................................................................12
3.1可变长整数.......................................................................................................................12
3.2字段的数据类型和宽度说明...........................................................................................13
3.3参考资料...........................................................................................................................13
1概念介绍
1.1Btree、B-tree和B+tree:
Btree是为磁盘存储而优化了的一种树结构,其一般性说明可参考各类《数据结构》教材。
根据实现方法的不同,Btree又分为很多类型。
在SQLite中,存储表数据用的是B+tree,存储表索引用的是B-tree。
由于历史原因,SQLite在3.0版以前只使用B-tree,从3.0版开始,才对表数据使用了B+tree。
因此,在SQLite的官方文档中,有时B-tree表示存储表索引的B-tree,有时又是两种Btree的统称
1
B-树
B+树
1.2auto-vacuum数据库:
一般情况下,当一个事务从数据库中删除了数据并提交后,数据库文件的大小保持不变。
即使整页的数据都被删除,该页也会变成“空闲页”等待再次被使用,而不会实际地被从数据库文件中删除。
执行vacuum操作,可以通过重建数据库文件来清除数据库内所有的未用空间,使数据库文件变小。
但是,如果一个数据库在创建时被指定为auto_vacuum数据库,当删除事务提交时,数据库文件会自动缩小。
使用auto_vacuum数据库可以节省空间,但却会增加数据库操作的时间,有利有弊。
Auto_vacuum数据库需要使用附加的格式,如指针图页,本文重点讨论非auto_vacuum数据库。
2
1.3数据库映像、数据库文件和日志文件:
“数据库映像”是SQLite数据库的磁盘映像。
SQLite数据库存储在单一的“数据库文件”中。
一般情况下,数据库映像和数据库文件是一致的,可以理解为数据库映像就是数据库文件的内容,但有例外。
如果事务对数据库进行了修改,这些修改会暂存在“日志文件”中,此时可以认为数据库映像分布在数据库文件和日志文件两个文件中。
日志文件有自己的格式,本文第3章专门介绍。
从逻辑上来说,一个SQLite数据库文件由多个多重Btree构成。
每个Btree存储一个表的数据或一个表的索引,索引采用B-tree,而表数据采用B+tree,每个Btree占用至少一个完整的页,每个页是Btree的一个结点。
每个表或索引的第1个页称为根页,所有表或索引的根页编号都存储在系统表sqlite_master中,表sqlite_master的根页为page1
2数据库存储结构
2.1、数据库头结构
数据库中第一个页(page1)永远是Btree页。
Page1的前100个字节是一个对数据库文件进行描述的“文件头”。
它包括数据库的版本、格式的版本、页大小、编码等所有创建数据库时设置的永久性参数。
关于这个特殊文件头的文档在btreeInt.h中,具体格式如下:
3
404Schema版本:
每次schema改变(创建或删除表、索引、视图或触发器等对象,造成sqlite_master表被修改)时,此值+1。
444Fileformatofschemalayer:
当前允许值为1~4,超过此范围,将被认为是文件格式错。
484Sizeofpagecache。
524Largestroot-page(auto/incr_vacuum):
对于auto-vacuum数据库,此域为数据库中根页编号的最大值,非0。
对于非auto-vacuum数据库,此域值为0。
5641=UTF-8、2=UTF16le、3=UTF16be。
604Userversion。
此域值供用户应用程序自由存取,其含义也由用户定义。
644Incrementalvacuummode:
对于auto-vacuum数据库,如果是Incrementalvacuum模式,此域值为1。
否则,此域值为0。
684未使用。
724未使用。
2.2、sqlite_master表
每个表或索引的第1个页称为根页,所有表或索引的根页编号都存储在系统表sqlite_master中,表sqlite_master的根页为page1。
sqlite_master是一个系统表,保存了数据库的schema信息。
在逻辑上sqlite_master包含5个字段,如下表所示:
本文以我们的产品中的一个数据库为例,sqlite_master表信息如下:
2.3、页结构
2.3.1.页结构总体概述
每个Btree页由四个部分构成:
4
为单位来组织数据,一个单元包含一个(或部分,当使用溢出页时)payload(也称为Btree记录)。
由于各类数据大小各不相同,每个单元的大小也就是可变的,所以Btree页内部的空间需要进行动态分配(程序内部动态分配,不是动态申请空间),单元是Btree页内部进行空间分配和回收的基本单位。
页内所有单元的内容集中在页的底部,称为“单元内容区”,由下向上增长。
由于单元的大小可变,因此需要对每个单元在页内的起始位置(称为单元指针)进行记录。
单元指针保存在单元指针数组中,位于页头之后。
单元指针数组包含0个或多个指针,由上向下增长。
单元指针数组和单元内容区相向增长,中间部分为未分配空间。
系统尽量保证未分配空间位于最后的指针之后,这样,就很容易增加新的单元,而不需要整理碎片。
单元不需要是相邻和有序的,但单元指针是相邻和有序的。
每个指针占2个字节,表示该单元在单元内容区中距页开始处的偏移。
页中单元的数量保存在页头中。
2.3.2.页头结构分析
页头的格式如下:
下面对页头各域分别进行介绍。
页类型标志:
如果leaf位被设置,则该页是一个叶子页,没有儿子;
如果zerodata位被设置,则该页只有关键字,而没有数据;
如果intkey位被设置,则关键字是整型;
如果leafdata位设置,则tree只存储数据在叶子页。
注:
可以这样理解:
就不用管各标志位的含义了,
如果是B+tree的叶子页,该字节值为0X0D,
如果是B+tree的内部页,该字节值为0X05,
如果是B-tree的叶子页,该字节值为0X0A,
如果是B-tree的内部页,该字节值为0X02。
5
篇四:
SQLITE中的填空判断知识点
在SQLite中创建表时,关系模型的参照完整性在createtable语句中用references命令短语指明这些外码参照哪些表的主码。
在SQLite中,false可以由数字0代替,true可以由其他的非0值代替。
在SQL查询语句中,where子句过滤行(选择),select子句过滤列(投影)。
在SQL查询语句中,select子句后的星号(*)表示所有列。
在SQL查询语句中,除必须提供select子句外,所有子句都是可选的。
在SQL查询语句中,任何select语句的输出都可以作为另一个语句的输入。
SQLite支持ANSISQL中除rightouterjoin和fullouterjoin之外的所有操作,而这两个操作也可以由其他基本的关系操作完成。
在关系运算中,交运算属于附加运算,可以由基本关系运算组成。
SQLite数据库包含在单个操作系统文件中,因此在备份文件时,可以通过复制该文件完成。
在对SQLite数据库进行长期备份时,最好转储为SQL格式,这样可以实现在各种不同的SQLite版本中加以恢复,即备份为SQL格式,可以增强数据库文件的可移植性。
在SQLite中,单独的1个字段可以存储不同存储类的值,而且不同存储类的值可以通过它们各自类的“类值”进行排序。
SQLite的排序规则是:
1)NULL存储类具有最低级的类值。
NULL值之间没有大小值的区分。
2)integer或real存储类值高于NULL,二者的排序级别相等。
两种类型的数据通过数值大小进行比较。
3)text存储类的值比integer和real高。
4)blob存储类是最高级别的类。
SQLite3支持NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型。
虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s)等数据类型,只不过在运算或保存时会转成对应的五种数据类型。
SQLite最大的特点是你可以保存任何类型的数据到任何字段中,无论这列声明的数据类型是什么。
例如:
可以在Integer字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。
有一种情况例外:
定义为INTEGER
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- sqlite日志模式范文模板 13页 sqlite 日志 模式 范文 模板 13