Lists: | pgsql-ru-general |
---|
From: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
---|---|
To: | |
Cc: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Чистка таблиц |
Date: | 2012-01-06 23:04:04 |
Message-ID: | 20120106230404.GE883@apache.rbscorp.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
Имеются таблицы
|t1_id|...|
|t2_id|t1_id|...|
|t3_id|...|
|t4_id|t1_id|t3_id|...|
То есть таблички с форейгнами.
Объявлены столбики связей так:
t1_id INTEGE REFERENCES t1 (t1_id) ON DELETE CASCADE ON UPDATE
CASCADE;
в одной из таблиц ON DELETE SET NULL;
Ну и значит в таблице
t1 ~ 2.5 млн записей
t2 ~ 0.5 млн записей
t3 - 10 записей
t4 ~ 1 млн записей
теперь удаляем
DELETE FROM t1 WHERE id = 2919364;
запрос выполняется немерянное количество времени.
План показывает примерно такой:
QUERY PLAN
----------------------------------------------------------------------------------------
Delete on t1 (cost=0.00..8.59 rows=1 width=6)
-> Index Scan using t1_pkey on t1 (cost=0.00..8.59 rows=1 width=6)
Index Cond: (id = 2919364)
(3 rows)
Памяти на инстансе мало. да. 1Гиг всего. Таблицы занимают примерно 2.5 Гиг.
Получается что добавление записей в эти таблицы (это таблицы с логами)
работает без задержек. А удаление записей - примерно одна в три
минуты. Причем удаление по PRIMARY KEY.
Вопрос что можно сделать/посмотреть/переделать, чтобы можно было
нормально чистить логи в такой таблице?
--
. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
From: | Dmitriy Igrishin <dmitigr(at)gmail(dot)com> |
---|---|
To: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
Cc: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: [pgsql-ru-general] Чистка таблиц |
Date: | 2012-01-07 10:47:03 |
Message-ID: | CAAfz9KPN1fXAPW76RD4Qx86vPLdxBL_46wb=_BUzQRkhBfELvA@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
С Рождеством !
7 января 2012 г. 3:04 пользователь Dmitry E. Oboukhov <unera(at)debian(dot)org>написал:
> Имеются таблицы
>
> |t1_id|...|
> |t2_id|t1_id|...|
> |t3_id|...|
> |t4_id|t1_id|t3_id|...|
>
> То есть таблички с форейгнами.
>
> Объявлены столбики связей так:
>
> t1_id INTEGE REFERENCES t1 (t1_id) ON DELETE CASCADE ON UPDATE
> CASCADE;
>
>
> в одной из таблиц ON DELETE SET NULL;
>
> Ну и значит в таблице
>
> t1 ~ 2.5 млн записей
> t2 ~ 0.5 млн записей
> t3 - 10 записей
> t4 ~ 1 млн записей
>
> теперь удаляем
>
> DELETE FROM t1 WHERE id = 2919364;
>
> запрос выполняется немерянное количество времени.
>
> План показывает примерно такой:
>
> QUERY PLAN
>
> ----------------------------------------------------------------------------------------
> Delete on t1 (cost=0.00..8.59 rows=1 width=6)
> -> Index Scan using t1_pkey on t1 (cost=0.00..8.59 rows=1 width=6)
> Index Cond: (id = 2919364)
> (3 rows)
>
> Памяти на инстансе мало. да. 1Гиг всего. Таблицы занимают примерно 2.5 Гиг.
>
> Получается что добавление записей в эти таблицы (это таблицы с логами)
> работает без задержек. А удаление записей - примерно одна в три
> минуты. Причем удаление по PRIMARY KEY.
>
> Вопрос что можно сделать/посмотреть/переделать, чтобы можно было
> нормально чистить логи в такой таблице?
>
Можно попробовать принцип "разделяй и властвуй" -
воспользоваться разбиением дочерних таблиц (t2 и t4),
например, по диапазонам значений их внешних ключей
(t1 и t3), как рассказывается здесь:
http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html
--
// Dmitriy.
From: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
---|---|
To: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: Re: [pgsql-ru-general] Чистка таблиц |
Date: | 2012-01-07 10:58:37 |
Message-ID: | 20120107105836.GH883@apache.rbscorp.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
> Можно попробовать принцип "разделяй и властвуй" -
> воспользоваться разбиением дочерних таблиц (t2 и t4),
> например, по диапазонам значений их внешних ключей
> (t1 и t3), как рассказывается здесь:
> http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html
Партицирование имеет смысл, если хочется данные именно сохранить. а
тут я хочу банально удалять все что старше двух недель (логи).
и наткнулся на вот такие вот тормоза
--
. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
From: | Dmitriy Igrishin <dmitigr(at)gmail(dot)com> |
---|---|
To: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
Cc: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: [pgsql-ru-general] Re: [pgsql-ru-general] Чистка таблиц |
Date: | 2012-01-07 11:02:40 |
Message-ID: | CAAfz9KOdJH0CR5mCY8gDa6mJa1UgiXNNDNrCjuOYiSWPGtU1eQ@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
7 января 2012 г. 14:58 пользователь Dmitry E. Oboukhov
<unera(at)debian(dot)org>написал:
> > Можно попробовать принцип "разделяй и властвуй" -
> > воспользоваться разбиением дочерних таблиц (t2 и t4),
> > например, по диапазонам значений их внешних ключей
> > (t1 и t3), как рассказывается здесь:
> > http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html
>
> Партицирование имеет смысл, если хочется данные именно сохранить. а
> тут я хочу банально удалять все что старше двух недель (логи).
>
Ну и удаляйте :-)
Только ведь Вы хотите ускорения и не за счёт обновления
оборудования? Ускорить можно за счёт разбиения одного
индекса на множество, что позволит механизму исключения
ограничений работать с более мелкими индексами и
использовать меньший объём памяти. Смысл разбиения в этом.
>
> и наткнулся на вот такие вот тормоза
> --
>
> . ''`. Dmitry E. Oboukhov
> : :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
> `. `~’ GPGKey: 1024D / F8E26537 2006-11-21
> `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
>
--
// Dmitriy.
From: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
---|---|
To: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: Re: [pgsql-ru-general] Re: [pgsql-ru-general] Чистка таблиц |
Date: | 2012-01-07 11:06:52 |
Message-ID: | 20120107110651.GJ883@apache.rbscorp.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
> Ну и удаляйте :-)
> Только ведь Вы хотите ускорения и не за счёт обновления
> оборудования? Ускорить можно за счёт разбиения одного
> индекса на множество, что позволит механизму исключения
> ограничений работать с более мелкими индексами и
> использовать меньший объём памяти. Смысл разбиения в этом.
Мне вот непонятно, почему
1. выборка происходит быстро
2. добавление записей происходит быстро
3. удаление происходит медленно
может можно просто тюнингом индексов играть как-то?
--
. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
From: | Dmitriy Igrishin <dmitigr(at)gmail(dot)com> |
---|---|
To: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
Cc: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: [pgsql-ru-general] Re: [pgsql-ru-general] Чистка таблиц |
Date: | 2012-01-07 11:07:58 |
Message-ID: | CAAfz9KOdTz4M4VEqAUZ5uq43YL-1M7sSjP3_jO4+10L-7Yt_bg@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
7 января 2012 г. 14:58 пользователь Dmitry E. Oboukhov
<unera(at)debian(dot)org>написал:
> > Можно попробовать принцип "разделяй и властвуй" -
> > воспользоваться разбиением дочерних таблиц (t2 и t4),
> > например, по диапазонам значений их внешних ключей
> > (t1 и t3), как рассказывается здесь:
> > http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html
>
> Партицирование имеет смысл, если хочется данные именно сохранить. а
> тут я хочу банально удалять все что старше двух недель (логи).
>
Да и вообще, если Вы знаете точные сроки, то как раз
разбиение на части по периодам и ротация этих частей -
это как раз то, что Вам нужно. Удаление будет осуществляться
через DROP TABLE ...
// Dmitriy.
From: | Dmitriy Igrishin <dmitigr(at)gmail(dot)com> |
---|---|
To: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
Cc: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: [pgsql-ru-general] Re: [pgsql-ru-general] Re: [pgsql-ru-general] Чистка таблиц |
Date: | 2012-01-07 11:18:40 |
Message-ID: | CAAfz9KMq=_f3DBujMw9KAeaRqhj8JL5Ei59ou5LfUu-WxVfHHw@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
7 января 2012 г. 15:06 пользователь Dmitry E. Oboukhov
<unera(at)debian(dot)org>написал:
>
> > Ну и удаляйте :-)
> > Только ведь Вы хотите ускорения и не за счёт обновления
> > оборудования? Ускорить можно за счёт разбиения одного
> > индекса на множество, что позволит механизму исключения
> > ограничений работать с более мелкими индексами и
> > использовать меньший объём памяти. Смысл разбиения в этом.
>
> Мне вот непонятно, почему
> 1. выборка происходит быстро
> 2. добавление записей происходит быстро
> 3. удаление происходит медленно
>
> может можно просто тюнингом индексов играть как-то?
>
Удаление на самом деле обновляет каждую запись
для последующего VACUUM. В этом плане, предпочтительнее
использовать TRUNCATE там где это возможно, или же
DROP TABLE ... на отдельную часть (в Вашем случае дочерней) таблицы.
--
// Dmitriy.
From: | Anton Krasikov <krasikov(at)gmail(dot)com> |
---|---|
To: | Dmitriy Igrishin <dmitigr(at)gmail(dot)com> |
Cc: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>, pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: [pgsql-ru-general] Re: [pgsql-ru-general] Re: [pgsql-ru-general] Re: [pgsql-ru-general] Чистка таблиц |
Date: | 2012-01-07 11:36:12 |
Message-ID: | CAOgKZSjAWKhv0cd90gaLb8acKa-pnySYrYWxO+xLrB45MJPQ2A@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
В данной ситуации действительно лучше всего использовать
партицирование. Тогда медленный DELETE заменяется просто на DROP.
--
Best regards,
Anton Krasikov
2012/1/7 Dmitriy Igrishin <dmitigr(at)gmail(dot)com>:
>
>
> 7 января 2012 г. 15:06 пользователь Dmitry E. Oboukhov <unera(at)debian(dot)org>
> написал:
>
>>
>> > Ну и удаляйте :-)
>> > Только ведь Вы хотите ускорения и не за счёт обновления
>> > оборудования? Ускорить можно за счёт разбиения одного
>> > индекса на множество, что позволит механизму исключения
>> > ограничений работать с более мелкими индексами и
>> > использовать меньший объём памяти. Смысл разбиения в этом.
>>
>> Мне вот непонятно, почему
>> 1. выборка происходит быстро
>> 2. добавление записей происходит быстро
>> 3. удаление происходит медленно
>>
>> может можно просто тюнингом индексов играть как-то?
>
> Удаление на самом деле обновляет каждую запись
> для последующего VACUUM. В этом плане, предпочтительнее
> использовать TRUNCATE там где это возможно, или же
> DROP TABLE ... на отдельную часть (в Вашем случае дочерней) таблицы.
>
> --
> // Dmitriy.
>
>
From: | eshkinkot(at)gmail(dot)com ( Сергей Бурладя =?utf-8?B?0L0=?=) |
---|---|
To: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
Cc: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: Чистка таблиц |
Date: | 2012-01-07 20:53:41 |
Message-ID: | 87obuf2q0a.fsf@home.progtech.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
"Dmitry E. Oboukhov" <unera(at)debian(dot)org> writes:
> Имеются таблицы
>
> |t1_id|...|
> |t2_id|t1_id|...|
> |t3_id|...|
> |t4_id|t1_id|t3_id|...|
>
> То есть таблички с форейгнами.
>
> Объявлены столбики связей так:
>
> t1_id INTEGE REFERENCES t1 (t1_id) ON DELETE CASCADE ON UPDATE
> CASCADE;
foreign key не создают индексы, у Вас созданы на каждой таблице индексы по foreign key?
> План показывает примерно такой:
>
> QUERY PLAN
> ----------------------------------------------------------------------------------------
> Delete on t1 (cost=0.00..8.59 rows=1 width=6)
> -> Index Scan using t1_pkey on t1 (cost=0.00..8.59 rows=1 width=6)
> Index Cond: (id = 2919364)
> (3 rows)
А какая версия сервера? Здесь скорее всего не показываются вызовы служебных триггеров foreign key
в которых возможно при отсутствии индексов по t1_id проверка и обновление внешних ключей идёт
по seq scan.
--
С уважением, Сергей Бурладян