powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Postgres не хочет юзать память
75 сообщений из 75, показаны все 3 страниц
Postgres не хочет юзать память
    #39462988
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При выполнении сложных запросов, массовых заливок Postgres жутко тормозит.
Почитал рекомендации пошаманил в postgresql.conf (прилагаю).
Ничего не дает - по прежнему загрузка ЦП 100%, загрузка памяти 3%

Куды копать?
Может вовсе не postgres виноват, а Линукс?
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463042
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an2kПри выполнении <>, массовых заливок Postgres жутко тормозит.

предположим СУБД вместо того чтобы залить данные на диск (поюзать дисковую) поюзало память. и туточки всё упало (где-то там перемкнуло в БП или обоих, или даже на мамке бумкнуло) -- и оно так в памяти и сдохло, не попав на диск -- оно вам надо ?

ну и про запросы: -- какие запросы ?
тексты, планы, вот это всё -- где оно ?

то, что 100 % проца -- может означать, что запросы вычислительно дорогие, например, а память им нахер не упала.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463064
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот функция
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
-- ОЧИСТКА ТАБЛИЦЫ log_write ОТ ДУБЛИРУЮЩИХ СТРОК

CREATE or replace FUNCTION f_delete_notmax() RETURNS integer
    LANGUAGE plpgsql
    AS $$
DECLARE
_rec1 record  ;
_rec2 record  ;
_rec_id integer := 0  ;
_max_id integer := 0  ;
_table_name varchar(32) ;
BEGIN

for _rec1 in
    select distinct lw_table_name from log_write
loop
    _table_name = _rec1.lw_table_name ;
    if _table_name != 'schedules' then
        RAISE NOTICE 'table_name: %', _table_name;

        for _rec2 in
            EXECUTE 'select lw_rec_id, max(log_write.id) as max_id
            from log_write
            where lw_table_name = ' || quote_literal( _table_name ) ||
            'group by lw_rec_id'
        loop
            _rec_id = _rec2.lw_rec_id ;
            _max_id = _rec2.max_id ;

            EXECUTE 'delete from log_write
            where id<' || _max_id ||
                ' and lw_rec_id = ' || _rec_id ||
                ' and lw_table_name = ' || quote_literal( _table_name );
        end loop;
    end if;
end loop;

delete from log_write where lw_table_name='schedules' ;

return 1 ;

END;
$$ security definer ;



Вот ее вызов:

Код: sql
1.
select * from f_delete_notmax(); -- собственно чистка log_write


на таблице размером 20 млн. записей зависает на сутки.

План посоветуйте как посмотреть, плз.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463103
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an2k,

осторожно поинтересуюсь:

1 скока дистинктных lw_table_name вы ожЫдаете наблюсть в вашей log_write ?

и
2. есть ли индекс на log_write, начинающийся с lw_table_name , (но, упаси, не богомерзкий текст/варчар_паттерн_опс, а нормально поддерживающий поиск правых/левых ветвей )

фак ультативнои да, похоже вашу задачу писали дятелы на оть@бись, а не для того, чтобы она таки нормально решалась (я бы, наверное, делал её короткими частями, скорее всего, и , возможно, даже в параллель по диапазонам lw_table_name, с небольшой опорной табличкой лога отработанных ключей )
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463111
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an2kПлан посоветуйте как посмотреть, плз.
Код: sql
1.
explain analyze select distinct lw_table_name from log_write ;


но это неинтересно

интересно что--нть типа

Код: sql
1.
2.
3.
4.
5.
6.
7.
deallocate all;
PREPARE foo (text) AS 
select lw_rec_id, max(log_write.id) as max_id
            from log_write
            where lw_table_name = $1
            group by lw_rec_id;
EXPLAIN ANALYZE EXECUTE foo('any_name');


ну и т.п.
хотя и оно не интересно, ибо, имхо, нехрен реализовывать ваш скрипт как он есть вообще.

пс. а конкурирующие читатели писатели у вас имеются ? эдак вы ещё можете всё время в очередь вставать за оными.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463322
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

1. Около 30


2.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
\d log_write
                                      Таблица "public.log_write"
    Колонка    |             Тип             |                      Модификаторы                      
---------------+-----------------------------+--------------------------------------------------------
 id            | integer                     | NOT NULL DEFAULT nextval('log_write_id_seq'::regclass)
 lw_source_id  | integer                     | 
 lw_table_name | character varying(64)       | 
 lw_rec_id     | integer                     | 
 lw_op_code    | character varying(3)        | 
 lw_datetime   | timestamp without time zone | 
Индексы:
    "log_write_pkey" PRIMARY KEY, btree (id)
    "lw_op_code" btree (lw_op_code)
    "lw_rec_id" btree (lw_rec_id)
    "lw_source_id" btree (lw_source_id)
    "lw_table_name" btree (lw_table_name)
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463324
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,
3.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
explain analyze select distinct lw_table_name from log_write ;

                                                          QUERY PLAN                                                          
------------------------------------------------------------------------------------------------------------------------------
 HashAggregate  (cost=249019.88..249020.07 rows=19 width=13) (actual time=8767.140..8767.154 rows=32 loops=1)
   Group Key: lw_table_name
   ->  Seq Scan on log_write  (cost=0.00..234526.10 rows=5797510 width=13) (actual time=0.083..4783.462 rows=5450990 loops=1)
 Planning time: 0.709 ms
 Execution time: 8767.513 ms
(5 строк)



4.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
deallocate all;
PREPARE foo (text) AS 
select lw_rec_id, max(log_write.id) as max_id
            from log_write
            where lw_table_name = $1
            group by lw_rec_id;
EXPLAIN ANALYZE EXECUTE foo('any_name');

                                                              QUERY PLAN                                                               
---------------------------------------------------------------------------------------------------------------------------------------
 HashAggregate  (cost=38389.38..38437.01 rows=4763 width=8) (actual time=0.161..0.161 rows=0 loops=1)
   Group Key: lw_rec_id
   ->  Index Scan using lw_table_name on log_write  (cost=0.56..38327.78 rows=12320 width=8) (actual time=0.119..0.119 rows=0 loops=1)
         Index Cond: ((lw_table_name)::text = 'any_name'::text)
 Execution time: 0.360 ms
(5 строк)



Не могли бы прокомментировать этот результат?

PS: Конкурирующих читателей/писателей нет.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463344
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an2k,
вы всё ещё настаиваете на удалении 20лямов (хотя в плане у вас всего 5.5лямов) записей 1--й транзакцией ?


если да -- то это
1. делается одним запросом.(напишите этот запрос [используйте кляузу USING для набора оставляемых записей] и посмотрите на его план)
//и еще думаю, не помог бы вам тут, часом, индекс (lw_table_name,lw_rec_id,id). не совсем ясно, что у вас с плотностью lw_rec_id -- для получения max(id) по группам и самих групп для using

2. или за один проход for loop по сортированному набору. (факультативно, тут скорее всего это не интересно)
Код: plaintext
ORDER BY lw_table_name , lw_rec_id [, id DESC ]
//один раз тратитесь на сорт, а удаляете позаписно по id или по ctid

немного оффтопапо вашей процедуре:
есть ли у вас таблица "имен таблиц" ? если да, зачем вы упираетесь с дистинктом ? (он конечно сутки не занимает, но все ж таки лишняя работа).

или ознакомьтесь с loose-indexcan--ом. тоже вариант. в вашем случае он (дистинкт) вообще может быть for loop-ом по одной записи, следующей вдоль индекса lw_table_name. (SELECT lw_table_name INTO _lw_table_name FROM mytable WHERE lw_table_name >_lw_table_name ORDER BY lw_table_name LIMIT 1).

и да: не налегайте на динамический sql там, где планируете 10-ки тысяч синтаксических разборов.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463347
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an2k, так не пробовали?
Код: sql
1.
2.
3.
4.
5.
6.
delete from log_write
where (lw_table_name, lw_rec_id, id) not in (
   select lw_table_name, lw_rec_id, max(id)
   from   log_write
   group by lw_table_name, lw_rec_id
);
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463350
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Лузанов,

вот,да. можно и без using.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463378
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
an2k,

А сколько в штуках строк остается?

Может, сделать наоборот:
1. Выбрать остающиеся строки во временную таблицу
2. Очистить имеющуюся таблицу (truncate)
3. Вставить остающиеся записи в таблицу из временной.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463394
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ursido,

это работает если нет конкурентных обращений к табличке.
можно это же сделать без времянок:
-- создаем 2 ротируемые партиечки. можно с триггером before insert [с перегружаемым тестом ф-ии] подстановки номера рабочей партиции на пустом предке, но обычно дешевле с подстановкой имен на уровне хранимок вставки, если обработка в основном массовая )
обеспечиваем лок записи о рабочей партиции на момент ротации. (т.е. очередь, и строгую одномоментность). и переключаем партиции.
после переключения рабочей партиции делаем сдвиг оставляемых записей
что-то типа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
WITH del AS -- удаление из старой партиции
(delete FROM log_write_1 -- подстановка имени старой партиции
WHERE 
lw_table_name, lw_rec_id, id IN 
(
select lw_table_name, lw_rec_id, max(id) AS id
   from   log_write
   group by lw_table_name, lw_rec_id
RETURNING *
)
INSERT INTO log_write_2 -- подстановка имени новой партиции
 SELECT * FROM del -- вставка только что удаленных 
                             --в новую рабочую партицию
;
-- и окончательно
truncate log_write_1;


-- в любой момент табличка--предок доступна для чтения (с точностью до лока потомка на момент транкейта [тут можно выводить потомка из иерархии, что м.б. быстрее транкейта. но это чревато ошибкой в уже спланированных и выполняющихся запросах] )
накладные -- куча хенджоба. и усложнение планов запросов к таблице
выигрыш -- снятие проблем вакуумирования и перестройки индексов при массовой очистке
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463405
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

То что Вы описали сильно напоминает механизм ротации очередей Londiste. Имеет смысл посмотреть их реализацию.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463471
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
All,

Прошу прощения, я не сказал в чем смысл:

В базе несколько таблиц:
Студенты
Преподаватели
Оценки

Они в течении времени могут меняться (исправление опечатки в ФИО, изменение оценки, etc.)

Все эти изменения (включая первичный insert) фиксировались в таблице log_write для того, чтобы другие системы могли периодически получать из этой базы только изменившиеся (или новые) данные.

Для того чтобы системы-потребители знали, что они уже получили и не читали повторно, есть еще таблица log_read, в которой фиксируются сеансы чтения, но это к нашему вопросу не относится.

До сих пор в log_write хранились все изменения, теперь решено оставить только последние, а все неактуальные удалить. Всего их было 20 млн. остаться должно 5-6.

Т.е. необходимо удалить из таблицы log_write все записи, оставив по одной для каждого уникального значения поля lw_table_name, притом с наибольшим для этого значения id.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463582
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузанов,

Попробовал. После трех часов работы остановил.
Более быстрого способа не придумать?
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463583
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ursido,

хорошая идея, но сломал голову, как выбрать только строки с максимальным id
или не выспался или голову на свалку ((
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463590
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
an2k,

Мне кажется, Вам нужно остановиться и собраться с мыслями.
Эта задача написана в темах выше уже несколько раз.

Как соберетесь с мыслями, смотрите (скопировано из поста выше 20528831 ):

Код: sql
1.
2.
3.
select lw_table_name, lw_rec_id, max(id)
   from   log_write
   group by lw_table_name, lw_rec_id

...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463606
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an2kПавел Лузанов,

Попробовал. После трех часов работы остановил.
Более быстрого способа не придумать?
покажите
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
EXPLAIN ANALYZE
delete from log_write
where
  lw_table_name = 'any_lw_table_name'
  AND (lw_table_name, lw_rec_id, id) not in (
   select lw_table_name, lw_rec_id, max(id)
   from   log_write
   where lw_table_name='any_lw_table_name'
   group by lw_table_name, lw_rec_id
);


для какого-нить существующего 'any_lw_table_name', но не самого частого. чтобы уложжиться. и следите за состоянием соединения через pg_stat_activity. т.к. в задаче, как она поставлена, все время присутствуют конкурирующие обращения. (в логируемые таблы кто--то пишет и переписывает)
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463622
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

По постановке задачи от таблицы должно остаться примерно 25% записей. Вариант с удалением вызывает тоску.

Предлагаю следующее действие:

Выбираем строки, которые нужно оставить. Среди них фиксируем самую раннюю дату. Теперь все строки в таблице, более ранние чем зафиксированная дата, можно удалять по дате.

После этого можно вернуться к задаче с меньшим количеством строк.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463638
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ursido,

не спешите.
я хочу увидеть план.
а в нем отсутствие триггеров.
удалить 20 лямов узких рекордов -- это как кот чихнул.
если ничто не мешает.
в последнем я сильно сомневаюсь.

а дальше копируем , на коленке, ротацию с pgq, если помехи есть
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463652
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ursido,

как вариант -- удалять запись--писи в исходной хранимке ТС (вернее её аналога с прямым проходом по сортированному набору) можно автономно через дблинк. это сильно развязывает руки. плюс нарезать головной процесс на слайсы минут по 10--20, посредство statement_timeout для выделенного ползателя. во избежание излишне долгой транзакции. и не надо никаких ротаций. но перестраивать индексы пж-у придётся долго и упорно.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463654
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

Я не смогу его потом развидеть.

В предложенном Вами запросе имеются:

-- Группировка по полям без индекса с составными полями (нет индекса, под эту группировку)
-- Предложение NOT IN (SELECT ...)

Причем эти действия равномерно размазаны между отдельными группами (этих групп со слов автора примерно 5-6 млн).

Какие еще более медленные запросы Вы знаете?
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463658
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

И еще напомню, что прямо сейчас автовакуум отключен. (Надеюсь, только на период интенсивной обработки данных).
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463678
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ursidoqwwq,

Я не смогу его потом развидеть.

В предложенном Вами запросе имеются:

-- Группировка по полям без индекса с составными полями (нет индекса, под эту группировку)
-- Предложение NOT IN (SELECT ...)

Причем эти действия равномерно размазаны между отдельными группами (этих групп со слов автора примерно 5-6 млн).

Какие еще более медленные запросы Вы знаете?
вам же ТС отписался, что это займет примерно Execution time: 8767.513 ms

если так боитеся что NOT IN (SELECT ...) распишите его через
Код: sql
1.
2.
3.
4.
5.
WITH mater AS (SELECT .....)
DELETE ... FROM .... 
WHERE .... 
and NOT EXISTS(SELECT 1 FROM mater
                            WHERE ....) 

это механическая работа

или даже через что--то навроде:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
WITH mater AS (SELECT .....)
DELETE ... FROM ....  t
using mater m
WHERE 
m.k1=t.k1
AND m.k2=t.k2
AND m.id>t.id
AND ...

это ТОЖЕ механическая работа
вы, как минимум, навяжете однократную материализацию (хотя она и так там д.б. однократной)

думаю проблема не в том , чтобы просканировать и сгруппировать всю табличку [Execution time: 8767.513 ms ], а в том, что где--то что--то во что--то упирается.

варианты --
триггера (в т.ч. констрайнтовые)
или локи конкурентов.

пока не узнаем -- дальше не ясно.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463688
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да. Ждем ответа от автора.

Пока продолжим:
qwwq...
вам же ТС отписался, что это займет примерно Execution time: 8767.513 ms
...


И это время (8 секунд) будет затрачено на подзапрос для каждой из строк, которых 20 млн. По-моему тормозилово именно здесь (то есть во вложенном подзапросе)
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463706
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ursido,

смелое предположение.
зависит от того, умеет ли пж делать not in как антиджойн. и если умеет -- то когда.

когда-то в сильно раньшие времена точно не умел. но вода течет. колхозники пашут. трава жухнет. а sun тускнеет.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463716
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq...
зависит от того, умеет ли пж делать not in как антиджойн. и если умеет -- то когда.
...

Автор уже сообщал, что сдался после трех часов ожидания. По внешним признакам - в конкретной ситуации PG не смог по антидждойну (или не захотел). (Исходный запрос: 20528831 ; ответ автора: 20530078 )
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463720
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ursido,

и теперь скажите, зачем вы мешаете мне увидеть план урезанного запроса ?
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463724
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwqursido,

и теперь скажите, зачем вы мешаете мне увидеть план урезанного запроса ?

Подозреваю, что автор честно пытается его получить прямо сейчас. Просто план еще не готов (EXPLANE ANALYZE, да-да. Не какой-нибудь EXPLANE). Проявите терпение.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463734
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ursidoEXPLANE ANALYZE, да-да. Не какой-нибудь EXPLANEуели
но я ожидаю увидеть вклад триггеров. возможно -- напрасно.
т.ч. попросит EXPLAINE без ANALYZE -- в вашей власти. но вы, вместо этого, занялись привычным для себя делом
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463743
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

Смотрите 20528681 .

\d log_write

триггеров не показывает.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463758
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq2. или за один проход for loop по сортированному набору. (факультативно, тут скорее всего это не интересно)
Код: plaintext
ORDER BY lw_table_name , lw_rec_id [, id DESC ]
//один раз тратитесь на сорт, а удаляете позаписно по id или по ctid


примерно так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
CREATE or replace FUNCTION f_delete_notmax() RETURNS void
    LANGUAGE plpgsql
    AS $$
DECLARE
	_rec1 record  ;
	_rec_id integer  ;
	_max_id integer;
	_table_name varchar(32) ;
BEGIN

	for _rec1 in
	    select /*ctid,*/ id, lw_table_name,lw_rec_id 
	    from log_write
	    ORDER BY lw_table_name , lw_rec_id , id DESC 
	loop
		IF _table_name = _rec1.lw_table_name
			AND _rec_id= _rec1.lw_rec_id
		THEN
			/* но лучше в автономии dblink 
			, чтобы при снятии задачи
			проделанная работа не пропадала
			*/
			DELETE FROM log_write
			WHERE --log_write.ctid = rec1.ctid
				 log_write.id = rec1.id;
		ELSE --первая запись группы ORDER by id DESC
			_table_name := _rec1.lw_table_name;
			_rec_id := _rec1.lw_rec_id;
		end if;
		
	end loop;

	delete from log_write where lw_table_name='schedules' ;
END;
$$ security definer ;
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463810
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------
Delete on log_write (cost=9.15..17.18 rows=1 width=6) (actual time=0.167..0.167 rows=0 loops=1)
-> Index Scan using lw_table_name on log_write (cost=9.15..17.18 rows=1 width=6) (actual time=0.158..0.158 rows=0 loops=1)
Index Cond: ((lw_table_name)::text = 'any_lw_table_name'::text)
Filter: (NOT (hashed SubPlan 1))
SubPlan 1
-> HashAggregate (cost=8.58..8.59 rows=1 width=21) (never executed)
Group Key: log_write_1.lw_table_name, log_write_1.lw_rec_id
-> Index Scan using lw_table_name on log_write log_write_1 (cost=0.56..8.57 rows=1 width=21) (never executed)
Index Cond: ((lw_table_name)::text = 'any_lw_table_name'::text)
Planning time: 1.120 ms
Execution time: 0.526 ms
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463814
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
an2k...
Index Cond: ((lw_table_name)::text = 'any_lw_table_name'::text)
...

Товарищ! Вы явно перегрелись. Сделайте паузу.
Вас просили сделать немного (а точнее, очень сильно) другое.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463817
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
                                                           QUERY PLAN                                                            
---------------------------------------------------------------------------------------------------------------------------------
 Delete on log_write  (cost=9.15..17.18 rows=1 width=6) (actual time=0.054..0.054 rows=0 loops=1)
   ->  Index Scan using lw_table_name on log_write  (cost=9.15..17.18 rows=1 width=6) (actual time=0.050..0.050 rows=0 loops=1)
         Index Cond: ((lw_table_name)::text = 'any_lw_table_name'::text)
         Filter: (NOT (hashed SubPlan 1))
         SubPlan 1
           ->  HashAggregate  (cost=8.58..8.59 rows=1 width=21) (never executed)
                 Group Key: log_write_1.lw_table_name, log_write_1.lw_rec_id
                 ->  Index Scan using lw_table_name on log_write log_write_1  (cost=0.56..8.57 rows=1 width=21) (never executed)
                       Index Cond: ((lw_table_name)::text = 'any_lw_table_name'::text)
 Planning time: 0.407 ms
 Execution time: 0.185 ms
(11 строк)
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463857
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an2k,

автордля какого-нить существующего 'any_lw_table_name', но не самого частого.

думаю литерал 'any_lw_table_name' у вас в значениях lw_table_name отсутствует.
найдите какое -нить сущ-ее значение lw_table_name , не самое частое и повторите вывод подставив его значение ВМЕСТО 'any_lw_table_name' в исходный скрипт. (можете для начала опустить словцо ANALYZE )
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463891
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
                                                                              QUERY PLAN                                                                               
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Delete on log_write  (cost=45099.01..90120.78 rows=7361 width=6) (actual time=289.060..289.060 rows=0 loops=1)
   ->  Index Scan using lw_table_name on log_write  (cost=45099.01..90120.78 rows=7361 width=6) (actual time=289.057..289.057 rows=0 loops=1)
         Index Cond: ((lw_table_name)::text = 'students'::text)
         Filter: (NOT (hashed SubPlan 1))
         Rows Removed by Filter: 29613
         SubPlan 1
           ->  HashAggregate  (cost=45022.32..45083.23 rows=6091 width=21) (actual time=241.065..251.146 rows=29613 loops=1)
                 Group Key: log_write_1.lw_table_name, log_write_1.lw_rec_id
                 ->  Index Scan using lw_table_name on log_write log_write_1  (cost=0.56..44911.90 rows=14722 width=21) (actual time=0.087..213.062 rows=29613 loops=1)
                       Index Cond: ((lw_table_name)::text = 'students'::text)
 Planning time: 3.927 ms
 Execution time: 290.153 ms
(12 строк)
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463893
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

а это без ANALYZE

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
                                                       QUERY PLAN                                                       
------------------------------------------------------------------------------------------------------------------------
 Delete on log_write  (cost=45099.01..90120.78 rows=7361 width=6)
   ->  Index Scan using lw_table_name on log_write  (cost=45099.01..90120.78 rows=7361 width=6)
         Index Cond: ((lw_table_name)::text = 'students'::text)
         Filter: (NOT (hashed SubPlan 1))
         SubPlan 1
           ->  HashAggregate  (cost=45022.32..45083.23 rows=6091 width=21)
                 Group Key: log_write_1.lw_table_name, log_write_1.lw_rec_id
                 ->  Index Scan using lw_table_name on log_write log_write_1  (cost=0.56..44911.90 rows=14722 width=21)
                       Index Cond: ((lw_table_name)::text = 'students'::text)
(9 строк)
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39463906
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
an2k,

Таким образом, имеем:
20 млн строк на 30 таблиц (точнее, 32). На одну таблицу должно выходить где-то 600 тыс строк. В приведенном примере задействовано 30 тыс строк. Не самый удачный пример.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464034
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ursido,

это как раз относительно средняя таблица
они вообще там крайне неравномерно представлены:
есть 10-20 шт.
а есть 2.5 млн. и больше
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464035
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ursido,

а можно вопрос: как вы узнали, что таблиц там 32?
это правильное число, но я его не озвучивал и в результатах запросов ее не вижу
...или слеп? ткните плиз
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464041
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an2k
Код: plaintext
1.
2.
3.
4.
5.
explain analyze select distinct lw_table_name from log_write ;

                                                          QUERY PLAN                                                          
------------------------------------------------------------------------------------------------------------------------------
 HashAggregate  (cost=249019.88..249020.07 rows=19 width=13) (actual time=8767.140..8767.154  rows=32  loops=1)
...
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464043
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an2k,

покажите план (explain без аналайз) для какой--либо "большой" таблицы.
и "для всего" (тоже без аналайз)
//есть подозрение


и да, я рекомендую подумать на предмет однопроходной 20530998 очистки в автономиях (можно по 10--1000 записей за раз, это несложная вариация). это много проще, чем на пустом месте разворачивать ротацию партиций. хотя и накладнее.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464044
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
an2k,

Там же есть другие интересные параметры. Читайте RTFM .
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464086
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
-- teachers_marks_link связь препод-оценка

                                                       QUERY PLAN                                                       
------------------------------------------------------------------------------------------------------------------------
 Delete on log_write  (cost=45098.46..328247.26 rows=1349795 width=6)
   ->  Seq Scan on log_write  (cost=45098.46..328247.26 rows=1349795 width=6)
         Filter: (((lw_table_name)::text = 'teachers_marks_link'::text) AND (NOT (hashed SubPlan 1)))
         SubPlan 1
           ->  HashAggregate  (cost=45022.32..45083.23 rows=6091 width=21)
                 Group Key: log_write_1.lw_table_name, log_write_1.lw_rec_id
                 ->  Index Scan using lw_table_name on log_write log_write_1  (cost=0.56..44911.90 rows=14722 width=21)
                       Index Cond: ((lw_table_name)::text = 'students'::text)
(8 строк)
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464087
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
-- без таблицы
                                                       QUERY PLAN                                                       
------------------------------------------------------------------------------------------------------------------------
 Delete on log_write  (cost=45098.46..314922.53 rows=2664945 width=6)
   ->  Seq Scan on log_write  (cost=45098.46..314922.53 rows=2664945 width=6)
         Filter: (NOT (hashed SubPlan 1))
         SubPlan 1
           ->  HashAggregate  (cost=45022.32..45083.23 rows=6091 width=21)
                 Group Key: log_write_1.lw_table_name, log_write_1.lw_rec_id
                 ->  Index Scan using lw_table_name on log_write log_write_1  (cost=0.56..44911.90 rows=14722 width=21)
                       Index Cond: ((lw_table_name)::text = 'students'::text)
(8 строк)
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464098
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузанов,

спасибо, за тонкий намек ))
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464101
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwqan2k,

и да, я рекомендую подумать на предмет однопроходной 20530998 очистки в автономиях (можно по 10--1000 записей за раз, это несложная вариация). это много проще, чем на пустом месте разворачивать ротацию партиций. хотя и накладнее.

вижу что кирилицей, но если честно, не понимаю половины слов ((

- что такое автономия?
- вариация?
- ротация?
- партиция?

блин, 27 лет занимаюсь базами... как я отстал... где я был ((
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464122
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an2k- что такое автономия?
- вариация?
- ротация?
- партиция?

блин, 27 лет занимаюсь базами... как я отстал... где я был ((

автономия -- автономная транзакция. существует в оракле. не существует в постгресе. эмулируется в постгресе встроенным "клиентом" -- расширением dblink
примеры можно найти тут, поиском. или в интернетах. вплоть до забавных

"вариация" -- тут именно вариация. вариация на тему предложенного по ссылке кода добавлением пары переменных, констант и пары--тройки IF--ов. что для вас, с вашим опытом, несложно.

ротация и партиция -- это про ручную реализацию некоторых идей, основанных на 1. транзакционности ддл в пж. 2. наследовании в пж, и его использовании для партицирования (разбиения таблички на отдельные части по какому--либо признаку). т.е. "багровый закат" -- сиречь закат солнца баграми, в поте лица своего. вам оно, даже с вашим опытом, видимо не надо. это для гиков.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464126
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an2kqwwq,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
-- teachers_marks_link связь препод-оценка

                                                       QUERY PLAN                                                       
------------------------------------------------------------------------------------------------------------------------
 Delete on log_write  (cost=45098.46..328247.26 rows=1349795 width=6)
   ->  Seq Scan on log_write  (cost=45098.46..328247.26 rows=1349795 width=6)
         Filter: (((lw_table_name)::text = 'teachers_marks_link'::text) AND (NOT (hashed SubPlan 1)))
         SubPlan 1
           ->  HashAggregate  (cost=45022.32..45083.23 rows=6091 width=21)
                 Group Key: log_write_1.lw_table_name, log_write_1.lw_rec_id
                 ->  Index Scan using lw_table_name on log_write log_write_1  (cost=0.56..44911.90 rows=14722 width=21)
                       Index Cond: ((lw_table_name)::text = 'students'::text)
(8 строк)

C2H5OH на пару...
тщательнее
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464127
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an2kqwwq,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
-- без таблицы
                                                       QUERY PLAN                                                       
------------------------------------------------------------------------------------------------------------------------
 Delete on log_write  (cost=45098.46..314922.53 rows=2664945 width=6)
   ->  Seq Scan on log_write  (cost=45098.46..314922.53 rows=2664945 width=6)
         Filter: (NOT (hashed SubPlan 1))
         SubPlan 1
           ->  HashAggregate  (cost=45022.32..45083.23 rows=6091 width=21)
                 Group Key: log_write_1.lw_table_name, log_write_1.lw_rec_id
                 ->  Index Scan using lw_table_name on log_write log_write_1  (cost=0.56..44911.90 rows=14722 width=21)
                       Index Cond: ((lw_table_name)::text = 'students'::text)
(8 строк)


аналогично, коллега
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464171
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

Покритикуйте вот такой сценарий:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
-- 1. Создаем индекс

CREATE INDEX CONCURRENTLY ix_log_write_001
    ON log_write(lw_table_name, lw_rec_id, id DESC);

-- 2. Создаем таблицу, которая потом станет рабочей. Та же структура, что и у исходной

CREATE TABLE log_write_new (
    id SERIAL,
    lw_source_id INTEGER,
    lw_table_name VARCHAR(64),
    lw_rec_id INTEGER,
    lw_op_code VARCHAR(3),
    lw_datetime timestamp without time zone,
    CONSTRAINT pk_log_write PRIMARY KEY (id)
);

CREATE INDEX ix_log_write_new_lw_rec_id
    ON log_write_new (lw_rec_id);
CREATE INDEX ix_log_write_new_lw_source_id
    ON log_write_new (lw_source_id);
CREATE INDEX ix_log_write_new_lw_table_name
    ON log_write_new (lw_table_name);

-- 3. Делаем таблицу головной. В одной транзакции

BEGIN;

SELECT setval(pg_get_serial_sequence('log_write_new', 'id'), MAX(id) + 10000)
FROM log_write;

ALTER TABLE log_write RENAME TO log_write_arch;

ALTER TABLE log_write_new RENAME TO log_write;

ALTER TABLE log_write_arch INHERIT log_write;

COMMIT;

-- 4. Переносим нужные данные из старой таблицы

INSERT INTO log_write
SELECT DISTINCT ON (lw_table_name, lw_rec_id, id) *
FROM log_write_arch
ORDER BY lw_table_name, lw_rec_id, id DESC;

-- 5. Отцепляем старую таблицу. Она больше не нужна

ALTER TABLE log_write_arch NO INHERIT log_write;

-- 6. Удаляем дубли, которые могли образоваться в момент заполнения таблицы log_write в пункте 4. (По любому из скриптов, приведенным выше)


Теперь нужно проверить наименования индексов. Если не устраивают, переименовать.
Старую таблицу (log_write_arch) можно удалять.


...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464172
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ursido,

В пункте 4 опечатка. Читать как:

Код: sql
1.
2.
3.
4.
INSERT INTO log_write
SELECT DISTINCT ON (lw_table_name, lw_rec_id) *
FROM log_write_arch
ORDER BY lw_table_name, lw_rec_id, id DESC;



В предложении DISTINCT ON 2 (два) поля.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464185
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ursido,

а, что ?
вы его где-то уже описали 20530287
с тех пор он , по моему , не изменился
я неправ ?
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464186
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попутал. тут 20529102
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464191
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

Примерно так. Только еще наследование задействовано. Чтобы не было влияния вновь вставляемых значений.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464386
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в силу 20530287 индекс не нужен.
кроме того на моей памяти "ДИСТИНКТ ОН" не умел пользоваться инд-м. (который тут не нужен), даже когда было нужно т.е. при >>10/1. если планер тут починили -- поправьте меня.

это технически

идеологически -- всё плохо. если уж заниматься хенджобом, то всё должно быть как настоящее -- записи не должны раздвояйца ни в один момент.
наследование от непустой таблички вообще ошибка -- т.к. её аналайз может залочить вам ддл на наследниках. и т.д.
и если бы борьба шла за сжатие 1/10--1/100 и более. За 1/4 вряд ли имеет смысл. написать один джоб с журналом и автономиями -- и ладушки.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464614
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
                                              QUERY PLAN                                              
------------------------------------------------------------------------------------------------------
 Delete on log_write  (cost=287914.29..583495.19 rows=1493428 width=6)
   ->  Seq Scan on log_write  (cost=287914.29..583495.19 rows=1493428 width=6)
         Filter: (((lw_table_name)::text = 'teachers_marks_link'::text) AND (NOT (hashed SubPlan 1)))
         SubPlan 1
           ->  HashAggregate  (cost=273346.11..285000.65 rows=1165454 width=21)
                 Group Key: log_write_1.lw_table_name, log_write_1.lw_rec_id
                 ->  Seq Scan on log_write log_write_1  (cost=0.00..250944.69 rows=2986857 width=21)
                       Filter: ((lw_table_name)::text = 'teachers_marks_link'::text)



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
                                             QUERY PLAN                                              
-----------------------------------------------------------------------------------------------------
 Delete on log_write  (cost=309730.12..590432.29 rows=2975748 width=6)
   ->  Seq Scan on log_write  (cost=309730.12..590432.29 rows=2975748 width=6)
         Filter: (NOT (hashed SubPlan 1))
         SubPlan 1
           ->  HashAggregate  (cost=280702.16..303924.53 rows=2322237 width=21)
                 Group Key: log_write_1.lw_table_name, log_write_1.lw_rec_id
                 ->  Seq Scan on log_write log_write_1  (cost=0.00..236065.95 rows=5951495 width=21)
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464841
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
All,

В итоге сделал так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
CREATE or replace FUNCTION f_delete_notmax() RETURNS integer
    LANGUAGE plpgsql
    AS $$
DECLARE
_rec1 record  ;
_rec2 record  ;
_rec_id integer := 0  ;
_max_id integer := 0  ;
_table_name varchar(32) ;
BEGIN

EXECUTE 'create table log_write_tmp as select * from log_write where id=0';
delete from log_write_tmp ;

for _rec1 in
    select distinct lw_table_name from log_write
loop
    _table_name = _rec1.lw_table_name ;
    RAISE NOTICE 'table_name: %', _table_name;

    for _rec2 in
        EXECUTE 'select lw_rec_id, max(log_write.id) as max_id
            from log_write
            where lw_table_name = ' || quote_literal( _table_name ) ||
            'group by lw_rec_id'
    loop
        _max_id = _rec2.max_id ;
        EXECUTE 'insert into log_write_tmp select * from log_write where id = ' || _max_id ;
    end loop;
end loop;

delete from log_write;
EXECUTE 'insert into log_write select * from log_write_tmp' ;
drop table log_write_tmp ;

return 1 ;

END;
$$ security definer ;


Не мгновенно, но отработало и не зависло.

Спасибо всем, кто пытался мне помочь.

Возможно этот пост поможет еще кому-нибудь.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464867
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an2kAll,

В итоге сделал так:


для человека, 27 лет кодировавшего базульки, вы слишком сильно зациклены на динамическом SQL.

почему бы не попробовать избавиться от дуной привычке на 28-м году недопонимания ?
зачем вам 5 лямов лишних синтакс--анализов ?
неужто так не сработает :
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
CREATE or replace FUNCTION f_delete_notmax() RETURNS integer
    LANGUAGE plpgsql
    AS $$
DECLARE
_rec1 record  ;
_rec2 record  ;
_rec_id integer := 0  ;
_max_id integer := 0  ;
_table_name varchar(32) ;
BEGIN

create table log_write_tmp as select * from log_write where id=0;
delete from log_write_tmp ;

for _rec1 in
    select distinct lw_table_name from log_write
loop
    _table_name = _rec1.lw_table_name ;
    RAISE NOTICE 'table_name: %', _table_name;

    for _rec2 in
        select lw_rec_id, max(log_write.id) as max_id
            from log_write
            where lw_table_name =  _table_name 
            group by lw_rec_id
    loop
        _max_id = _rec2.max_id ;
        insert into log_write_tmp select * from log_write where id = _max_id ;
    end loop;
end loop;

delete from log_write;
insert into log_write select * from log_write_tmp ;
drop table log_write_tmp ;

return 1 ;

END;
$$ security definer ;
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464875
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

Сплошное разочарование.

Зачем выбирать данные дважды? (Один раз выбирать max(id), второй раз - непосредственно строку)
Уже же был пример, который выбирает за один запрос (пример с DISTINCT ON).

Что мешает создать новую таблицу по-честному? Затем удалить старую, а новую подложить на ее место? Зачем гонять данные туда-сюда?

Что произошло с индексами в результате перекидывания данных лопатой преобразований данных? - Они распухли. Ваш КО. Что дальше?
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464881
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+5коп.

Код: plaintext
delete from log_write;
заменить на
Код: plaintext
truncate table log_write;
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464903
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ursidoЧто мешает создать новую таблицу по-честному? Затем удалить старую, а новую подложить на ее место?
Могут помешать зависимые объекты, например представления.
Также нужно восстанавливать права доступа к таблице.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464914
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ursidoqwwq,

Сплошное разочарование.

это не ко мне. автор текста -- сам ТС. я всего лишь обратил его внимание на лишних 5лямов случаев синтекс--анализа (и планирования).
но он 27 лет кодит базульки. т.ч. вряд ли прислушается ко мне, к вам, или к павлу.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39464917
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Лузанов+5коп.

Код: plaintext
delete from log_write;
заменить на
Код: plaintext
truncate table log_write;

про
Код: plaintext
truncate table log_write;
кажется более чем разумным. однако транкейт, насколько я помню, немного не слишком транзакционен. кое что может пропасть мимо тазика. надо подумать (утверждать не готов).

про
Код: plaintext
delete from log_write;
в случае рид--коммитеда и конкурентной записи в таблицу новых id всё довольно печально -- будет удалено немного больше чем надо, новых (по отношению к моменту выделения оставляемых,) записей. т.е. в таком порядке можно работать только запуская всю процедуру в снепшоте.
(а транкейт уж точно потеряет новые, не попавшие в обработку, записи)

вот почему для использования truncate-а лучше рисовать полноценную ротацию 2-х партиций. (но это недоступно ТС).
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39465307
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ursidoqwwq,

Сплошное разочарование.

Зачем выбирать данные дважды? (Один раз выбирать max(id), второй раз - непосредственно строку)
Уже же был пример, который выбирает за один запрос (пример с DISTINCT ON).

Что мешает создать новую таблицу по-честному? Затем удалить старую, а новую подложить на ее место? Зачем гонять данные туда-сюда?

Что произошло с индексами в результате перекидывания данных лопатой преобразований данных? - Они распухли. Ваш КО. Что дальше?

Коллеги, спасибо за активное желание помочь, однако я опять не понимаю половины:
- Нередко два запроса получается быстрее чем один с чем-нибудь вроде DISTINCT, впрочем это я согласен - нужно проверить.
- "Ваш КО" - КО это что? как расшифровать?
- Почему распухли индексы? Я как раз именно так сделал, как сделал, чтобы не переиндексировать отдельно новую таблицу.
- ТС - еще одно сокращение-загадка ((
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39465310
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузанов+5коп.

Код: plaintext
delete from log_write;
заменить на
Код: plaintext
truncate table log_write;


разница существенна? в чем она?
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39465312
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел ЛузановursidoЧто мешает создать новую таблицу по-честному? Затем удалить старую, а новую подложить на ее место?
Могут помешать зависимые объекты, например представления.
Также нужно восстанавливать права доступа к таблице.
В данном случае этого ничего нет, но есть индексы и их очень долго строить, поэтому сделал так.
Не уверен, что это лучшее решение - просто мне показалось так проще.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39465313
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an2kПавел Лузанов+5коп.

Код: plaintext
delete from log_write;
заменить на
Код: plaintext
truncate table log_write;


разница существенна? в чем она?для человека , 27 лет занимающегося базами вы чересчур молодо выглядите

https://postgrespro.ru/docs/postgrespro/9.5/sql-truncate
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39465314
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwqПавел Лузанов+5коп.

Код: plaintext
delete from log_write;
заменить на
Код: plaintext
truncate table log_write;

про
Код: plaintext
truncate table log_write;
кажется более чем разумным. однако транкейт, насколько я помню, немного не слишком транзакционен. кое что может пропасть мимо тазика. надо подумать (утверждать не готов).

про
Код: plaintext
delete from log_write;
в случае рид--коммитеда и конкурентной записи в таблицу новых id всё довольно печально -- будет удалено немного больше чем надо, новых (по отношению к моменту выделения оставляемых,) записей. т.е. в таком порядке можно работать только запуская всю процедуру в снепшоте.
(а транкейт уж точно потеряет новые, не попавшие в обработку, записи)

вот почему для использования truncate-а лучше рисовать полноценную ротацию 2-х партиций. (но это недоступно ТС).

Могу это проделать в монопольном режиме, без оглядки на действия других - их нет.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39465320
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwqan2kAll,

В итоге сделал так:


для человека, 27 лет кодировавшего базульки, вы слишком сильно зациклены на динамическом SQL.

почему бы не попробовать избавиться от дуной привычке на 28-м году недопонимания ?
зачем вам 5 лямов лишних синтакс--анализов ?
неужто так не сработает :
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
CREATE or replace FUNCTION f_delete_notmax() RETURNS integer
    LANGUAGE plpgsql
    AS $$
DECLARE
_rec1 record  ;
_rec2 record  ;
_rec_id integer := 0  ;
_max_id integer := 0  ;
_table_name varchar(32) ;
BEGIN

create table log_write_tmp as select * from log_write where id=0;
delete from log_write_tmp ;

for _rec1 in
    select distinct lw_table_name from log_write
loop
    _table_name = _rec1.lw_table_name ;
    RAISE NOTICE 'table_name: %', _table_name;

    for _rec2 in
        select lw_rec_id, max(log_write.id) as max_id
            from log_write
            where lw_table_name =  _table_name 
            group by lw_rec_id
    loop
        _max_id = _rec2.max_id ;
        insert into log_write_tmp select * from log_write where id = _max_id ;
    end loop;
end loop;

delete from log_write;
insert into log_write select * from log_write_tmp ;
drop table log_write_tmp ;

return 1 ;

END;
$$ security definer ;



Уважаемый qwwq!

Я как и все стараюсь избегать динамических запросов, но кривые ручки - сходу не получилось, а ваш вариант заработал - респект!

Про мои 27 лет за консолью: вы не успеете оглянуться, как сможете и о себе сказать то же самое - никакого снобизма - только грусть.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39465324
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an2k,
по мелочи:
Код: sql
1.
2.
create table log_write_tmp as select * from log_write where id=0;
delete from log_write_tmp ;


можно:
Код: sql
1.
create table log_write_tmp as select * from log_write where /*1=0*/ false ;




а чтобы не злоупотреблять монополией для задач обслуживания -- посмотрите в сторону dblink.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
create extension if not exists dblink;
CREATE SERVER autonomous
   FOREIGN DATA WRAPPER dblink_fdw
  OPTIONS (port '5433');
ALTER SERVER autonomous
  OWNER TO postgres;
create USER MAPPING FOR postgres SERVER autonomous;
-- test
SELECT * from dblink ('autonomous'
	, 'SELECT
		version()
		,current_database() 
		,inet_server_addr() 
		,inet_server_port()
		'
	) 
AS t 	(
	"version" text
	,db name
	,addr inet
	,port int
	);
-- test
.... и т.д. по примерам из интернетов

...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39465594
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемый qwwq,
вы больше всех потратили времени на то, чтобы помочь мне с моей маленькой проблемой.
Позвольте выразить Вам искреннюю благодарность.

Конечно большое спасибо и Павлу и другим людям, которые приняли в этом участие.

Однако, это была только мелкая часть моих забот. На всю задачу в целом можно взглянуть здесь:
https://er.mgimo.ru/node/4297892

Прошу уважаемый All посоветовать: открыть ли мне на этом сайте новую ветку и/или где-то еще?
В ближайшее время хочу выложить исходники на GitHub, возможно народ поддержит.

Впрочем будут, видимо, и ссылки на аналогичные проекты и критика предлагаемого - все приму с благодарностью.

Хочу сказать еще одну банальность: то что мы делаем в своем ВУЗе может оказаться полезным и в других местах - кажется инструмент может получится довольно универсальным, если повезет и образуется сильное комьюнити.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39465601
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
an2k,

Систем обмена данными - как грязи. Путь будет еще одна. Все равно никто не заметит.

Есть целый стандарт . Причем он появился раньше чем Вас заперли в подвале чем Вы сели за консоль.

Прямо сейчас есть туева хуча коммерческих реализаций обмена данными: начиная от 1C и заканчивая различными модными API.

А так да, пишите. Нам очень интересно.
...
Рейтинг: 0 / 0
Postgres не хочет юзать память
    #39465697
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ursido,

Стандарты - это просто слова. UNECE EDIFACT подталкивает к XML - мы с него начинали года три назад, казалось неэффективно - слишком медленно. Это для сервисов годится, а мы он них отказались в пользу центральной точки обмена.

Лет 10 назад у нас купили Вэбсферу от IBM за бешеные деньги - ниасилили и положили на полку.
Нашей группе повезло меньше - когда мы начали денег уже не стало, а обмен нужен - решили строить сами.

Вы упомянули еще о различных API - порекомендуете что-то конкретное?
...
Рейтинг: 0 / 0
75 сообщений из 75, показаны все 3 страниц
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Postgres не хочет юзать память
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]