Open3

昔挫折したDatabase Design and ImplementationとPostgreSQLのコードリーディングをまとめてやるぞ

nnaka2992nnaka2992

はじめに

最近自社でDatabase Design and Implementationの輪読会をしています。
https://twitter.com/ken5owata/status/1846173720723050542
昔Zigで実装しようとして挫折しました。

昔PostgreSQLのコードリーディングをしていましたが、深すぎてなげました。
https://zenn.dev/nnaka2992/scraps/e0fd91210ea396

今回はDatabase Design and ImplementationをCでやっているのでリファレンス実装としてPostgreSQLを参考にしつつ、ミニマルなデータベース実装に必要なコンポーネントがPostgreSQLではどうなっているのかを見ます。

nnaka2992nnaka2992

Chapter 3

ストレージをDB上でどう扱っているか解説している章

nnaka2992nnaka2992

BlockID

  • SimpleDBとの違い
    • SimpleDBではBlockIDをfilename + blocknumberで表現している
    • PostgreSQLではBlockIDは確保したブロックのposition(high, low)で判別している。
      static inline void
      BlockIdSet(BlockIdData *blockId, BlockNumber blockNumber)
      {
      	blockId->bi_hi = blockNumber >> 16;
      	blockId->bi_lo = blockNumber & 0xffff;
      }
      
      • この実装によりBlockNumberをBlockIdから生成できる
        static inline BlockNumber
        BlockIdGetBlockNumber(const BlockIdData *blockId)
        {
        	return (((BlockNumber) blockId->bi_hi) << 16) | ((BlockNumber) blockId->bi_lo);
        }
        

https://github.com/postgres/postgres/blob/REL_17_0/src/include/storage/block.h