Комментарии 5
«EXECUTE 'UPDATE row_counts set reltuples=reltuples +1 where relname = ''' || TG_RELNAME || '''';»
Это решение с тригером очень плохое для варианта массовой параллельной вставки, т.к. пораждает блокировки на вставке.
Это решение с тригером очень плохое для варианта массовой параллельной вставки, т.к. пораждает блокировки на вставке.
0
Ручное кеширование можно прокачать, например забирать информацию из WAL.
Как-то на одной конфе по PG упоминалось расширение которое умеет читать WAL и класть информацию по изменениям в очереди. Дальше из этих очередей уже можно забирать и агрегировать данные. Конечно агрегат будет отставать от исходной таблицы.
К сожалению, не могу вспомнить название расширения.
Это конечно немного изврат, но в каких-то задачах пригодится.
Как-то на одной конфе по PG упоминалось расширение которое умеет читать WAL и класть информацию по изменениям в очереди. Дальше из этих очередей уже можно забирать и агрегировать данные. Конечно агрегат будет отставать от исходной таблицы.
К сожалению, не могу вспомнить название расширения.
Это конечно немного изврат, но в каких-то задачах пригодится.
+1
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;
+1
А почему запрос в текстовой форме?
чем плохо такое тело функции (вообще без кавычек и возможности «сломать» запрос кривым именем таблицы:
чем плохо такое тело функции (вообще без кавычек и возможности «сломать» запрос кривым именем таблицы:
DECLARE
--...
UPDATE row_counts set reltuples=reltuples +1 where relname = TG_RELNAME;
--...
END
+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Как заставить PostgreSQL считать быстрее