高速データ読み込み
- データを CSV に変換します。
- 一時テーブルを作成します(ご指摘のとおり、インデックスなし)。
- COPY コマンドを実行します。
\COPY schema.temp_table FROM /tmp/data.csv WITH CSV
- 非一時テーブルにデータを挿入します。
- インデックスを作成します。
- 適切な統計を設定します。
その他の推奨事項
大量のデータの場合:
- データを子テーブルに分割します。
SELECT
ほとんどのステートメントが使用する列の順に挿入します。つまり、物理モデルを論理モデルに合わせるようにしてください。
- 構成設定を調整します。
- インデックスを作成し
CLUSTER
ます (左側の最も重要な列)。例えば:
UNIQUE INDEX を作成する Measurement_001_stc_index
オン 気候.測定_001
btree の使用
(station_id、撮影、category_id);
ALTER TABLE Climate.measurement_001 CLUSTER ON 測定_001_stc_index;
構成設定
4GBのRAMを搭載したマシンで、次のことを行いました...
カーネル構成
プログラムが共有メモリのゴブを使用しても問題ないことをカーネルに伝えます。
sysctl -w kernel.shmmax=536870912
sysctl -p /etc/sysctl.conf
PostgreSQL の設定
- 編集
/etc/postgresql/8.4/main/postgresql.conf
して設定:共有バッファ = 1GB
temp_buffers = 32MB
work_mem = 32MB
Maintenance_work_mem = 64MB
seq_page_cost = 1.0
random_page_cost = 2.0
cpu_index_tuple_cost = 0.001
effective_cache_size = 512MB
チェックポイント_セグメント = 10
- 必要に応じて値を微調整し、環境に合わせてください。後で適切な読み取り/書き込みの最適化を行うために、おそらくそれらを変更する必要があります。
- PostgreSQL を再起動します。
子テーブル
たとえば、さまざまなカテゴリに分類された、天気に基づくデータがあるとします。巨大なテーブルを 1 つ持つのではなく、複数のテーブル (カテゴリごとに 1 つ) に分割します。
マスターテーブル
CREATE TABLE climate.measurement
(
id bigserial NOT NULL,
taken date NOT NULL,
station_id integer NOT NULL,
amount numeric(8,2) NOT NULL,
flag character varying(1) NOT NULL,
category_id smallint NOT NULL,
CONSTRAINT measurement_pkey PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
子テーブル
CREATE TABLE climate.measurement_001
(
-- Inherited from table climate.measurement_001: id bigint NOT NULL DEFAULT nextval('climate.measurement_id_seq'::regclass),
-- Inherited from table climate.measurement_001: taken date NOT NULL,
-- Inherited from table climate.measurement_001: station_id integer NOT NULL,
-- Inherited from table climate.measurement_001: amount numeric(8,2) NOT NULL,
-- Inherited from table climate.measurement_001: flag character varying(1) NOT NULL,
-- Inherited from table climate.measurement_001: category_id smallint NOT NULL,
CONSTRAINT measurement_001_pkey PRIMARY KEY (id),
CONSTRAINT measurement_001_category_id_ck CHECK (category_id = 1)
)
INHERITS (climate.measurement)
WITH (
OIDS=FALSE
);
テーブル統計
重要な列のテーブル統計を増やします。
ALTER TABLE climate.measurement_001 ALTER COLUMN taken SET STATISTICS 1000;
ALTER TABLE climate.measurement_001 ALTER COLUMN station_id SET STATISTICS 1000;
VACUUM
toとafter を忘れないでくださいANALYSE
。