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.anxorj.tw防采集請勿采集本網。

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內容充分利用了可變長度整數?勺冮L度整數是從1到9個字節,每個字節的低7位被使用。整個整數由8位的字節組成,其中第一個字節的第8位被清零。整數最重要的字節出現在第一個?勺冮L度整數一般不多于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.anxorj.tw請勿采集。


  • 本文相關:
  • 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.anxorj.tw All Rights Reserved
    陕西快乐10分下载