Open3

PostgreSQLがどういうものなのか調べる

ron4321ron4321

モチベーション

  • 社内でポスグレを使い始めたが、すごく詳しい人がいるわけではないのでトラブル時の対応がちょっと心配
    • MySQLだったらある程度なんとかなると思っているが、大分勝手が違いそう
  • アプリケーション作っていく時に便利な機能も沢山あると思うので、そのあたりも知っておいて共有できたらなーと

知りたいこと

  • 他のデータベースとの大きな違いは何なのか?
    • 追記型の良いところ
    • MySQLと運用で違うところ
  • ポスグレ自体がどういう仕組みで動いているのか?
    • 内部のアーキテクチャ
    • モニタリングすべき指標
  • プロダクト作るうえで便利になりそうなもの
    • マテビュー
    • Window関数
    • データ型(JSON型とかCHECK制約とか)
ron4321ron4321

ポスグレの基礎

https://gihyo.jp/dev/feature/01/dex_postgresql/0002

最初に押さえておくべきは、この辺りっぽい。

  • 追記型であることによりVACCUM(参照されないレコードデータのお掃除)、可視化マップ(参照されているかいないか)が必要
  • WAL (書き込みをバッファリングする仕組み、MySQLでいうredo logとかbinlogあたりのやつっぽい)
ron4321ron4321

追記型とは何なのか?

https://www.postgresql.jp/document/7.2/user/mvcc.html

多くのデータベースシステムでは、同時実行制御のためにロック機構を使用していますが、PostgreSQLではデータ整合性の維持に多版方式を使用しています。つまり、データベースへの問い合わせ実行の際、各トランザクションは処理の基礎となっているデータの現在の状態を関知せず、現在から遡ったある時点におけるスナップショット(データベースバージョン)を参照する、というものです。これは、並行する(別の)トランザクションが同じ行を更新することによって引き起こる、整合性を欠いたデータの参照からトランザクションを保護し、個々のデータベースセッションに対してトランザクションの隔離を提供するものです。
多版方式とロック方式との最大の相違点は、MVCCでは問い合わせ(読み込み)ロックの獲得と、書き込みロックの獲得が競合しないことです。したがって、読み込みは書き込みを絶対にブロックしませんし、書き込みも読み込みをブロックすることがありません。

つまり同じものを更新するわけじゃ無いから、トランザクション制御のところが何か良くなる(何がどう良くなるかをもうちょっと調べたい。例えば、SELECT FOR UPDATEみたいなものを利用しなくても良くなったり、ロック処理でのパフォーマンス劣化を最小限にできたりするのかな…?)。

追記であることによって、ゴミ掃除をする必要があるので、自動VACCUMや可視化マップが必要。GCみたいなもん。