2013年7月23日 星期二

SQLite 學習筆記之二 - 其他特色

一、Virtual Table
  1. Virtual Table 是 SQLite 其中一項功能強大的特色,開發者可透過此機制來擴充 SQLite 的資料來源(Data Source)。
  2. 例如,開發者可先以 C 語言,遵循 SQLite 的規格文件,實作一個模組(module),將外部檔案載入進 SQLite (如 CSV 檔或 Web Log 檔) ,成為一個虛擬的 table、然後使用 SQL 對該 table 進行操作。
  3. 實作 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  結構。
  4. 使用以下指令來載入 Virtual Table:
        CREATE VIRTUAL TABLE tablename USING modulename;
        CREATE VIRTUAL TABLE tablename USING modulename(arg1, arg2, ...); 
  5. 自 SQLite 3.6.17 以後,Virtual Table 也可以使用「shared cache mode 」了。

二、In-Memory DB
  1. SQLite 通常是將資料庫儲存在一個檔案中。但是在某些狀況下,您可能希望將其儲存在記憶體中。
  2. 要讓 SQLite 將 DB 完全存在記憶體中,可在開啟資料庫時,使用特殊檔名「:memory:」來做為檔案名稱。在 shell 進入 In-Memory DB 的方式有以下兩種:
    • ATTACH DATABASE ':memory:' AS aux1;
    • ATTACH DATABASE 'file::memory:' AS aux1;
  3. 此時,SQLite 不會在磁碟上開啟任何檔案,而是在記憶體中建立一個新的 DB。而當資料庫連線關閉後,該 DB 就會消失。每一個 :memory: 資料庫都是唯一、各自獨立的。所以,如果用檔案名稱「:memory:」開啟兩個 DB 連線,則會建立兩個新的 in-memory DB(並各自擁有自己的 private cache)。
  4. 如果希望在同一個 process、兩個以上的 DB 連線開啟同一個 in-memory DB,則可以使用下列的方式:
      ATTACH DATABASE 'file::memory:?cache=shared' AS aux1;
    同樣地,當最後一個 DB 連線關閉時,此 DB 會被刪除、記憶體會被回收。
  5. 如果希望在同一個 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。
  6. In-Memory DB 可使用的 journal mode 只有「MEMORY」和「OFF」兩種。
三、Temporary DB
  1. 如果檔案名稱「空字串」,那 SQLite 就會使用一個臨時檔來儲存該 DB:
     ATTACH DATABASE '' AS aux3; 
  2. 就像 in-memory DB 一樣,每次使用這個指令,SQLite 就會建立不同的臨時檔案,連到不同臨時 DB 的兩個資料庫連線,各自擁有自己的 DB。當原來建立 DB 的連線關閉後,臨時 DB 就會自動被刪除。
  3. 即使 SQLite 會為每個臨時 DB 配置一個檔案,但實務上,臨時 DB 還是會先被儲存在記憶體的分頁 cache 之中,因此與 in-memory DB 稍有不同。差別在於:「in-memory DB」從頭到尾都一直存在記憶體之中,但「臨時 DB」在資料庫變大或記憶體不夠用時就會被寫入到磁碟。
四、其他重要特色
  1. 全文索引(Full Text Search),請參考 SQLite 官網文件「SQLite FTS3 and FTS4 Extensions」。
  2. R-Trees,請參考 SQLite 官網文件「R-Trees」。


沒有留言:

張貼留言