KDOC 399: 『PostgreSQL 17.0』

この文書のステータス

  • 作成
    • <署名>
  • レビュー
    • <署名>

概要

PostgreSQL 17.0文書は、PostgreSQLのマニュアル。

メモ

  • PostgreSQLはクライアント/サーバモデルを採用している。クライアントとサーバのホストが異なる場合、TCP/IPネットワーク経由で通信する(p4)
    • (感想)ホストが同じ場合はソケット接続という理解で合っているか
  • サーバは接続ごとに新しいプロセスを開始(fork)する。これによってクライアントからの複数同時接続を取り扱える(p4)
  • 左外部結合というのは、結合演算子の左側に指定したテーブルの各行が最低でも1度出力されるから。いっぽう右側では左側のテーブルの行に一致するもののみが出力される(p14)
  • SQLのWHEREとHAVINGの間の相互作用を理解するのが重要である。WHEREとHAVINGの基本的な違いは、WHEREがグループや集約を演算する前に入力行を選択するのに対し、HAVINGはグループと集約を演算したあとにグループ化された行を選択する。したがって、WHERE句は集約関数を持てない。集約を使ってどの行をその集約の入力にすることになるから(p17)
  • 複数のトランザクションが同時に動作しているとき、それぞれのトランザクションは別のトランザクションが行っている未完了の変更を見ることができてはならない。作業中のトランザクションによる更新は、ほかのトランザクションからはトランザクションが完結するまで不可視である。そのトランザクションが完結した時点でトランザクションで行った更新のすべてが見えるようになる(p21)
  • PostgreSQLはすべてのSQL文をトランザクション内で実行するようになっている。BEGINを発行しない場合、それぞれの文は暗黙的にBEGINが付いているとみなし、成功すればCOMMITで囲われているものとする(p21)
  • セーブポイントはトランザクションを構成するある部分を選択的に破棄するいっぽう、破棄されない残りの部分をコミットする(p22)
  • システムは NAMEDATALEN - 1より長い識別子を使わない。より長い名前を書くと短く切られる。デフォルトでは NAMEDATALEN は64バイトなので、識別子は最長で63バイト。定数は変えて増やせる(p40)
  • 任意の文字の連なりをダブルクォートで囲ったものを区切り識別子 or 引用符付き識別子という(p40)
    • (感想)なぜプログラミング言語のように文字列リテラルといわないのか
    • (感想)名前の列あるいはテーブルを問い合わせるために使うから。データそのものでなく、識別子として使うからこのような名前になっている
  • 引用符がつかない名前は常に小文字に解釈される。識別子を引用符で囲むことで大文字と小文字が区別される(p40)
  • SQLにおける文字列定数は、単一引用符で括られた任意の文字の並びである(p41)
    • (感想)なぜ文字列定数というのだろう
  • 対象の文字列内に単一引用符が多くあると、それらをすべて二重にしなければならないので理解しづらくなる。そのような場合は単一引用符をエスケープすることなく使用できるドル引用符付けが便利。ただし標準SQLで定義されていない(p44)
  • 定数は文脈に基づいて自動的にもっとも適切な型に変換される(p46)
  • (感想)集約とか関数とかはあまり使ったことがないしあまり使うケースもないように見えるので、細かい話があまり頭に入ってこない
  • SQLではテーブル内の行の順序は保証されない。テーブルを読み込むと、明示的に並び替えを要求しない限り行は不特定な順番で並び替えられる(p69)
  • リレーショナルデータベース理論では、すべてのテーブルに主キーが1つ必要とされている。PostgrSQLは強制しないが、これに従うことが推奨される(p80)

関連

なし。