12

私は、非常に肥大化していると思うかなり大きなテーブル(約82,000,000行)があるプロジェクトに取り組み始めました。フィールドの1つは次のように定義されます。

consistency character varying NOT NULL DEFAULT 'Y'::character varying

ブール値として使用されます。値は常に('Y' |'N')のいずれかである必要があります。

注:チェック制約などはありません。

私はこの分野を変えることを正当化する理由を考え出そうとしています。これが私が持っているものです:

  • ブール値として使用されているので、それを作成します。明示的は暗黙的よりも優れています。
  • 現在、テキストに変換できるものはすべてそこに盲目的に入るため、コーディングエラーから保護します。

これが私の質問です。

  • サイズ/ストレージはどうですか?dbはUTF-8です。ですから、その点で実際にはそれほど節約はないと思います。は1バイトである必要がありますが、UTF-8ではbooleanaも1バイトである必要があります'Y'(少なくとも、Pythonで長さを確認するとそれが得られます)。ここで節約できる他のストレージオーバーヘッドはありますか?
  • クエリのパフォーマンス?Postgresは、 " =TRUE" vs. ""の原因でパフォーマンスが向上し='Y'ますか?
4

2 に答える 2

23

PostgreSQL(Oracleとは異なり)には本格的なbooleanタイプがあります。通常、「はい/いいえフラグ」はですboolean。これが適切なタイプです。

サイズ/ストレージはどうですか?

基本的に、列はディスク上で1バイトbooleanを占有しますが 、または(ここでマニュアルを引用)...
textcharacter varying

短い文字列(最大126バイト)のストレージ要件は、1バイトに実際の文字列を加えたものです

単純な文字の場合は2バイトです。したがって、その列のストレージを半分に減らすことができます。

実際のストレージはそれよりも複雑です。テーブル、ページ、行ごとに一定のオーバーヘッドがあり、特別なNULLストレージがあり、一部のタイプではデータの配置が必要です。全体的な影響は非常に限定的です-もし目立つとしても。
実際のスペース要件を測定する方法の詳細。

ここでは、エンコーディングによるUTF8違いはありません。基本的なASCII文字は、などの他のエンコーディングとビット互換LATIN-1です。

あなたの場合、あなたの説明によれば、あなたはすでに持っているように見えるNOTNULL制約を維持するべきです-基本タイプとは無関係です。

クエリのパフォーマンス?

ブール値を使用すると、いずれの場合も少し良くなります。わずかに小さいことに加えて、のロジックbooleanはより単純であり、varcharまたはtext一般的にCOLLATION固有のルールが必要です。しかし、それほど単純なものにはあまり期待しないでください。

それ以外の

WHERE consistency = 'Y'

あなたは書くことができます:

WHERE consistency = TRUE

しかし、実際には、次のように単純化できます。

WHERE consistency

それ以上の評価は必要ありません。

タイプを変更する

テーブルの変換は簡単です。

ALTER TABLE tbl ALTER consistency TYPE boolean
USING CASE consistency WHEN 'Y' THEN TRUE ELSE FALSE END;

この式は、 ('Y')以外のCASEすべてを。にフォールドします。NOTNULL制約はそのまま残ります。TRUEFALSE

于 2012-10-11T00:18:54.997 に答える
2

ストレージサイズもクエリパフォーマンスも、単一のVARCHARからBOOLEANへの切り替えが大幅に改善されることはありません。バイナリ値について話しているときにブール値を使用する方が技術的にクリーンであるのは正しいですが、変更するためのコストはおそらくメリットよりも大幅に高くなります。正確さが心配な場合は、たとえば、列にチェックを入れることができます

ALTER TABLE tablename ADD CONSTRAINT consistency CHECK (consistency IN ('Y', 'N'));
于 2012-10-12T21:26:01.570 に答える