Задать вопрос
@Dafur

Какой алгоритм вычисления хэша строки в PostgreSQL самый быстрый?

Столкнулся с проблемой производительности при вычислении хеша вставленных или удаленных строк в триггере 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);

Существуют ли альтернативные методы эффективного вычисления хеша строки в триггере, которые сохраняют приемлемый уровень производительности?
  • Вопрос задан
  • 258 просмотров
Подписаться 1 Сложный 1 комментарий
Помогут разобраться в теме Все курсы
  • Академия Эдюсон
    Python-разработчик + ИИ
    9 месяцев
    Далее
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • ProductStar × РБК
    Профессия DevOps-инженер + ИИ
    5 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
opium
@opium
Просто люблю качественно работать
хеш тормозит не сама функция, а bytea_output=hex внутри record_send(new)::text — бинарный bytea гонишь через hex, объём удваивается и жрёт CPU на каждой строке.

Попробуй hash_record_extended(new, 0) — нативная хеш-функция для record, без сериализации в text/bytea, обычно в разы быстрее. Оговорка: у тебя col_json, а не jsonb — у json нет hash-опкласса, вся запись не захешируется, будет ошибка. Приведи json к jsonb перед хешем или исключи колонку.

Ручной XOR колонок — плохая идея, одинаковые хеши гасят друг друга. Лучше hash_record_extended(ROW(col1, col2, ...), 0) — тот же нативный комбайнер.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы