Столкнулся с проблемой производительности при вычислении хеша вставленных или удаленных строк в триггере INSERT/UPDATE. Таблица содержит поля различных типов: integer, timestamp, boolean и т. д.
Я экспериментировал со разными методами вычисления хеша, самые быстрые из них:
1. Конкатенация полей и преобразование в текст: Использование col1::TEXT || col2::TEXT вместе с hashtextextended()
2. Вычисление MD5 от record_send(new)
3. Вычисление hashtextextended(record_send(new)::text) производительность остается неудовлетворительной
Всё это приводит к падению производительности примерно на 200%.
CREATE OR REPLACE FUNCTION public.test_text_create()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
DECLARE
new_hash BIGINT;
BEGIN
new_hash = функция_хэширования()
RETURN NEW;
END $function$;
----------------------------------------------------
create trigger test_text_create_trigger before
insert
on
public.test_text for each row execute function test_text_create();
----------------------------------------------------
insert into test_text (col_int, col_numeric, col_date, col_time, col_timestamp, col_uuid, col_json, col_jsonb, col_array_int, col_array_text)
select 32767, 12345.67, '2026-07-17', /*....*/
FROM generate_series(1, 1000000);
Существуют ли альтернативные методы эффективного вычисления хеша строки в триггере, которые сохраняют приемлемый уровень производительности?