
Mikhail
29.03.2018
11:52:52
включил полные логи
например запрос в логе
duration: 0.384 ms statement: insert into events (eventid,source,object,objectid,clock,ns,value) values (93,3,0,15432,1522324361,944256642,1);
в таблице его нет

Google

Mikhail
29.03.2018
11:53:24
идем дальше
выполняю запрос вручную
всё ок!
данные добавились, ошибки нет
Идём еще дальше
сношу шардирование...
для начала просто отключаю триггер
хмм
кстати
может играет роль параметр for each row
?

Yaroslav
29.03.2018
11:58:23
нее
Что такое "нее"? ;) Вы всю транзакцию просмотрели?
А так-то я тоже могу: "INSERT ... ; ... ; ROLLBACK;" и в таблице ничего нет.

Google


Mikhail
29.03.2018
12:00:15
CREATE TRIGGER tr_insert_events
BEFORE INSERT
ON public.events
FOR EACH ROW
EXECUTE PROCEDURE public.insert_events();
CREATE OR REPLACE FUNCTION public.insert_events (
)
RETURNS trigger AS
$body$
BEGIN
IF (date_part('month', to_timestamp(NEW.clock))=1) THEN
INSERT INTO events_01 VALUES (NEW.*);
ELSIF (date_part('month', to_timestamp(NEW.clock))=2) THEN
INSERT INTO events_02 VALUES (NEW.*);
ELSIF (date_part('month', to_timestamp(NEW.clock))=3) THEN
INSERT INTO events_03 VALUES (NEW.*);
ELSIF (date_part('month', to_timestamp(NEW.clock))=4) THEN
INSERT INTO events_04 VALUES (NEW.*);
ELSIF (date_part('month', to_timestamp(NEW.clock))=5) THEN
INSERT INTO events_05 VALUES (NEW.*);
ELSIF (date_part('month', to_timestamp(NEW.clock))=6) THEN
INSERT INTO events_06 VALUES (NEW.*);
ELSIF (date_part('month', to_timestamp(NEW.clock))=7) THEN
INSERT INTO events_07 VALUES (NEW.*);
ELSIF (date_part('month', to_timestamp(NEW.clock))=8) THEN
INSERT INTO events_08 VALUES (NEW.*);
ELSIF (date_part('month', to_timestamp(NEW.clock))=9) THEN
INSERT INTO events_09 VALUES (NEW.*);
ELSIF (date_part('month', to_timestamp(NEW.clock))=10) THEN
INSERT INTO events_10 VALUES (NEW.*);
ELSIF (date_part('month', to_timestamp(NEW.clock))=11) THEN
INSERT INTO events_11 VALUES (NEW.*);
ELSIF (date_part('month', to_timestamp(NEW.clock))=12) THEN
INSERT INTO events_12 VALUES (NEW.*);
ELSE
RAISE EXCEPTION 'Date out of range';
END IF;
RETURN NULL;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
и потом, как я отловлю всю транзакцю, если забикс пишет


Yaroslav
29.03.2018
12:02:07


Mikhail
29.03.2018
12:02:37
ам
ну, begin и end там нет конечно
2018-03-29 14:52:43 MSK [19055]: [2543-1] user=zabbix,db=zabbix,client=localhostLOG: duration: 0.187 ms statement: insert into events (eventid,source,object,objectid,clock,ns,value) values (94,3,0,15437,1522324362,947015315,1);
2018-03-29 14:52:43 MSK [19055]: [2544-1] user=zabbix,db=zabbix,client=localhostERROR: insert or update on table "problem" violates foreign key constraint "c_problem_1"
2018-03-29 14:52:43 MSK [19055]: [2545-1] user=zabbix,db=zabbix,client=localhostDETAIL: Key (eventid)=(94) is not present in table "events".
2018-03-29 14:52:43 MSK [19055]: [2546-1] user=zabbix,db=zabbix,client=localhostSTATEMENT: insert into problem (eventid,source,object,objectid,clock,ns) values (94,3,0,15437,1522324362,947015315);
2018-03-29 14:52:43 MSK [19055]: [2547-1] user=zabbix,db=zabbix,client=localhostLOG: duration: 0.016 ms statement: rollback;
кажется понял
в триггере коммит надо делать если он меняет содержимое вставки?


Yaroslav
29.03.2018
12:06:53
2018-03-29 14:52:43 MSK [19055]: [2543-1] user=zabbix,db=zabbix,client=localhostLOG: duration: 0.187 ms statement: insert into events (eventid,source,object,objectid,clock,ns,value) values (94,3,0,15437,1522324362,947015315,1);
2018-03-29 14:52:43 MSK [19055]: [2544-1] user=zabbix,db=zabbix,client=localhostERROR: insert or update on table "problem" violates foreign key constraint "c_problem_1"
2018-03-29 14:52:43 MSK [19055]: [2545-1] user=zabbix,db=zabbix,client=localhostDETAIL: Key (eventid)=(94) is not present in table "events".
2018-03-29 14:52:43 MSK [19055]: [2546-1] user=zabbix,db=zabbix,client=localhostSTATEMENT: insert into problem (eventid,source,object,objectid,clock,ns) values (94,3,0,15437,1522324362,947015315);
2018-03-29 14:52:43 MSK [19055]: [2547-1] user=zabbix,db=zabbix,client=localhostLOG: duration: 0.016 ms statement: rollback;
Вот-вот. ;)
Кстати, с виду триггер нормальный...


Mikhail
29.03.2018
12:07:44
о чём и речь
я просто не могу понять с чего такая ошибка
получилось что прошёл запрос на инсерт
потом следующий со связанной записью не нашёл изменений
но т.к. они оба в одной транзакции то проходит ролбек
самое интересное в том, что если использовать обычную таблицу, всё норм
т.е. такой эфффект только на шардированной

Yaroslav
29.03.2018
12:11:37

Google

Mikhail
29.03.2018
12:12:25
сейчас объясню
есть таблица events
и есть таблицы events_1 до 12
это размещение записей по месяцам
все дочерние таблицы наследуются от events
например
CREATE TABLE public.events_03 (
CONSTRAINT events_03_pkey PRIMARY KEY(eventid),
CONSTRAINT events_03_clock_check CHECK (date_part('month'::text, to_timestamp((clock)::double precision)) = (3)::double precision)
) INHERITS (public.events)
WITH (oids = false);
CREATE INDEX events_03_source_object_clock_idx ON public.events_03
USING btree (source, object, clock);
CREATE INDEX events_03_source_object_objectid_clock_idx ON public.events_03
USING btree (source, object, objectid, clock);
далее, чтоб данные в них разносились при вставке в events, вешаю триггер, который вы уже видели
всё...


Yaroslav
29.03.2018
12:14:33
это размещение записей по месяцам
Тьфу, только дошло. У вас это вообще когда-нибудь работало на "шардированной" (почему шардированной-то, если это с виду партиционирование/секционирование) таблице?
Потому что, вообще-то, не должно было. ;)

Mikhail
29.03.2018
12:15:06
ок, ок
секционированной
не понял вопроса

Mikhail
29.03.2018
12:15:37
это сейчас работает

Yaroslav
29.03.2018
12:15:38
Я имел в виду именно INSERT INTO problems... , кстати.

Mikhail
29.03.2018
12:15:53
problems не секционировал
она как есть
просто зависит от events
по этому и матерится что в events данные не попадают

Yaroslav
29.03.2018
12:17:47
это сейчас работает
Оччень интересно. Тогда у вас какой-то свой PostgreSQL, потому что в нашем это просто должно не работать, как мне помнится. ;)
См. https://www.postgresql.org/docs/current/static/ddl-inherit.html#DDL-INHERIT-CAVEATS

Fedor
29.03.2018
12:17:59
Коллеги кто знает как создать индекс составной в кором есть поля hstor и обычные ?

Google

Mikhail
29.03.2018
12:18:35
так так

Yaroslav
29.03.2018
12:18:38

Mikhail
29.03.2018
12:18:39
минуту
events.eventid это FK для problem.eventid
по этому и ошибка

Admin
ERROR: S client not available

Yaroslav
29.03.2018
12:20:46

Mikhail
29.03.2018
12:21:02
Вы видимо намекали на то что insert в родительскую таблицу не сработает?
ая делал вот по этой https://postgrespro.ru/docs/postgrespro/9.6/ddl-partitioning

Yaroslav
29.03.2018
12:24:37

Mikhail
29.03.2018
12:24:43
ааа

Yaroslav
29.03.2018
12:24:47
Впрочем, если у вас именно Postgres Pro, лучше спросить тех, кто с ним работает...

Mikhail
29.03.2018
12:26:07
не, у меня ванила
чёт не вижу про форейн ки
спасиб!

Yaroslav
29.03.2018
12:32:26
чёт не вижу про форейн ки
"Если вы сделаете, чтобы столбец другой таблицы ссылался на cities(name), в этом столбце можно будет указывать только названия городов, но не столиц. В этом случае хорошего решения нет."
При этом, выше:
CREATE TABLE capitals (
state char(2)
) INHERITS (cities);

Mikhail
29.03.2018
12:32:45
Всё понял
это понятно
на досуге поковыряю

Google

Alexander
29.03.2018
15:21:22
Товарищи, допустим есть две таблицы: CREATE TABLE orders (id BIGINT) и CREATE TABLE users_wishes (user_id BIGINT, order_id BIGINT, CONSTRAINT users_wishes_pk PRIMARY KEY (user_id, order_id)).
Я хочу добиться поведения, когда при удалении заказа (строки из таблицы orders) удаляются пожелания всех пользователей, которые его желали (связанные строки из users_wishes). Для этого я собираюсь использовать такое ограничение: ALTER TABLE users_wishes ADD CONSTRAINT some_fk FOREIGN KEY (order_id) REFERENCES orders (id) ON DELETE CASCADE.
Правильно ли я понимаю, что для достижения максимальной скорости удаления связанных строк из users_wishes, мне следует поменять поля user_id и order_id местами, чтобы использовался первичный ключ?
Ох, потекло форматирование, простите

Ilia
29.03.2018
15:25:50
Ну, исправь...

Alexander
29.03.2018
15:26:42
Окей, спасибо. Хотел убедиться, что правильно все понимаю.

Ilia
29.03.2018
15:27:19
Форматирование исправь!
Товарищи, допустим есть две таблицы: CREATE TABLE orders (id BIGINT) и CREATE TABLE users_wishes (user_id BIGINT, order_id BIGINT, CONSTRAINT users_wishes_pk PRIMARY KEY (user_id, order_id)).
Я хочу добиться поведения, когда при удалении заказа (строки из таблицы orders) удаляются пожелания всех пользователей, которые его желали (связанные строки из users_wishes). Для этого я собираюсь использовать такое ограничение: ALTER TABLE users_wishes ADD CONSTRAINT some_fk FOREIGN KEY (order_id) REFERENCES orders (id) ON DELETE CASCADE.
Правильно ли я понимаю, что для достижения максимальной скорости удаления связанных строк из users_wishes, мне следует поменять поля user_id и order_id местами, чтобы использовался первичный ключ?
Да правильно. Но можно и как правило нужно создать ещё один индекс, по order id

Alexander
29.03.2018
15:29:54
Да, я понимаю, но не хочется делать лишний индекс, а использовать уже имеющийся первичный ключ :)

Ilia
29.03.2018
15:30:59
Ничего страшного в лишнем индексе нет.
Связь всёравно надо с двух сторон видеть обычно

Alexander
29.03.2018
15:31:27
А если в таблице будут сотни миллионов записей?

Ilia
29.03.2018
15:31:40
ТЕМ БОЛЕЕ НАДО ИНДЕКС

Alexander
29.03.2018
15:32:43
У меня к этой таблице только два требования:
1. Хранить уникальные пары пользователя и заказа
2. Удалять пары для заказов, которые были удалены
Настоящая предметная область несколько иная, поэтому задачи загрузки "заказов по пользователю" нет. Следовательно, лишний индекс не хочу

Ilia
29.03.2018
15:35:30
Ну тогда переставь поля

Alexander
29.03.2018
15:35:47
Переставил. Спасибо за ответ!

Ilia
29.03.2018
15:36:07
Юзера не будешь удалять никогда?
Заказы юзера искать не будешь?