- Virtual Table 是 SQLite 其中一項功能強大的特色,開發者可透過此機制來擴充 SQLite 的資料來源(Data Source)。
- 例如,開發者可先以 C 語言,遵循 SQLite 的規格文件,實作一個模組(module),將外部檔案載入進 SQLite (如 CSV 檔或 Web Log 檔) ,成為一個虛擬的 table、然後使用 SQL 對該 table 進行操作。
- 實作 Virtual Table 模組的步驟:
- 實作所有必要的 methods,如:xCreat()、xConnect()、xDisconnect()、xDestroy()、xBestIndex()、xOpen()、xClose()、xFilter()、xNext()、xEof()、xRowid()、xColumn()…等等。
- 創建一個 sqlite3_module 結構的實體(包含所有步驟 1 函式指標 )。
- 使用 sqlite3_create_module() 或 sqlite3_create_module_v2() 來註冊上述的 sqlite3_module 結構。
- 使用以下指令來載入 Virtual Table:
CREATE VIRTUAL TABLE tablename USING modulename;
CREATE VIRTUAL TABLE tablename USING modulename(arg1, arg2, ...); - 自 SQLite 3.6.17 以後,Virtual Table 也可以使用「shared cache mode 」了。
二、In-Memory DB
- SQLite 通常是將資料庫儲存在一個檔案中。但是在某些狀況下,您可能希望將其儲存在記憶體中。
- 要讓 SQLite 將 DB 完全存在記憶體中,可在開啟資料庫時,使用特殊檔名「:memory:」來做為檔案名稱。在 shell 進入 In-Memory DB 的方式有以下兩種:
- ATTACH DATABASE ':memory:' AS aux1;
- ATTACH DATABASE 'file::memory:' AS aux1;
- 此時,SQLite 不會在磁碟上開啟任何檔案,而是在記憶體中建立一個新的 DB。而當資料庫連線關閉後,該 DB 就會消失。每一個 :memory: 資料庫都是唯一、各自獨立的。所以,如果用檔案名稱「:memory:」開啟兩個 DB 連線,則會建立兩個新的 in-memory DB(並各自擁有自己的 private cache)。
- 如果希望在同一個 process、兩個以上的 DB 連線開啟同一個 in-memory DB,則可以使用下列的方式:
ATTACH DATABASE 'file::memory:?cache=shared' AS aux1;
同樣地,當最後一個 DB 連線關閉時,此 DB 會被刪除、記憶體會被回收。 - 如果希望在同一個 process、兩個以上的 DB 連線、各自開啟不同的 in-memory DB ,可以使用下列方式:
ATTACH DATABASE 'file:memdb1?mode=memory&cache=shared' AS aux1;
ATTACH DATABASE 'file:memdb2?mode=memory&cache=shared' AS aux2;
如果 in-memory DB 這樣命名,那各 DB 連線之間就可以共享其 cache。 - In-Memory DB 可使用的 journal mode 只有「MEMORY」和「OFF」兩種。
- 如果檔案名稱「空字串」,那 SQLite 就會使用一個臨時檔來儲存該 DB:
ATTACH DATABASE '' AS aux3; - 就像 in-memory DB 一樣,每次使用這個指令,SQLite 就會建立不同的臨時檔案,連到不同臨時 DB 的兩個資料庫連線,各自擁有自己的 DB。當原來建立 DB 的連線關閉後,臨時 DB 就會自動被刪除。
- 即使 SQLite 會為每個臨時 DB 配置一個檔案,但實務上,臨時 DB 還是會先被儲存在記憶體的分頁 cache 之中,因此與 in-memory DB 稍有不同。差別在於:「in-memory DB」從頭到尾都一直存在記憶體之中,但「臨時 DB」在資料庫變大或記憶體不夠用時就會被寫入到磁碟。
- 全文索引(Full Text Search),請參考 SQLite 官網文件「SQLite FTS3 and FTS4 Extensions」。
- R-Trees,請參考 SQLite 官網文件「R-Trees」。
沒有留言:
張貼留言