@pgsql

Страница 735 из 1062
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;" и в таблице ничего нет.

может играет роль параметр for each row
FOR EACH ROW / STATEMENT совсем разные вещи, да. Можете попробовать показать триггер...

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;

и потом, как я отловлю всю транзакцю, если забикс пишет

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;

кажется понял

в триггере коммит надо делать если он меняет содержимое вставки?

Mikhail
29.03.2018
12:07:44
о чём и речь

я просто не могу понять с чего такая ошибка

получилось что прошёл запрос на инсерт

потом следующий со связанной записью не нашёл изменений

но т.к. они оба в одной транзакции то проходит ролбек

самое интересное в том, что если использовать обычную таблицу, всё норм

т.е. такой эфффект только на шардированной

Yaroslav
29.03.2018
12:11:37
т.е. такой эфффект только на шардированной
А что имеется в виду, как шардированной? Что такое эти events_N?

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
по этому и матерится что в events данные не попадают
Подождите, вот же ошибка: ERROR: insert or update on table "problem" violates foreign key constraint "c_problem_1"

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
Вы видимо намекали на то что insert в родительскую таблицу не сработает?
Нет. Я намекал, что FK на партиционированную таблицу работать не будет.

Mikhail
29.03.2018
12:24:43
ааа

Yaroslav
29.03.2018
12:24:47
ая делал вот по этой https://postgrespro.ru/docs/postgrespro/9.6/ddl-partitioning
А, так вы не там читали: https://postgrespro.ru/docs/postgrespro/9.6/ddl-inherit#ddl-inherit-caveats

Впрочем, если у вас именно 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
Окей, спасибо. Хотел убедиться, что правильно все понимаю.

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
Юзера не будешь удалять никогда?

Заказы юзера искать не будешь?

Страница 735 из 1062