25

CREATE TABLEPostgresでは、ステートメントの列の順序はパフォーマンスに影響しますか?次の2つのケースを考えてみましょう。

CREATE TABLE foo (
  a      TEXT, 
  B      VARCHAR(512),
  pkey   INTEGER PRIMARY KEY,
  bar_fk INTEGER REFERENCES bar(pkey),
  C      bytea
); 

対。

CREATE TABLE foo2 (
  pkey   INTEGER PRIMARY KEY,
  bar_fk INTEGER REFERENCES bar(pkey),
  B      VARCHAR(512),      
  a      TEXT, 
  C      bytea
);

列のバイトアラインメントが優れているためfoo2よりもパフォーマンスが向上しますか?fooPostgresを実行するCREATE TABLEと、指定された列の順序に従いますか、それともバイトの配置やパフォーマンスに最適な順序で列を再編成しますか?

4

2 に答える 2

27

質問1

のパフォーマンスは、列のバイトアラインメントが優れているためfoo2よりも優れていますか?foo

はい、列の順序はパフォーマンスにわずかな影響を与える可能性があります。タイプアラインメントは、ディスク上のフットプリントに影響を与えるため、より重要な要素です。ストレージサイズを最小化し(「列テトリス」を再生)、データページでより多くの行を圧縮できます。これは速度の最も重要な要素です。

通常、気にする価値はありません。この関連する回答のような極端な例では、実質的な違いがあります。

タイプアライメントの詳細:

もう1つの要因は、最初に固定サイズの列がある場合、列値の取得がわずかに高速になることです。ここでマニュアルを引用します:

データを読み取るには、各属性を順番に調べる必要があります。まず、nullビットマップに従ってフィールドがNULLであるかどうかを確認します。そうである場合は、次へ進みます。次に、正しい配置になっていることを確認します。フィールドが固定幅フィールドの場合、すべてのバイトが単純に配置されます。可変長フィールド(attlen = -1)の場合は、もう少し複雑です。すべての可変長データ型struct varlenaは、格納された値の全長といくつかのフラグビットを含む共通のヘッダー構造を共有します。

これらの理由もあり、PostgresWikiの列の位置を並べ替えることができるオープンなTODOアイテムがあります。

質問2

Postgresを実行すると、CREATE TABLE指定された列の順序に従いますか、それともバイトアラインメントまたはパフォーマンスのために最適な順序で列を再編成しますか?

列は定義された順序で格納され、システムは最適化を試みません。

別の答えが示唆しているように、 TOASTテーブルに対する列の順序の関連性を確認できません。

于 2012-09-26T18:21:20.280 に答える
4

私が理解している限り、PostgreSQLは、レコードを保存するときに列を入力する順序に従います。これがパフォーマンスに影響するかどうかは議論の余地があります。PostgreSQLは、すべてのテーブルデータをそれぞれ8kbのサイズのページに保存します。デフォルトは8kbですが、コンパイル時に変更できます。

テーブルの各行は、ページ内のスペースを占有します。テーブル定義には可変列が含まれているため、ページは可変量のレコードで構成できます。あなたがしたいのは、できるだけ多くのレコードを1ページに収めることができるようにすることです。そのため、テーブルに大量の列がある場合や列サイズが大きい場合は、パフォーマンスが低下します。

とはいえ、varchar(8192)を宣言しても、ページが1つのレコードでいっぱいになるわけではありませんが、CHAR(8192)を宣言すると、列のデータ量に関係なく、ページ全体が1つ使用されます。

TEXT列などのTOASTable型を宣言するときに考慮すべきことがもう1つあります。これらは、最大ページサイズを超える可能性のある列です。TOASTable列を持つテーブルには、データを格納するためのTOASTテーブルが関連付けられ、データへのポインターのみがテーブルに格納されます。これはパフォーマンスに影響を与える可能性がありますが、TOASTable列に適切な索引を付けることで改善できます。

結論として、列の順序はテーブルのパフォーマンスにあまり影響を与えないと言わざるを得ません。ほとんどのクエリは、レコードを取得するために個別に格納されているインデックスを利用するため、列の順序は無効になります。データを取得するために読み取る必要のあるページ数になります。

于 2012-09-26T16:15:03.157 に答える