Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / RULE & (INSERT | COPY) / 5 сообщений из 5, страница 1 из 1
04.09.2006, 00:32
    #33960984
DeWiL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RULE & (INSERT | COPY)
Обнаружил интересную особенность работы RULE с партиционными таблицами.
Имеем родительскую таблицу, к ней создаются INHERITS таблицы, в которых дробятся данные по месяцам.
Для каждой под-таблицы создается RULE, который в зависимости от даты направляет INSERT в нужную ему таблицу. Все данные загружаем только в родительскую таблицу.

Привожу код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TABLE log(
    id          BIGSERIAL PRIMARY KEY,
    dt          TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW() NOT NULL,
    ...
);

CREATE TABLE log_2006_09 (
    CHECK ( dt >= DATE '2006-09-01' AND dt < DATE '2006-10-01' )
) INHERITS (log);

CREATE INDEX log_2006_09_dt_index ON log_2006_09 (dt);

CREATE RULE log_insert_2006_09 AS
    ON INSERT TO log WHERE (dt >= DATE '2006-09-01' AND dt < DATE '2006-10-01')
    DO INSTEAD INSERT INTO log_2006_09 VALUES (
        NEW.id,
        NEW.dt,
        ...
    );

Теперь внимание вопрос к знатокам.

Если для загрузки данных использовать INSERT, то данные соглассно RULE отлично попадают в дочернюю таблицу с нужным периодом. Как и положено.

Если для загрузки данных использовать COPY, то чхал он на RULE и данные грузятся в родительскую таблицу. Нарушая при этом идею партиционности для дальнеших выборок.

Это баг или фича?

Использую COPY, потому что данных очень много. Конечно можно уйти на более медленный вариант с INSERT или даже вообще сделать логику на клиенте, чтобы он загружал данные через COPY не в родительскую таблицу, а в под-таблицы по месяцам.
Но интересен сам факт.
...
Рейтинг: 0 / 0
04.09.2006, 08:42
    #33961100
Andrew Sagulin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RULE & (INSERT | COPY)
Фича:

COPY FROM will invoke any triggers and check constraints on the destination table. However, it will not invoke rules.

Кстати, я, когда делал партиционирование (по дням), вынес в ХП:
- формирование имени таблицы-партиции по заданной дате;
- (пере)создание таблицы-партиции по заданной дате;
- удаление партиций, которые старше чем заданная дата.
В идеале, конечно, клиент вообще ничего не должен знать о партиционировании, но даже приведённая выше инкапсуляция позволяет менять расположение и наименование партиций без переделки клиента.
...
Рейтинг: 0 / 0
04.09.2006, 10:22
    #33961304
DeWiL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RULE & (INSERT | COPY)
буду знать :/
...
Рейтинг: 0 / 0
04.09.2006, 13:32
    #33962000
DeWiL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RULE & (INSERT | COPY)
Как в ХП проверить существование таблицы?
...
Рейтинг: 0 / 0
04.09.2006, 15:59
    #33962705
Andrew Sagulin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RULE & (INSERT | COPY)
DeWiLКак в ХП проверить существование таблицы?

Код: plaintext
1.
SELECT count(*) FROM information_schema.tables 
   where table_schema = ... and table_name = ... 
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / RULE & (INSERT | COPY) / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]