SQLite剖析之功能特性


  SQLite是遵守ACID的輕型數據庫引擎,它包含在一個相對較小的C庫中。它是D.RichardHipp創建的公有領域項目。不像常見的客戶端/服務器結構范例,SQLite引擎不是一個與程序通信的獨立進程,而是連接到程序中成為它的一個主要部分。所以主要的通信協議是在編程語言內的直接API調用。這在消耗總量、延遲時間和整體簡單性上有積極的作用。整個數據庫(定義、表、索引和數據本身)都在宿主主機上存儲在一個單一的文件中。其簡單的設計是通過在開始一個事務的時候鎖定整個數據文件而完成的。

一、特性
    (1)支持原子的、一致的、獨立和持久 (ACID) 的事務,即使在系統崩潰或電源斷電后也能保持數據完整性。
    (2)零配置 – 無需安裝和管理配置。
    (3)實現多數SQL92標准(但不是全部)。對SQL92標准的支持包括ACID事務、索引、約束、觸發和查看等。不支持外鍵約束,授權和收回權限等。
    (4)一個完整的數據庫存儲在單一的跨平台的文件中。
    (5)支持2TB大小的數據庫和GB級大小的字符串和二進制對象。
    (6)足夠小,到3.7.14版忽略掉注釋大約6.5萬行代碼。
    (7)對大部分普通的數據庫操作,比很多流行的客戶/服務器模式的數據庫都要快。
    (8)簡單、易使用的API。
    (9)使用ANSI-C編寫。支持大多數語言的綁定,如C++, PHP, Python, Perl, Java, C#, Tcl, Rails, Delphi, COM/VB DLL, Objective-C等等,還有ODBC接口。
    (10)良好注釋的源代碼,並且有着100%的測試覆蓋率。
    (11)所有源代碼包含在一個單一的ANSI-C源文件中,很容易嵌入到項目中。
    (12)自包含:沒有外部依賴。
    (13)跨平台:支持Unix(Linux, Mac OS-X, Android, iOS),Windows(Win32, WinCE, WinRT),也很容易移植到其他系統上。
    (14)源代碼屬於公有領域,可用於任何用途,包括商業應用。
    (15)附帶一個管理SQLite數據庫的命令行工具。
  SQLite的數據庫權限只依賴於文件系統,沒有用戶帳戶的概念。SQLite有數據庫級鎖定,沒有網絡服務器,並且可以實現多數SQL92標准(但不是全部)。SQL92標准的其他一些主要功能是外鍵和檢查限制。SQLite通過數據庫級上的獨占性和共享鎖定來實現獨立事務處理。這意味着多個進程和線程可以在同一時間從同一數據庫讀取數據,但只有一個可以寫入數據。在某個進程或線程向數據庫執行寫入操作之前,必須獲得獨占鎖定。在發出獨占鎖定后,其他的讀或寫操作將不會再發生。
  SQLite的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它占用資源率非常低,在嵌入式設備中,可能只需幾百K的內存就足夠。目前SQLite被廣泛地用於多個產品,包括Adobe Photoshop, Airbus, Dropbox, Firefox, Thunderbird, Flame, Google的很多項目,McAfree,Microsoft的游戲項目,PHP語言,Python語言,Skype,Toshiba的很多項目,等等。
  SQLite還非常健壯,其創建者保守地估計SQLite可以處理每天負擔多達10000次點擊率的Web站點,並且SQLite有時候可以處理10倍於上述數字的負載。


二、數據類型
  SQLite是無類型(Typelessness)的,這意味着你可以保存任何類型的數據到你所想要保存的任何表的任何列中,無論這列聲明的數據類型是什么,對於SQLite來說對字段不指定類型是完全有效的(只有在一種情況下不是,即在字段類型為”Integer Primary Key”時)。如:
  Create Table ex1(a, b, c);
  實際上SQLite不支持靜態數據類型,而是使用列關系。這意味着它的數據類型不具有表列屬性,而具有數據本身的屬性。當某個值插入數據庫時,SQLite將檢查它的類型。如果該類型與關聯的列不匹配,則SQLite會嘗試將該值轉換成列類型。如果不能轉換,則該值將作為其本身具有的類型存儲。
  誠然SQLite允許忽略數據類型,但是仍然建議在你的Create Table語句中指定數據類型。因為數據類型對於你和其他的程序員交流,或者你准備換掉你的數據庫引擎時能起到一個提示或幫助的作用。 SQLite支持常見的數據類型,包括NULL、INTEGER、REAL、TEXT和BLOB數據類型。如: 

CREATE TABLE ex2(  
  a VARCHAR(10),  
  b NVARCHAR(15),  
  c TEXT,  
  d INTEGER,  
  e FLOAT,  
  f BOOLEAN,  
  g CLOB,  
  h BLOB,  
  i TIMESTAMP,  
  j NUMERIC(10,5)  
  k VARYING CHARACTER (24),  
  l NATIONAL VARYING CHARACTER(16)  
);   

 

三、功能
    SQLite雖然很小巧,但是支持的SQL語句不會遜色於其他開源數據庫,它支持的SQL包括:

aggregate functions: avg(X), count(X), count(*), group_concat(X), group_concat(X,Y), max(X), min(X), sum(X), total(X).
ALTER TABLE
ANALYZE
ATTACH DATABASE
BEGIN TRANSACTION
comment
COMMIT TRANSACTION
core functions: abs(X), changes(), coalesce(X,Y,...), glob(X,Y), ifnull(X,Y), hex(X), last_insert_rowid(), length(X), like(X,Y), like(X,Y,Z), load_extension(X), load_extension(X,Y), lower(X), ltrim(X), ltrim(X,Y), max(X,Y,...), min(X,Y,...), nullif(X,Y), quote(X), random(), randomblob(N), replace(X,Y,Z), round(X), round(X,Y), rtrim(X), rtrim(X,Y), soundex(X), sqlite_compileoption_get(N), sqlite_compileoption_used(X), sqlite_source_id(), sqlite_version(), substr(X,Y,Z), substr(X,Y), total_changes(), trim(X), trim(X,Y), typeof(X), upper(X), zeroblob(N).
CREATE INDEX
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
CREATE VIRTUAL TABLE
date and time functions: date(), time(), datetime(), julianday(), strftime().
DELETE
DETACH DATABASE
DROP INDEX
DROP TABLE
DROP TRIGGER
DROP VIEW
END TRANSACTION
EXPLAIN
expression
INDEXED BY    
INSERT
keywords
ON CONFLICT clause
PRAGMA
REINDEX
RELEASE SAVEPOINT
REPLACE
ROLLBACK TRANSACTION
SAVEPOINT
SELECT
UPDATE
VACUUM

    同時它還支持事務處理功能等等。某種程度上SQLite有點像Microsoft的Access,都是文件型數據庫,一個數據庫就是一個文件,在這個文件中可建立多張表,可以建立索引、觸發器等。備份這個文件就備份了整個數據庫。但是,SQLite支持跨平台,操作簡單,能夠使用很多語言直接創建數據庫,而不像Access需要Office的支持。

 

四、管理SQLite

  SQLite附帶一個命令行管理工具。通過數據庫名稱可以調用此命令行程序,並且可以按照下面的方式創建新的數據庫和表

C:\Users\Kim>sqlite3 alf.db  
SQLite version <%版本號%> 2016-08-28 20:11:36  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> .tables  
sqlite> create table mytable(name varchar(40), age smallint);  
sqlite> insert into mytable values('Jack-Zhou', 23);  
sqlite> select * from mytable;  
Jack-Zhou|23  
sqlite> .tables  
mytable  
sqlite> .schema  
CREATE TABLE mytable(name varchar(40), age smallint);  
sqlite>  

  上面創建一個alf數據庫,在其中創建一個表mytable,插入一條數據;而后列出數據庫中的所有表和模式。
  SQLite還附帶一個命令行數據庫分析器,該分析器允許您顯示關於任何SQLite數據庫當前狀態的詳細信息

C:\Users\Kim>sqlite3_analyzer alf.db  
/** Disk-Space Utilization Report For alf.db  
  
Page size in bytes.................... 1024  
Pages in the whole file (measured).... 2  
Pages in the whole file (calculated).. 2  
Pages that store data................. 2          100.0%  
Pages on the freelist (per header).... 0            0.0%  
Pages on the freelist (calculated).... 0            0.0%  
Pages of auto-vacuum overhead......... 0            0.0%  
Number of tables in the database...... 2  
Number of indices..................... 0  
Number of named indices............... 0  
Automatically generated indices....... 0  
Size of the file in bytes............. 2048  
Bytes of user payload stored.......... 13           0.63%  
  
*** Page counts for all tables with their indices ********************  
  
MYTABLE............................... 1           50.0%  
SQLITE_MASTER......................... 1           50.0%  
  
*** All tables *******************************************************  
  
Percentage of total database.......... 100.0%  
Number of entries..................... 2  
Bytes of storage consumed............. 2048  
Bytes of payload...................... 91           4.4%  
Average payload per entry............. 45.50  
Average unused bytes per entry........ 916.50  
Fragmentation.........................   0.0%  
Maximum payload per entry............. 78  
Entries that use overflow............. 0            0.0%  
Primary pages used.................... 2  
Overflow pages used................... 0  
Total pages used...................... 2  
Unused bytes on primary pages......... 1833        89.5%  
Unused bytes on overflow pages........ 0  
Unused bytes on all pages............. 1833        89.5%  
  
*** Table MYTABLE ****************************************************  
  
Percentage of total database..........  50.0%  
Number of entries..................... 1  
Bytes of storage consumed............. 1024  
Bytes of payload...................... 13           1.3%  
Average payload per entry............. 13.00  
Average unused bytes per entry........ 999.00  
Maximum payload per entry............. 13  
Entries that use overflow............. 0            0.0%  
Primary pages used.................... 1  
Overflow pages used................... 0  
Total pages used...................... 1  
Unused bytes on primary pages......... 999         97.6%  
Unused bytes on overflow pages........ 0  
Unused bytes on all pages............. 999         97.6% 

  由於完全能夠使用命令行界面來管理數據庫,因此它可以為數據庫管理員帶來很大的方便。當然還有許多優秀的第三方SQLite管理工具,如基於QT的SQLiteMan,Firefox插件SQLite Manager,SQLiteSpy等等。

  另外,備份SQLite數據庫有兩種方法。如果數據庫沒有處於使用狀態,則可以直接將數據庫文件復制到安全位置;如果數據庫正在使用中,則應從命令行界面使用.dump命令(.dump命令也可以用於備份數據庫表),創建一個包含必要命令和數據的文件,從而重新創建數據庫:

C:\Users\Kim>sqlite3 alf.db  
SQLite version 3.7.14 2012-09-03 15:42:36  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> .dump  
PRAGMA foreign_keys=OFF;  
BEGIN TRANSACTION;  
CREATE TABLE mytable(name varchar(40), age smallint);  
INSERT INTO "mytable" VALUES('Jack-Zhou',23);  
COMMIT;  
sqlite>

 

五、不支持的SQL特性
  相對於試圖列出SQLite支持的所有SQL92特性,只列出不支持的部分要簡單得多。下面列出的就是SQLite所不支持的SQL92特性(按列表的順序關系,接近列表頂部的特性更可能在不遠的將來加入):
    (1)RIGHT OUTER JOIN和FULL OUTER JOIN:已經實現了LEFT OUTER JOIN,但還沒實現RIGHT OUTER JOIN和FULL OUTER JOIN。
    (2)完整的ALTER TABLE支持:只支持ALTER TABLE命令的RENAME TABLE和ADD COLUMN操作。 其他ALTER TABLE操作如DROP COLUMN、ALTER COLUMN、ADD CONSTRAINT等等均被忽略。
    (3)完整的觸發器支持:支持FOR EACH ROW觸發器,但不支持FOR EACH STATEMENT觸發器。
    (4)可寫視圖:SQLite中的視圖是只讀的。你不可以在視圖上執行DELETE、INSERT或UPDATE。但是你可以創建一個試圖在視圖上DELETE、INSERT、UPDATE時觸發的觸發器,然后在觸發器中完成你所需要的工作。
    (5)GRANT和REVOKE:由於SQLite讀和寫的是一個普通的磁盤文件,因此唯一可以獲取的權限就是操作系統的標准文件訪問權限。一般在客戶機/服務器架構的關系型數據庫系統上能找到的GRANT和REVOKE命令,但對於一個嵌入式數據庫引擎來說是沒有意義的,因此沒有實現。


六、應用場合
    SQLite不同於其他大部分的SQL數據庫引擎,因為它的首要設計目標就是簡單化:
    * 易於管理
    * 易於使用
    * 易於嵌入其他大型程序
    * 易於維護和配置
    許多人喜歡SQLite就是因為它的小巧和快速。但是這些特性只是它的部分優點,使用者還會發現SQLite是非常穩定的。出色的穩定性源於它的簡單,越簡單就越不容易出錯。除了上述的簡單、小巧和穩定性外,最重要的在於SQLite力爭做到簡單化。
    簡單化在一個數據庫引擎中可以說是一個優點,但也可能是個缺點,主要決定於你想要做什么。為了達到簡單化,SQLite省略了一些人們認為比較有用的特性,例如高並發性、嚴格的存取控制、豐富的內置功能、存儲過程、復雜的SQL語言特性、XML以及Java的擴展、超大的萬億級別的數據測量等等。如果你需要使用上述的這些特性並且不介意它們的復雜性,那么SQLite也許就不適合你了。SQLite沒有打算作為一個企業級的數據庫引擎,也並不打算和Oracle或者PostgreSQL競爭。
    僅憑經驗來說SQLite適用於以下場合:當你更看中簡單的管理、使用和維護數據庫,而不是那些企業級數據庫提供的不計其數的復雜功能的時候,使用SQLite是一個比較明智的選擇。事實也證明,人們在許多情況下已經清楚的認識到簡單就是最好的選擇。
    SQLite最佳試用場合:
    (1)應用程序文件格式
    SQLite作為桌面應用程序的本地磁盤文件格式取得了巨大成功。例如金融分析工具、CAD包、檔案管理程序等等。一般的數據庫打開操作需要調用sqlite3_open()函數,並且標記一個顯式本地事務的起始點(BEGIN TRANSACTION)來保證以獨占的方式得到文件的內容。文件保存將執行一個提交(COMMIT)同時標記另一個顯式本地事務起始點。這種事務處理的作用就是保證對於應用程序數據文件的更新是原子的、持久的、獨立的和一致的。
    數據庫里可以加入一些臨時的觸發器,用來把所有的改變記錄在一張臨時的取消/重做日志表中。當用戶按下取消/重做按鈕的時候這些改變將可以被回滾。這項技術實現一個無限級的取消/重做功能只需要編寫很少的代碼。
    (2)嵌入式設備和應用軟件
    因為SQLite數據庫幾乎不需要管理,因此對於那些無人值守運行或無人工技術支持的設備或服務,SQLite是一個很好的選擇。SQLite能很好的適用於手機、PDA、機頂盒,以及其他儀器。作為一個嵌入式數據庫它也能夠很好的應用於客戶端程序。
    (3)網站
    作為數據庫引擎SQLite適用於中小規模流量的網站(也就是說99.9%的網站)。SQLite可以處理多少網站流量在於網站的數據庫有多大的壓力。通常來說,如果一個網站的點擊率少於100000次/天的話,SQLite是可以正常運行的。100000次/天是一個保守的估計,不是一個准確的上限。事實證明,即使是10倍的上述流量的情況下SQLite依然可以正常運行。
    (4)替代某些特別的文件格式
    許多程序使用fopen()、fread()或fwrite()函數創建和管理一些自定義的文件用來保存數據。使用SQLite替代這些自定義的文件格式將是一種很好的選擇。
    (5)內部的或臨時的數據庫
    對於那些有大量的數據需要用不同的方式篩選分類的程序,相對於編寫同樣功能的代碼,如果你把數據讀入一個內存中的SQLite數據庫,然后使用連接查詢和ORDER BY子句按一定的順序和排列提取需要的數據,通常會更簡單和快速。按照上述的方法使用內嵌的SQLite數據庫將會使程序更富有靈活性,因為添加新的列或索引不用重寫任何查詢語句。
    (6)命令行數據集分析工具
    有經驗的SQL用戶可以使用SQLite命令行程序去分析各種混雜的數據集。原始數據可以從CSV文件(逗號分隔值文件)中導入,然后被切分產生無數的綜合數據報告。可能的用法包括網站日志分析、運動統計分析、編輯規划標准、分析試驗結果。
    當然也可以用企業級的客戶端/服務器數據庫來做同樣的事情。在這種情況下使用SQLite的好處是:SQLite的部署更為簡單並且結果數據庫是一個單獨的文件,你可以把它存儲在軟盤或者優盤或者直接通過email發給同事。
    (7)在Demo或測試版的時候作為企業級數據庫的替代品
    如果你正在編寫一個使用企業級數據庫引擎的客戶端程序,使用一個允許你連接不同SQL數據庫引擎的通用型數據庫后台將是很有意義的。其更大的意義在於將SQLite數據庫引擎靜態的連接到客戶端程序當中,從而內嵌SQLite作為混合的數據庫支持。這樣客戶端程序就可以使用SQLite數據庫文件做獨立的測試或者驗證。
    (8)數據庫教學
    因為SQLite的安裝和使用非常的簡單(安裝過程幾乎忽略不計,只需要拷貝SQLite源代碼或sqlite.exe可執行文件到目標主機,然后直接運行就可以),所以它非常適合用來講解SQL語句。同學們可以非常簡單地創建他們喜歡的數據庫,然后通過電子郵件發給老師批注或打分。對於那些感興趣怎樣實現一個關系型數據庫管理系統(RDBMS)的高層次的學生, 按照模塊化設計且擁有很好的注釋和文檔的SQLite源代碼,將為他們打下良好的基礎。這並不是說SQLite就是如何實現其他數據庫引擎的精確模型,但是很適合學生們了解SQLite是如何快速工作的,從而掌握其他數據庫系統的設計實現原則。
    (9)試驗SQL語言的擴展
    SQLite簡單且模塊化的設計使得它可以成為一個用來測試數據庫語言特性或新想法的優秀的原型平台。 

   
七、哪些場合適合使用其他的關系型數據庫管理系統(RDBMS)
    (1)客戶端/服務器程序
  如果你有許多的客戶端程序要通過網絡訪問一個共享的數據庫,你應當考慮用一個客戶端/服務器數據庫來替代SQLite。SQLite可以通過網絡文件系統工作,但是因為和大多數網絡文件系統都存在延時,因此執行效率不會很高。此外大多數網絡文件系統在實現文件邏輯鎖的方面都存在着bug(包括Unix和Windows)。如果文件鎖沒有正常的工作,就可能出現在同一時間兩個或更多的客戶端程序更改同一個數據庫的同一部分,從而導致數據庫出錯。因為這些問題是文件系統執行的時候本質上存在的bug,因此SQLite沒有辦法避免它們。
  好的經驗告訴我們,應該避免在許多計算機需要通過一個網絡文件系統同時訪問同一個數據庫的情況下使用SQLite。
    (2)高流量網站
  SQLite通常情況下用作一個網站的后台數據庫可以很好的工作。但是如果你的網站的訪問量大到你開始考慮采取分布式的數據庫部署,那么你應當毫不猶豫的考慮用一個企業級的客戶端/服務器數據庫來替代SQLite。
    (3)超大的數據集
  當你在SQLite中開始一個事務處理的時候(事務處理會在任何寫操作發生之前產生,而不是必須要顯示的調用BEGIN...COMMIT),數據庫引擎將不得不分配一小塊臟頁(文件緩沖頁面)來幫助它自己管理回滾操作。每1MB的數據庫文件SQLite需要256字節。對於小型的數據庫這些空間不算什么,但是當數據庫增長到數十億字節的時候,緩沖頁面的尺寸就會相當的大了。如果你需要存儲或修改幾十GB的數據,你應該考慮用其他的數據庫引擎。
    (4)高並發訪問
  SQLite對於整個數據庫文件進行讀取/寫入鎖定。這意味着如果任何進程讀取了數據庫中的某一部分,其他所有進程都不能再對該數據庫的任何部分進行寫入操作。同樣的,如果任何一個進程在對數據庫進行寫入操作,其他所有進程都不能再讀取該數據庫的任何部分。對於大多數情況這不算是什么問題,在這些情況下每個程序使用數據庫的時間都很短暫,並且不會獨占,這樣鎖定至多會存在十幾毫秒。但是如果有些程序需要高並發,那么這些程序就需要尋找其他的解決方案了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM