DuckDB 是一種 OLAP 專用的嵌入式資料庫 (embedded database),某種程度來講,它就像是 SQLite 的 OLAP 版本。註:SQLite 是一種 OLTP 專用的嵌入式資料庫。
我曾經以為,聽完上述的說明之後,『多數人』就可以快速地掌握到 DuckDB 大概是什麼,並且立刻猜出,用 DuckDB 的話,就不用設定權限管理、帳號密碼,超方便。後來,我才發現,我以為的『多數人』只是用過 SQLite 的多數人。(笑~)
沒有使用過 SQLite 、對於嵌入式資料庫的概念不熟的讀者,在這邊不妨考慮用極簡的方式來理解 DuckDB 與使用它的理由。
1T
以下,幾乎沒有懸念,用 DuckDB 絕對跑得動,不需要使用雲端資料庫。這部分值得特別補充一下,DuckDB 的實作,率先應用了許多本來還只是在學術界的資料庫理論,也因此,它在效能上有了長足的改進。brew install duckdb
duckdb $local_db_filename
,就可以開始對資料庫做讀寫了。註:
duckdb
是 DuckDB CLI 的指令名稱。$local_db_filename
是你指定的檔名。日後,duckdb
就會以此檔案來儲存所有的資料庫裡的資料。特殊指令只能透過 DuckDB CLI 來使用,它是用來讓 DuckDB CLI 更好用而設計的。
.columns
以 Column-wise 的方式來顯示查詢結果.rows
以 Row-wise 的方式來顯示查詢結果.read [SQL_CMD_FILE]
SQL 指令寫在 [SQL_CMD_FILE]
檔案裡,讀入後執行.exit
離開 DuckDB 的 CLI要使用資料庫,除了使用標準的 SQL 查詢之外,我們也需要一些輔助指令,以取得與資料庫本身狀態相關的資訊。
DuckDB 會把上述這種「資料庫本身狀態相關的資訊」,以資料庫後設函數的形式,讓使用者可以查詢。使用者要查後設函數的輸出時,可以把函數名稱當作 table 來查。比方說:
select * from duckdb_tables;
顯示有哪些表 (tables)select * from duckdb_views;
顯示有哪些視圖 (views)select * from duckdb_schemas;
顯示有哪些命名空間 (schema)select * from duckdb_databases
顯示有哪些資料庫 (database)除了後設函數之外,DuckDB 的後設查詢 (meta queries),也相當有用:
SHOW TABLES
顯示本命名空間 (schema) 內,所有可以查詢的表 (table) 與視圖 (view)SHOW ALL TABLES
顯示現在已連接資料庫 (database) 與命名空間 (schema) 之內,所有可以查詢的表 (table) 與視圖 (view)DESCRIBE [TABLE]
顯示 TABLE
的定義還有一些重要的指令,它是一般 SQL 語句,非後設查詢,卻也對我們了解資料庫的狀態極為重要:
USE [DATABASE_NAME].[SCHEMA_NAME]
切換資料庫、或是同時切換資料庫與命名空間。參考資料
SELECT current_schema();
顯示正在使用中的命名空間 (schema) 。參考資料
讀者可能覺得,什麼事都硬要使用 terminal 還是太過頭了,有點太過於 1337 h4x0r
。DuckDB 也可以透過 DBeaver 來使用。
Metabase 有一點與 dbt 相似,它也可以連接多種的資料倉儲,而且是使用轉接器來連接。目前 Metabase 如果要連接 DuckDB 的話,必須手動安裝DuckDB 的轉接器 (driver)。參考這裡的安裝方法。
安裝方式:
app
這個資料夾下,下指令:java -jar metabase-v-0.xxx.jar
app/plugins
app/plugins
,這樣子就完成安裝了。到這邊為止,現代資料棧 (modern data stack) 應該在你的電腦已經安裝好大部分了,只差 EL tools 了:
在實務上的應用,有時候,我們也未必一定要使用專業的 EL tools 才能把資料灌入資料倉儲裡,比方說,許多的資料庫也都提供可以直接匯入外部的 csv 檔的指令。換言之,用低一點的標準來看,現代資料棧已經在你的電腦灌好囉!
version 1.0
,且根據 DuckDB 的說法:"The storage of DuckDB is not yet stable; newer versions of DuckDB cannot read old database files and vice versa. The storage will be stabilized when version 1.0 releases."