@pgsql

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

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

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
C#, у меня тут такого нет
Вроде, в NPgsql был не плохой встроенный пул. И он плохо дружил с pg_bouncer.

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

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 начнёт тебе скан не с нуля, рандомизируя этот фактор

Страница 450 из 1062