
Darafei
31.08.2017
15:29:57
место ты, правда, таким стиранием на диск не вернёшь

Artem
31.08.2017
15:30:42
мне только логический объем уменьшить надо.

Алексей
31.08.2017
15:31:06

Artem
31.08.2017
15:31:13
мы переносить ее будем и версию postgres поднимать, там будет даунтайм уже

Google

Сергей
31.08.2017
15:31:33
а почему диск не уменьшится?
вакуум же потом освободит

Darafei
31.08.2017
15:31:42
если на ней индексы есть, то вакуум будет больно

Artem
31.08.2017
15:31:50
ну вроде как full wacum нужен
чтобы место высвободить

Darafei
31.08.2017
15:32:01
вакуум освободит из конца, а в конец всё дописывается
а передвинуть тапл между страничками у постгреса кроме как cluster и vacuum full надёжных сценариев, кажется, нет
мы напоролись, что вакуум на больших таблицах всегда перебирает индексы целиком, и иногда это начинает быть минутами

Сергей
31.08.2017
15:34:24
то есть на больших таблицах лучше сразу партиции делать?
на вырост. так?
чтобы потом не страдать

Darafei
31.08.2017
15:34:43
вообще, лучше бы постгрес починить в этом плане

Сергей
31.08.2017
15:34:58
ну починить я точно не смогу, а вот сена подложить да

Google

Darafei
31.08.2017
15:35:15
но да, мы тут стали по гигабайту резать
до того резали по суткам, чтобы стирать удобно было


Artem
31.08.2017
15:37:56
а вообще, delete from table where ctid in (select ctid from table where date > now()-interval '1 day' limit 1000)
ну вообще как то не айс
cdrdb=# explain delete from ops_history where ctid in (select ctid from ops_history where age(to_timestamp(ops_history.clock)) > interval '21 days' limit 10);
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------
Delete on ops_history (cost=0.00..408793982.76 rows=10 width=36)
-> Nested Loop Semi Join (cost=0.00..408793982.76 rows=10 width=36)
Join Filter: (public.ops_history.ctid = "ANY_subquery".ctid)
-> Seq Scan on ops_history (cost=0.00..41378186.35 rows=2449438635 width=6)
-> Materialize (cost=0.00..1.18 rows=10 width=36)
-> Subquery Scan on "ANY_subquery" (cost=0.00..1.13 rows=10 width=36)
-> Limit (cost=0.00..1.03 rows=10 width=6)
-> Seq Scan on ops_history (cost=0.00..84243362.46 rows=816479545 width=6)
Filter: (age((('now'::cstring)::date)::timestamp with time zone, to_timestamp((clock)::double precision)) > '21 days'::interval)
(9 rows)
и весит уже минут 5
на 10ти записях


Darafei
31.08.2017
15:38:29
а если взять какой-нибудь другой id?

Alexander
31.08.2017
15:38:34
Да, та же фигня была
Делал удаления по ctid в таблице на 1 млн -- очень долго работало.

Darafei
31.08.2017
15:39:07
age(ts)>'21 days' не ускорится индексом

Yura
31.08.2017
15:39:30

Viktor
31.08.2017
15:39:48
если его нагрузить немного, то драйвер начинает кашлять

Artem
31.08.2017
15:40:24
cdrdb=# select ctid from ops_history where age(to_timestamp(ops_history.clock)) > interval '21 days' limit 10;
ctid
--------------
(3351904,1)
(3351904,2)
(3351904,3)
(3351904,4)
(3351904,5)
(3351904,6)
(3351904,7)
(3351904,8)
(3351904,9)
(3351904,10)
(10 rows)
Time: 0.459 ms
cdrdb=#
а селектом быстро выстаскивает все

Darafei
31.08.2017
15:43:00
ага, по = и limit 1 будет tid scan
where ctid in ('(0,0)', '(1,1)'); даёт tid scan
я не знаю, как сделать tid scan с подзапросом
можно сделать генератор делитов с прошитым списком tid

Ivan
31.08.2017
15:53:26

Artem
31.08.2017
15:54:10
а нет хинта который принудительно включает Seq Scan

Google

Artem
31.08.2017
15:54:11
?

Darafei
31.08.2017
15:56:10
psql -c "copy (select 'delete from ops_history where id in ('' ' || string_agg(ctid, ''',''')' || ' )'' ');' from ops_history where clock > extract(epoch from now() - interval '21 days') to stdout with csv header" | psql
кавычки править, пока не заработает

Artem
31.08.2017
15:58:46
вообще огонь!
спасибо

Darafei
31.08.2017
16:03:57
только учитывай, что нужно держать баланс между размером стираемой области и временем выполнения запроса
потому что ты начнёшь на seq scan стирать таблицу с начала, и на повторных seq scan он будет проходить по страничкам, в которых всё уже удалено, с каждым разом всё медленнее выполняя запрос
хотя, если у тебя параллельно крутится какой-то ещё seq scan, то synchronized seq scan начнёт тебе скан не с нуля, рандомизируя этот фактор