在網上看到韓國公司開發的一款GooseDB,
官方網站對它的介紹是DuckDB? 的功能擴展分支,具有服務器/客戶端、多會話和并發寫入支持,使用 PostgreSQL 有線協議(DuckDB?是 DuckDB 基金會的商標)
使用也很簡單,從下載網頁下載相應平臺二進制文件啟動服務端,
C:\d\goosedb>goosedb start
{"level":"info","msg":"===== GooseDB Freeware(For Non-Commercial Use Only) [read_write] ===== valid until: 2027-06-24 08:00:00 +0800 CST, owner: AnyBody =====","time":"2025-09-13T18:30:10+08:00"}
{"level":"info","msg":"MaxConnections = 10","time":"2025-09-13T18:30:10+08:00"}
{"level":"info","msg":"DuckDB !!read_write!! Mode)","time":"2025-09-13T18:30:10+08:00"}
{"level":"info","msg":"SET ieee_floating_point_ops = false","time":"2025-09-13T18:30:10+08:00"}
{"level":"info","msg":"SET autoload_known_extensions=1","time":"2025-09-13T18:30:10+08:00"}
{"level":"info","msg":"SET preserve_insertion_order = false","time":"2025-09-13T18:30:10+08:00"}
{"level":"info","msg":"ATTACH ':memory:' as memdb","time":"2025-09-13T18:30:10+08:00"}
{"level":"info","msg":"LOAD parquet","time":"2025-09-13T18:30:10+08:00"}
{"level":"info","msg":"LOAD json","time":"2025-09-13T18:30:10+08:00"}
{"level":"info","msg":"GooseDB v1.3.1.1 (DuckDB v1.3.1) build_date:2025-06-22","time":"2025-09-13T18:30:10+08:00"}
{"level":"info","msg":"goosedb listening on 0.0.0.0:1234","time":"2025-09-13T18:30:10+08:00"}
{"level":"info","msg":"restapi listening on 0.0.0.0:5678","time":"2025-09-13T18:30:10+08:00"}
{"level":"info","msg":"db-file: data\\goosedb.ddb, cfg-file: conf\\goosedb.cfg","time":"2025-09-13T18:30:10+08:00"}
{"level":"info","msg":"SET ieee_floating_point_ops = false","time":"2025-09-13T18:40:47+08:00"}
{"level":"info","msg":"SET autoload_known_extensions=1","time":"2025-09-13T18:40:47+08:00"}
{"level":"info","msg":"SET preserve_insertion_order = false","time":"2025-09-13T18:40:47+08:00"}
從啟動日志能看出它的默認數據文件和配置文件,可以參考文檔修改。
用psql客戶端連接即可。
\d\pg18\bin\psql -h 127.0.0.1 -U gooseadmin -d goosedb -p 1234
用戶 gooseadmin 的口令:psql (18beta1, 服務器 16.9)
輸入 "help" 來獲取幫助信息.goosedb=> select version();version
-----------------------------------------------------------------------------------------------------------------------------PostgreSQL 16.9 - (GooseDB 1.3.1.1) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-22), 64-bit
(1 行記錄)goosedb=> create table t as select * from generate_series(1,10000000)t(i);
CREATE
goosedb=> \timing on
啟用計時功能.
goosedb=> select count(*) from t group by round(log(i));count_star()
--------------28528466837723284605328460502846028
(8 行記錄)時間:32.029 ms
從1000萬數據的分組性能來看,和DuckDB沒有區別。
打開另一個客戶端
\d\pg18\bin\psql -h 127.0.0.1 -U gooseadmin -d goosedb -p 1234
用戶 gooseadmin 的口令:psql (18beta1, 服務器 16.9)
輸入 "help" 來獲取幫助信息.goosedb=> select count(*) from t;count_star()
--------------10000000
(1 行記錄)goosedb=> select count(*) from '\d\yellow_tripdata_2021-01.parquet';count_star()
--------------1369769
(1 行記錄)
確實能訪問前一個會話的內容,也能訪問客戶端本地的文件。
事務處理
在第一個客戶端建立一個帶有默認時間戳列的表,在另一個客戶端分別啟用和不用事務操作它。
客戶端1
C:\d>\d\pg18\bin\psql -h 127.0.0.1 -U gooseadmin -d goosedb -p 1234
用戶 gooseadmin 的口令:psql (18beta1, 服務器 16.9)
輸入 "help" 來獲取幫助信息.goosedb=> create table t2 (ts timestamp default current_localtimestamp(), a int);
CREATE
goosedb=> insert into t2(a) values(1);
INSERT 0 1
goosedb=> from t2;ts | a
-------------------------+---2025-09-14 08:18:39.386 | 1
(1 行記錄)goosedb=> select *,current_localtimestamp() c from t2;ts | a | c
-------------------------+---+-------------------------2025-09-14 08:18:39.386 | 1 | 2025-09-14 08:20:42.7042025-09-14 08:20:17.458 | 2 | 2025-09-14 08:20:42.704
(2 行記錄)goosedb=> select *,current_localtimestamp() c from t2;ts | a | c
-------------------------+---+-------------------------2025-09-14 08:18:39.386 | 1 | 2025-09-14 08:22:00.0492025-09-14 08:20:17.458 | 2 | 2025-09-14 08:22:00.049
(2 行記錄)goosedb=> select *,current_localtimestamp() c from t2;ts | a | c
-------------------------+---+-------------------------2025-09-14 08:18:39.386 | 1 | 2025-09-14 08:25:37.7862025-09-14 08:20:17.458 | 2 | 2025-09-14 08:25:37.7862025-09-14 08:21:37.85 | 3 | 2025-09-14 08:25:37.7862025-09-14 08:21:37.85 | 4 | 2025-09-14 08:25:37.786
(4 行記錄)
客戶端2
C:\Users\lt>\d\pg18\bin\psql -h 127.0.0.1 -U gooseadmin -d goosedb -p 1234
用戶 gooseadmin 的口令:psql (18beta1, 服務器 16.9)
輸入 "help" 來獲取幫助信息.goosedb=> from t2;ts | a
-------------------------+---2025-09-14 08:18:39.386 | 1
(1 行記錄)goosedb=> insert into t2(a) select 2;
INSERT 0 1
goosedb=> BEGIN TRANSACTION;
BEGIN
goosedb=*> insert into t2(a) select 3;
INSERT 0 1
goosedb=*> from t2;ts | a
-------------------------+---2025-09-14 08:18:39.386 | 12025-09-14 08:20:17.458 | 22025-09-14 08:21:37.85 | 3
(3 行記錄)goosedb=*> select current_localtimestamp() c;c
------------------------2025-09-14 08:21:37.85
(1 行記錄)goosedb=*> insert into t2(a) select 4;
INSERT 0 1
goosedb=*> from t2;ts | a
-------------------------+---2025-09-14 08:18:39.386 | 12025-09-14 08:20:17.458 | 22025-09-14 08:21:37.85 | 32025-09-14 08:21:37.85 | 4
(4 行記錄)goosedb=*> commit;
COMMIT
goosedb=>
可見默認不啟用事務,插入數據即提交,一個客戶端的修改立刻被另一個看到,而啟用事務后,在顯式提交前,其他客戶端看不到修改。
有一點不太明白,啟用事務后,時間仿佛停止了,插入第一條后又過了若干時間,select current_localtimestamp() c;
的值和插入第一條的時間一模一樣。查看DuckDB文檔知道,
current_localtimestamp()
Description Returns the current timestamp with time zone (at the start of the transaction).
它返回的是事務開始時間。
在psql客戶端上,在事務中,提示符前有一個*
符號提示。