записей, не будет ли это тормозить вставку?
Так этот Ваш триггер никто тут не видел — нам-то откуда знать?! ;)
там ничего такого нет CREATE OR REPLACE FUNCTION check_unique_transaction() RETURNS trigger AS $$ BEGIN IF EXISTS (SELECT 1 FROM transactions WHERE account_id = NEW.account_id AND currency_id = NEW.currency_id AND transaction_hash = NEW.transaction_hash) THEN RAISE EXCEPTION 'Duplicate transaction'; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql;
Будет тормозить, скорее всего (по мере роста (числа) partitions), и особенно — если в каких-то нет индекса по этому условию. На всякий случай — Вы знаете, что так написанные проверки надёжно работают только на SERIALIZABLE?
нет, что это, уровень изоляции?
> … что так написанные проверки … тут про наличие подзапросов вообще? или же про конструкцию EXISTS как частный случай? ( недавно именно EXISTS обсуждали, но думается, что любые подзапросы будут “стрелять” )
Нет, про то, что здесь вообще нет ничего (точки сериализации для низких уровней изоляции), что гарантировало бы надёжность этого даже при параллельном исполнении двух подобных запросов. Т.е. на RC/RR дубликаты будут вставляться вообще запросто (даже при наличии в каждой partition UNIQUE INDEX ON this_partition(account_id, currency_id, transaction_hash) тоже могут, но с гораздо меньшей вероятностью на практике, конечно).
Если там будет меньшэ 30 миллиардов записей – то прекратите мучать партицыонирование, это всё сложно, медленно и некрасиво.
у меня есть таблица в которой чуть больше 1 миллиарда записей, я хочу получить первые записи по каждой валюте, запрос уже выполняется более 20 минут SELECT DISTINCT ON (currency_id) * FROM records ORDER BY currency_id, datetime; select * from (select *, row_number() over (PARTITION BY currency_id order by datetime) as row from records) as t1 where row = 1; пробовал вот так вот, а вы говорите о 30 миллиардах)
Для начала разговора о скорости запросов приведите всю информацыю из закрепа: https://t.me/pgsql/303899 Можно воспользоваться вот этим скриптом: https://t.me/pgsql/476688 Без этой информацыи такой разговор будет беспредметным.
О, неужели опять https://t.me/pgsql/491548 ? > пробовал вот так вот, а вы говорите о 30 миллиардах) Может, не надо "пробовать так", а стоит написать адекватный запрос / создать подходящие индексы? ;) Впрочем, Вам уже написали, что нужно показать, если хотите помощи...
в запросе выбирается вся строка? так не удивительно, их нужно все вычитать, отсортировать и на это нужно время.
Обсуждают сегодня