テック技報最新号へ →
インフラ

DuckDB Quack: 別の DuckDB を ATTACH してリモート DB として使う

Quack 拡張で、ある DuckDB プロセスをサーバにし、別の DuckDB から ATTACH 'quack:host' でつなぐ。リモートのテーブルをローカルと同じ SQL で読み書きできる。

@publickey · 2026-10-13
#infra#database#duckdb#olap#analytics

どんなときに使う?

  • サーバ上の DuckDB のデータを、複数のマシンやアプリから分析したい
  • 複数のクライアントから 1 つの DuckDB に書き込みを集めたい(同時書き込み対応とされる)
  • 大量の行をまとめて取り出したい(開発チームの比較では 6000 万行の転送が 5 秒以内で、PostgreSQL や Arrow Flight より速い)

やり方

サーバ側(DuckDB #1):

sql
CALL quack_serve('quack:localhost', token = 'super_secret');
CREATE TABLE hello AS FROM VALUES ('world') v(s);

クライアント側(DuckDB #2):

sql
CREATE SECRET (TYPE quack, TOKEN 'super_secret');
ATTACH 'quack:localhost' AS remote;
FROM remote.hello;                 -- リモートのテーブルを読む
FROM remote.hello WHERE s = 'world';  -- フィルタはリモートで実行される
  • 拡張は初回利用時に自動で入る(明示するなら INSTALL quack; LOAD quack;)
  • URI は quack:host[:port]、既定ポートは 9494(quack://localhost も同じ)
  • 一度だけ投げるなら quack_query(uri, query) でもよい
  • トランザクション(BEGIN; ... COMMIT;)はリモートに転送される。外すときは DETACH

注意点

  • まだ実験的(DuckDB 1.5 系)。プロトコルや関数名は変わりうる。正式版は DuckDB v2.0(2026 年秋予定)
  • サーバは既定で localhost だけで待ち受ける。外から受けるには allow_other_hostname => true が必要。外に出すなら必ずトークンを設定し、ネットワークも閉じる(Tailscale などの中に置く)
  • ローカル以外への ATTACH は既定で HTTPS。平文 HTTP のリモートには DISABLE_SSL true が必要になるが、公開網では使わない
  • DuckLake のカタログとしてリモート DuckDB を使う統合も予定されている

出典

関連

X の元の投稿を開く