11

大きなテーブル(1000万から1億行)がある場合、それにいくつかの余分な(インデックス付けされていない)列を追加するための最良の方法は何ですか?

  1. 列を追加するだけです。
  2. 追加の列ごとに個別のテーブルを作成し、追加の値にアクセスする場合は結合を使用します。

余分な列が密(ほとんどnullではない)または疎(ほとんどnull)であるかどうかによって、答えは変わりますか?

4

1 に答える 1

21

ほとんどの場合、値を持つNULL列は、データページの残りの部分を変更せずに行に追加できます。NULLビットマップに設定する必要があるビットは1つだけです。したがって、ほとんどの場合、スパース列を追加する方がはるかに安価です。

追加の列用に個別の1:1テーブルを作成することをお勧めするかどうかは、ユースケースによって大きく異なります。一般的にはより高価です。手始めに、行ごとに28バイト(ヒープタプルヘッダーとアイテム識別子)のオーバーヘッドがあり、テーブルごとに追加のオーバーヘッドがあります。JOINまた、クエリ内の行は、1つの部分で読み取るよりもはるかにコストがかかります。そして、主キー/外部キー列とそれにインデックスを追加する必要があります。ほとんどのクエリで追加の列が必要ない場合は、分割することをお勧めします。ほとんどの場合、それは悪い考えです。

PostgreSQLでは列の追加が高速です。列の値を更新UPDATEすると、すべてが新しい行を書き込むため(MVCCモデルのため)、コストがかかる可能性があります。したがって、一度に複数の列を更新することをお勧めします。

マニュアルのデータベースページレイアウト。

行サイズの計算方法:

于 2012-04-04T23:29:45.510 に答える