Быстрая загрузка данных
- Переведите ваши данные в CSV.
- Создайте временную таблицу (как вы заметили, без индексов).
- Выполнить команду COPY:
\COPY schema.temp_table FROM /tmp/data.csv WITH CSV
- Вставить данные во временную таблицу.
- Создание индексов.
- Установить соответствующую статистику.
Дополнительные рекомендации
Для больших объемов данных:
- Разделить данные на дочерние таблицы.
- Вставьте его в том порядке, в каком столбце будет использоваться большинство операторов
SELECT
. Другими словами, попытайтесь привести физическую модель в соответствие с логической моделью.
- Настройте параметры конфигурации.
- Создать индекс
CLUSTER
(самый важный столбец слева). Например:
CREATE UNIQUE INDEX measurement_001_stc_index
ON climate.measurement_001
USING btree
(station_id, taken, category_id);
ALTER TABLE climate.measurement_001 CLUSTER ON measurement_001_stc_index;
Настройки конфигурации
На машине с 4 ГБ ОЗУ я сделал следующее ...
Конфигурация ядра
Скажите ядру, что программы могут использовать блоки общей памяти:
sysctl -w kernel.shmmax=536870912
sysctl -p /etc/sysctl.conf
Конфигурация PostgreSQL
- Редактировать
/etc/postgresql/8.4/main/postgresql.conf
и установить:
shared_buffers = 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
checkpoint_segments = 10
- Настройте значения по мере необходимости и в соответствии с вашей средой. Вам, вероятно, придется изменить их для подходящей оптимизации чтения / записи позже.
- Перезапустите PostgreSQL.
Детские столы
Например, предположим, у вас есть данные, основанные на погоде, разделенные на разные категории. Вместо того, чтобы иметь одну чудовищную таблицу, разделите ее на несколько таблиц (по одной на категорию).
Мастер стол
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
и ANALYSE
.