PostgreSQL アンカンファレンス参加メモ
イベントについて
セミナー室での小規模ですが DB ベンダーの方が参加したりと有識者豊富なイベントでした
OSS-DB Gold 取得を直近目指しているので興味あって参加しました
市ヶ谷@東京 開催です
午前もくもく会いって午後時間空いたので寄り道してきました
アプリケーションの技術よりも原理とかを追うのが好きです
知見
DocumentDB について
AWS DocumentDB が最初に思いつきそうですが、Microsoft が 2025年 1月に発表しました。
PostgreSQL DB 上での NoSQL です。
OSS の NoSQL といえば MongoDB が筆頭格でしたが、2018年に SSPL ライセンスとしました。
SSPL: (ちゃんと把握できていないですが)かなり制約の厳しいライセンス. らしい
AWS DocumentDB と名前被っているのが厄介ですね
PostgreSQL に DocumentDB が立てれて何が嬉しいのか、ですが、
嬉しいというより、MongoDB のライセンスが変化した結果、選択肢として残るのが PostgreSQL DocumentDB、という現状なのかなと思います。
NoSQL の OSS はいくつかあるようですが、Document 指向 x NoSQL となると
- MongoDB
- PostgreSQL DocumentDB
の選択肢があり、MongoDB のライセンスが厳しい以上、残る選択肢が PostgreSQL DocumentDB しかない、という点で価値があるんじゃないか、という見解です。
今回のDocumentDBではNoSQLの標準となることを目標にオープンソース(MITライセンス)で公開されています。
ref: https://zenn.dev/tzkoba/articles/f34277f9663ce8
物理/論理レプリケーション について
pstgresql のレプリケーションについて解説記事
レプリケーションの技術は全然知らないので、ここから先は「らしい」ばかりです
PostgreSQL には 論理/物理 レプリケーションがあるらしい
物理レプリケーションは、その仕組み的に、プライマリDB とレプリカDB は整合性が担保されるらしい
論理レプリケーションは、レプリカDB に対して書き込み等を行ったりが可能なので、整合性の破綻が可能.
この論理レプリケーションの整合性を担保する方法は何か、という話でした
制約として
- DB 間の帯域幅は狭い
- 常にデータ更新があるため 静止点 が無い
という中で、レコードごとにハッシュ化してその結果を比較する、という方法を提案されていました。
select md5($table_name) from $table_name;
select 句にテーブル名を宛てることが可能なんですね
postgres=# select * from orders;
order_id | customer_id | order_date | total_amount | status | shipping_address_id
----------+-------------+----------------------------+--------------+-----------+---------------------
1 | 1 | 2025-10-04 05:36:52.626598 | 46300.00 | Shipped | 1
2 | 2 | 2025-10-04 05:36:52.629059 | 3500.00 | Delivered | 3
postgres=# select orders from orders;
orders
--------------------------------------------------------
(1,1,"2025-10-04 05:36:52.626598",46300.00,Shipped,1)
(2,2,"2025-10-04 05:36:52.629059",3500.00,Delivered,3)
postgres=# select md5(orders::text) from orders;
md5
----------------------------------
e5c9ccbc312b915a4d95fd11e18252e6
b82f5436e1747c6f9d4ec4dd86d2bd21
パフォーマンスチューニングについて
PostgreSQL の実行計画に関わる n_distinct
について、まずはその計算式について紹介されていました
ただし PostgreSQL のこの計算式は甘いところが多く、実際の値とはかけ離れていた。
その結果、効率の悪い実行計画が採用されてしまっていた。
(レコード数 1000万 has 4億 レコード くらいの規模感)
対応として
- hint で教える
- ORM によっては対応できない
- stas target を大きくする
- が、あまり改善されず
-
n_distinct
を手動で変更する
意図しない実行計画になったときの対策について、さまざまな意見交換がありました。
hint 使ったり view 使ったり, ...
得られた TODO
学ぶことばかり
- postgres DB のレプリケーションについて調査
- OSS ライセンスの種類について改めて調査
- NoSQL の下記の種類それぞれの特性について調査
- ドキュメント指向型
- キーバリュー型
- ワイドカラムストア
- グラフ型
- seq scan とは
- DB の
実行計画
について - n_distinct について
- 計算式把握
- stats target とは
Discussion