SQLite的設計與概念

來源:互聯網
上載者:User

、 API
由兩部分組成: 核心API(core API) 和擴充API(extension API)
核心API的函數實現基本的資料庫操作:串連資料庫,處理SQL,遍曆結果集。它也包括一些實用函數,比如字串轉換,操作控制,調試和錯誤處理。
擴充API通過建立你自訂的SQL函數去擴充SQLite。

1.1、SQLite Version 3的一些新特點:
(1)SQLite的API全部重新設計,由第二版的15個函數增加到88個函數。這些函數包括支援UTF-8和UTF-16編碼的功能函數。
(2)改進並發效能。加鎖子系統引進一種鎖定擴大模型(lock escalation model),解決了第二版的寫進程餓死的問題(該問題是任何一個DBMS必須面對的問題)。這種模型保證寫進程按照先來先服務的演算法得到排斥鎖(Exclusive Lock)。甚至,寫進程通過把結果寫入臨時緩衝區(Temporary Buffer),可以在得到排斥鎖之前就能開始工作。這對於寫要求較高的應用,效能可提高400%(引自參考文獻)。
(3)改進的B-樹。對於表採用B+樹,大大提高查詢效率。
(4)SQLite 3最重要的改變是它的儲存模型。由第二版只支援文本模型,擴充到支援5種本機資料類型。
總之,SQLite Version 3與SQLite Vertion 2有很大的不同,在靈活性,特點和效能方面有很大的改進。

1.2、主要的資料結構(The Principal Data Structures)
SQLite由很多部分組成-parser,tokenize,virtual machine等等。但是從程式員的角度,最需要知道的是:connection, statements, B-tree和pager。它們之間的關係如下:

告訴我們在編程需要知道的三個主要方面:API,事務(Transaction)和鎖(Locks)。從技術上來說,B-tree和pager不是API的一部分。但是它們卻在事務和鎖上起著關鍵作用(稍後將討論)。

1.3、Connections和Statements(串連和運行)

主要是與查詢有關。分別對應控制代碼:sqlite和sqlite_stmt 。

Connection和statement是執行SQL命令涉及的兩個主要資料結構,幾乎所有通過API進行的操作都要用到它們。一個串連(Connection)代表在一個獨立的事務環境下的一個串連A (connection represents a single connection to a database as well as a single transaction context)。每一個statement都和一個connection 關聯,它通常表示一個編譯過的SQL語句,在內部,它以VDBE位元組碼錶示。Statement包括執行一個命令所需要一切,包括儲存VDBE程式執行狀態所需的資源,指向硬碟記錄的B-tree遊標,以及參數等等。

1.4、B-tree和pager
一個connection可以有多個database對象---一個主要的資料庫以及附加的資料庫,每一個資料庫物件有一個B-tree對象,一個B-tree有一個pager對象(這裡的對象不是物件導向的“對象”,只是為了說清楚問題) 。
Statement最終都是通過connection的B-tree和pager從資料庫讀或者寫資料,通過B-tree的遊標 (cursor) 遍曆儲存在頁面(page)中的記錄。遊標在訪問頁面之前要把數所從disk載入到記憶體,而這就是pager的任務。任何時候,如果B-tree需要頁面,它都會請求pager從disk讀取資料,然後把頁面(page)載入到頁面緩衝區(page cache),之後,B-tree和與之關聯的遊標就可以訪問位於page中的記錄了。
如果cursor改變了page,為了防止交易回復,pager必須採取特殊的方式儲存原來的page。總的來說,pager負責讀寫資料庫,管理記憶體緩衝和頁面(page),以及管理事務,鎖和崩潰恢複(這些在事務一節會詳細介紹)。
總之,關於connection和transaction,你必須知道兩件事:
(1) 對資料庫的任何操作,一個串連存在於一個事務下。
(2) 一個串連決不會同時存在多個事務下。
whenever a connection does anything with a database, it always operates under exactly one
transaction, no more, no less.

1.5、核心API

核心API 主要與執行SQL命令有關,本質上有兩種方法執行SQL語句:prepared query 和wrapped query。Prepared query由三個階段構成:preparation,execution和finalization。其實wrapped query只是對prepared query的三個過程封裝而已,最終也會轉化為prepared query的執行。

1.5.1、串連的生命週期(The Connection Lifecycle)
和大多資料庫連接相同,由三個過程構成:
(1) 串連資料庫(Connect to the database):
每一個SQLite資料庫都儲存在單獨的作業系統檔案中,串連,開啟資料庫的C API為:sqlite3_open(),它的實現位於main.c檔案中,如下:
int sqlite3_open(const char *zFilename, sqlite3 **ppDb)
{
return openDatabase(zFilename, ppDb, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);
}
當串連一個在磁碟上的資料庫,如果資料庫檔案存在,SQLite開啟一個檔案;如果不存在,SQLite會假定你想建立一個新的資料庫。在這種情況下,SQLite不會立即在磁碟上建立一個檔案,只有當你向資料庫寫入資料時才會建立檔案,比如:建立表、視圖或者其它資料庫物件。如果你開啟一個資料,不做任何事,然後關閉它,SQLite會建立一個檔案,只是一個空檔案而已。
另外一個不立即建立一個新檔案的原因是,一些資料庫的參數,比如:編碼,頁面大小等,只在在資料庫建立前設定。預設情況下,頁面大小為1024位元組,但是你可以選擇512-32768位元組之間為 2冪數的數字。有些時候,較大的頁面能更有效處理大量的資料。
(2) 執行事務(Perform transactions):
all commands are executed within transactions。預設情況下,事務自動認可,也就是每一個SQL語句都在一個獨立的事務下運行。當然也可以通過使用BEGIN..COMMIT手動提交事務。
(3) 中斷連線(Disconnect from the database):
主要是關閉資料庫的檔案。

1.5.2、執行Prepared Query
前面提到,預先處理查詢(Prepared Query)是SQLite執行所有SQL命令的方式,包括以下三個過程:
(1) Prepared Query:
分析器(parser),分詞器(tokenizer)和代碼產生器(code generator)把SQL Statement編譯成VDBE位元組碼,編譯器會建立一個statement控制代碼(sqlite3_stmt),它包括位元組碼以及其它執行命令和遍曆結果集的所有資源。
相應的C API為sqlite3_prepare(),位於prepare.c檔案中,如下:
int sqlite3_prepare(
sqlite3 *db, /* Database handle. */
const char *zSql, /* UTF-8 encoded SQL statement. */
int nBytes, /* Length of zSql in bytes. */
sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */
const char **pzTail /* OUT: End of parsed string */
){
int rc;
rc = sqlite3LockAndPrepare(db,zSql,nBytes,0,ppStmt,pzTail);
assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */
return rc;
}
(2) Execution:
虛擬機器執行位元組碼,執行過程是一個步進(stepwise)的過程,每一步(step)由sqlite3_step()啟動,並由VDBE執行一段位元組碼。由sqlite3_prepare編譯位元組代碼,並由sqlite3_step()啟動虛擬機器執行。在遍曆結果集的過程中,它返回SQLITE_ROW,當到達結果末尾時,返回SQLITE_DONE。
(3) Finalization:
VDBE關閉statement,釋放資源。相應的C API為sqlite3_finalize()。

通過可以更容易理解該過程:

文章來自:

http://www.cnblogs.com/hustcat/archive/2009/02/13/1390340.html 感謝原作者:MrDB

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.