Postgresで動いていた遅い集計クエリをduckdb(Motherduck)に移す際のポイント
as of 2025
想定としてはpostgresのテーブルをそのまま (一部変形)対応するduckdbのテーブルに放り込み、duckdbをクエリする形
一部変形 = 後述するjsonbのフィールドをカラムに
基本的にはduckdbはpostgresのシンタックスを踏襲している
が、そうでないところもある
そのままの変換は多分一発では動かない
jsonb型
duckdbはjsonをパースしてごにょごにょするヘルパーがあるだけで実態はtext
そのままにするとpostgresのjsonb型の時より遅くなってしまったりする
著者の場合は動的にjsonのフィールドを普通のカラムに展開することにした
group byの動作
duckdbはgroup by allが使えるので便利
duckdbは集約操作をしないカラムはgroup byに指定する必要がある
postgresは必ずしもそうではない
date_trunc
タイムゾーン引数がない
code:date_trunc.sql
// 1. Date Truncation with Timezone
PostgreSQL: date_trunc('month', column, 'America/Chicago') // 3 params
DuckDB: date_trunc('month', column) // 2 params, no timezone
tuple null check
code:tuple_null.sql
// 2. Tuple NULL Checks
PostgreSQL: (col1, col2, col3) IS NOT NULL // All must be NOT NULL
DuckDB: col1 IS NOT NULL AND col2 IS NOT NULL AND... // Explicit AND required