Как стать автором
Обновить

Комментарии 5

«EXECUTE 'UPDATE row_counts set reltuples=reltuples +1 where relname = ''' || TG_RELNAME || '''';»

Это решение с тригером очень плохое для варианта массовой параллельной вставки, т.к. пораждает блокировки на вставке.
Ручное кеширование можно прокачать, например забирать информацию из WAL.
Как-то на одной конфе по PG упоминалось расширение которое умеет читать WAL и класть информацию по изменениям в очереди. Дальше из этих очередей уже можно забирать и агрегировать данные. Конечно агрегат будет отставать от исходной таблицы.
К сожалению, не могу вспомнить название расширения.
Это конечно немного изврат, но в каких-то задачах пригодится.
EXECUTE 'UPDATE row_counts set reltuples=reltuples +1 where relname = ''' || TG_RELNAME || '''';

Вам четыре кавычки подряд глаза не режут?
В PostgreSQL можно использовать «Dollar-quoted String Constants»:
CREATE OR REPLACE FUNCTION adjust_count()
RETURNS TRIGGER AS
$_$
  DECLARE
  -- ...
  EXECUTE $$UPDATE ... WHERE relname = '$$ || TG_RELNAME || $$'$$;

  -- или так:

  EXECUTE 'UPDATE ... WHERE relname = $1' USING TG_RELNAME;
А почему запрос в текстовой форме?
чем плохо такое тело функции (вообще без кавычек и возможности «сломать» запрос кривым именем таблицы:
DECLARE
--...
UPDATE row_counts set reltuples=reltuples +1 where relname = TG_RELNAME;
--...
END
Тем более что такой запрос будет PREPARED — и должен отрабатывать в разы, а может десятки раз быстрее чем EXECUTE
Зарегистрируйтесь на Хабре, чтобы оставить комментарий