SQLite中的B-Tree实现细节分析_数据库文摘

来源:脚本之家  责任编辑:小易  

绑定时为节点添加Tag属性值treeView1.Nodes.Add("管理部").Tag=treeID;获取treeIDprivate void treeView1_AfterSelect(object sender,TreeViewEventArgs e){TreeNode node=treeView1.SelectedNode;treeID类型 treeID=(treeID类型)node.Tag;}www.zgxue.com防采集请勿采集本网。

SQLite在存储在外部的数据库是以B-Tree来组织的。关于B-tree的细节,参考

**

** Donald E. Knuth, THE ART OF COMPUTER PROGRAMMING, Volume 3:

可用sql语句。 SQLite 的 INSERT INTO 语句用于向数据库的某个表中添加新的数据行。 语法: INSERT INTO 语句有两种基本语法,如下所示: INSERT INTO TABLE_NAME (column1, column2, column3,columnN)] VALUES (value1, value2, value3,v

** "Sorting And Searching", pages 473-480. Addison-Wesley

数据库好像都是这样的吧 select * from t order by "时间字段" 默认升序,降序只需要语句后加 desc

** Publishing Company, Reading, Massachusetts.

// 连接字符串 data source=d:\test.db3;password=1234 SQLiteConnectionStringBuilder connStr = new SQLiteConnectionStringBuilder(); connStr.DataSource = @"d:\test.db3"; connStr.Password = "1234"; conn = new SQLiteConnection(connSt

**

基本思想是文件包含的每一页都包括N个数据库入口和N+1个指向子页的指针。文件分成很多页存储。为什么这么干,因为内存分页管理机制闹得。外存中每个页就是B树的一个节点。

用如下语句: create table 新表名 as select * from 旧表名;如数据库test表中有如下数据: 执行语句: create table test1 as select * from test;--其中test1为要新建的表执行后,test1表中数据如图,内容与test表中一致,也就说明复制成功。

----------------------------------------------------------------

当然用时间日期类型datetime了,查询排序、插入、存储空间等,时间日期类型比文本效率更高

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

----------------------------------------------------------------

当然用时间日期类型datetime了,查询排序、插入、存储空间等,时间日期类型比文本效率更高

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页。第一页的前面100个字节包含了一个特殊的首部(文件头),它是这个文件的描述。

文件头的个数如下:

** 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 Max 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代表100%。默认情况下,一格(cell)的最大量被限制为,至少有4格才能填满一页。因此,默认的最大嵌入负荷分片是64。

如果一页的有效负荷大于了最大有效负荷,那么剩下的数据就要被存储到溢出页。一旦分配了一个溢出页,有可能会有许多数据也被转移到这个溢出页,但是不会让格cell的大小小于最小嵌入有效负荷分片的。

最小页有效负荷分片与最小嵌入有效负荷分片类似,但是它是应用于LEAFDATA tree中的叶节点。一个LEAFDATA的最大有效负荷分片为100%(或者是值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个字节都会被认为是数据。这就允许了64位整数变编码为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) 原文链接:http://www.linuxidc.com/Linux/2012-11/75009.htm

可以通过webView来做桥梁,js去调用java中的方法。WebView(网络视图)能加载显示网页,可以将其视为一个浏览器。它使用了WebKit渲染引擎加载显示网页,实现WebView有以下两种不同的方法:第一种方法的步骤:1.在要Activity中实例化WebView组件:WebView webView=new WebView(this);2.调用WebView的loadUrl()方法,设置WevView要显示的网页:互联网用:webView.loadUrl("http://www.google.com");本地文件用:webView.loadUrl("file:/android_asset/XX.html");本地文件存放在:assets 文件中3.调用Activity的setContentView()方法来显示网页视图4.用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退剪键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面5.需要在AndroidManifest.xml文件中添加权限,否则会出现Web page not available错误。第二种方法的步骤:1、在布局文件中声明WebView2、在Activity中实例化WebView3、调用WebView的loadUrl()方法,设置WevView要显示的网页4、为了让WebView能够响应超链接功能,调用setWebViewClient()方法,WebView视图5、用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退剪键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面6、需要在AndroidManifest.xml文件中添加权限,否则出现Web page not available错误内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • b-tree的性质介绍
  • mysql hash索引和b-tree索引的区别
  • bitmap 索引和 b-tree 索引在使用中如何选择
  • b-树的插入过程介绍
  • 基于b-树和b+树的使用:数据搜索和数据库索引的详细介绍
  • 浅谈mysql的b树索引与索引优化小结
  • 完整b树算法java实现代码
  • c语言b树深入理解
  • b-树的删除过程介绍
  • sqlite 中文指南之faq
  • sqlite中的b-tree实现细节分析
  • 数据库连接方式汇总
  • 比较sql server与oracle、db2
  • @@identity与scope_identity()
  • 如何将SQLITE数据库里的数据调用到web上并显示实时...
  • winform中的treeview从sqlite数据库中获取并形成树...
  • sqlite数据库怎样实现存储过程
  • android 开发里的 SQLite数据库的一段 查询记录总...
  • 怎么向sqlite数据库里插数据?
  • SQLite数据库查询结果按时间排序怎么实现
  • 请教SQLite数据库读写BLOB字段
  • sqlite 怎样实现将查询的结果添加到表中 实现表的...
  • sqlite数据库中如何用sql语句把存有时间数据的字段...
  • sqlite数据库能实现两个数据库直接数据合并吗
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页数据库文摘b-tree的性质介绍mysql hash索引和b-tree索引的区别bitmap 索引和 b-tree 索引在使用中如何选择b-树的插入过程介绍基于b-树和b+树的使用:数据搜索和数据库索引的详细介绍浅谈mysql的b树索引与索引优化小结完整b树算法java实现代码c语言b树深入理解b-树的删除过程介绍sqlite 中文指南之faqsqlite中的b-tree实现细节分析数据库连接方式汇总比较sql server与oracle、db2@@identity与scope_identity()sqlite 中文指南之faq数据库连接方式汇总比较sql server与oracle、db2sqlite中的b-tree实现细节分析@@identity与scope_identity()sqlite中的b-tree实现细节分析@@identity与scope_identity()sqlite 中文指南之faq比较sql server与oracle、db2数据库连接方式汇总
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved