powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Vacuum Full без полного лока таблицы
154 сообщений из 154, показаны все 7 страниц
Vacuum Full без полного лока таблицы
    #37006671
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По мотивам http://www.depesz.com/index.php/2010/10/17/reduce-bloat-of-table-without-longexclusive-locks/
Я за недельку написал и отладил в 100 где то раз более быструю реализацию той же идеи с нормальным управлением и не насилующую триггера ON UPDATE (если таковые есть на таблице).
В итоге получилась утилита всего в 4 раза медленне чем VF но не приводящая к полным локам таблицы и распуханию индексов.

брать здесь:
svn checkout http://compacttable.googlecode.com/svn/trunk/ compacttable-read-only
Использовать: запустить vacuum_table.pl --help она все скажет.

Обсуждать или здесь или здесь где удобнее.
Предложения и баг репорты приветствуются.

Приятные особенности:
1)просто в использовании
2)не вызывает распухания индексов
3)можно выполнять инкременатально (т.е. можно прервать работу и запустить заново нормально не с начала)
4)шустрая весьма
5)нормально взаимодествует с наличием триггеров и rules на таблицах (с рулами не тестил но должно)
6)оно работает :)

На тестовом примере созданном следующим образом:
Код: plaintext
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.
DROP TABLE IF EXISTS __test;
CREATE TABLE __test as select id,random() as f1,random() as
f2,random()::text as f3,now() as mtime,(random()> 1 )::boolean as flag
FROM generate_series( 1 , 10000000 ) as t(id);
DELETE FROM __test where id% 5 <> 0 ;
ALTER TABLE __test add primary key (id);
CREATE INDEX __test_f1_key ON __test(f1);
CREATE INDEX __test_f2_key ON __test(f2);
CREATE INDEX __test_f3_key ON __test(f3);
VACUUM __test;
CREATE OR REPLACE FUNCTION __set_mtime() RETURNS trigger
   LANGUAGE plpgsql
   AS $$
BEGIN
       NEW.mtime = clock_timestamp();
       return NEW;
END;
$$;
CREATE TRIGGER set_mtime
   BEFORE UPDATE ON __test
   FOR EACH ROW
   EXECUTE PROCEDURE __set_mtime();

SELECT sum(pg_relation_size('public.'
||indexname))::bigint/current_setting('block_size')::bigint
FROM pg_indexes WHERE schemaname='public' AND tablename='__test';
SELECT pg_relation_size('__test')/current_setting('block_size')::bigint;

По итогам сравнительного тестирования получилось у меня:

 1 )VACUUM FULL __test;
Table size (pages)  113574  ->  22714 
Index size (pages)  26364   ->  51616  (index bloat  95 %)
Time:  211873 , 227  ms ( 3 . 5  minutes)
( 3 . 5  минуты таблица недоступна вообще ни для чего ну и индексы в двое распухли)

vs

 2 )time ./vacuum_table.pl --table=__test
Table size (pages)  113574  ->  23594 
Index size (pages)  26364   ->  32242  (index bloat:  22 %)
real    12m10.300s
(в  4  раза медленее зато никакой блокировки таблицы и индексы не пухнут).

Уже было использовано в боевых условиях для ужатия таблицы распухшей из-за идиотов програмистов до 200Gb (ужалось до 20Gb) (потребовалось всего около 18 часов при этом таблица все это время оставалась доступной для работы что было критично в данном случае).

В общем получилась вполне рабочая тулза которая если бы была под рукой последние 2 года сэкономила бы мне кучу времени и нервов.

Из того что надо отметить из тонкостей:
1)Postgres 8.4 и выше
2)pl/pgsql установленный в базе
3)superuser доступ
4)не работает если есть 'always' или 'replica' триггеры (я за свою жизнь ни одного не видел в реальной задаче)
5)не может ужать распухший TOAST (увы)
6)слегка индексы пухнут но именно слегка а не в 2 раза как от VF
7)на активной таблице мождет deadlock давать иногда но я пока в реальности не видел
8)может давать серьезный index bloat если запустить паралельно с очень долгой транзакцией
9)игнорит fillfactor у таблтицы (увы)
10)чтобы в конце процесса отрезать чистые страницы в конце таблицы всеравно понадобится короткий exclusive lock
11)не работает под windows (хранимка то работает конечно а скрипт управляющий увы)
12)всякие баги невыловленные заранее (тестировал как мог)


Дополнительно выявленные проблемы:

1)vacuum далеко не всегда успевает схватить exclusive lock чтобы уменьшить размер уже упакованной таблицы, в итоге получается ситуация когда последние 10gb таблицы пустые а место все еще занято, для обхода этой ситуации был доработан скрипт и в него было внесено повторение vacuum до 8 раз с увеличивающимися интервалами чтобы всетаки с хорошими шансами таблицу уменьшить.

ToDo:
1)дописать чтобы в конце выводился сгенерированный набор комманд для конкрурентного reindex (через create index concurently) всех индексов где это можно сделать (т.е. primary key так нельзя ужать).
2)перевести на DBD::Pg и постоянный коннект с базой (будет принципиально быстрее, особенно в случае когда упаковка идет мелкими блоками по 1-10 страниц).


<BR>--<BR>Проект с базой но без DBA всеравно что автопарк без штатного автомеханика. Ездит пока все не сломается.<BR> http://mboguk.moikrug.ru
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37007436
905
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

интересно, буду изучать механизм
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37008017
Maxim Boguk,

А можно вкратце узнать принцип работы тулзы?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37008092
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

а вы смотрели вот н аэту штуку http://reorg.projects.postgresql.org/pg_reorg.html ?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37008113
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha Tyurin,

почитал ваш жж уже.

я вот хочу попробовать реорг. Но вопросы есть.

1) мне вот в реорге не хватает возможности выбрать тейблспейс для новой версии, чтобы диски не убивать

2) возникают у меня опасения по поводу его работы в связке со встроенной репликацией. он там что-то делает с "системными таблицами" - не тестировал правда еще.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37008356
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересующийся АнонимMaxim Boguk,

А можно вкратце узнать принцип работы тулзы?

А англоязычных ссылках он достаточно неплохо описан в общем то. Если кратко то если в таблице есть свободное место то при update записи новая версия пойдет с это свободное место. При этом безусловное предпочтение отдается свободному месту в начале таблицы при его наличии. В итоге если обновлять таблицу (fake updates вида поле=поле) начиная с последней страницы в какой то момент все записи с последней страницы перейдут в свободное место в начале таблицы. Теперь если тоже самое проделать N раз то последние N страниц базы окажутся пустыми и обычный неблокирующий Vacuum их сможет отрезать от таблицы и освободить (vacuum без full умеет освобождать страницы в конце таблицы если они полностью свободные).
Для прохода с конца таблицы используется доступ по tid (фактически доступ с физическим указанием номеров страниц и записей на страницах http://www.postgresql.org/docs/8.4/interactive/ddl-system-columns.html описание поля ctid). Все остальное уже детали реализации и оптимизация по скорости проще посмотреть в исходниках.
Vacuum fulll делает приблизительно тоже самое вешая полный (exclusive лок) на таблицу и упаковывая все страницы в таблице сразу а не инкрементально по кусочкам.

Теперь что касается pg_reorg:
Знаю плавал пользовался. Прекрасная утилита для своих задач. Но на мой взгляд:
1)слишком уж она сурово в потрохах базы ковыряется (мне не нравится прямой доступ к системным таблицам и тп вещи)
2)ОЧЕНЬ важная особенность: требует 100% от базы или таблицы свободного места на диске что не реально время от времени
3)Не поддается лимитированию по создаваемой нагрузке на сервер
4)Не может использоватся в инкрементальном режиме (например по ночам когда нагрузка на сервер минимальна)

Мое решение заметно медленне это непреложный факт (раз 5-10 точно). Но оно инкрементальное и позволяющее лимитировать нагрузку. И не требующее сборки дополнительного софта на сервере.

Ну и как обычно:
"Пусть расцветают сто цветов"
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37008648
Maxim Boguk,
Большое спасибо за ответ.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37010640
rockclimber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объясните пожалуйста махровому чайнику (мне то есть), почему нельзя просто изменить значения параметров vacuum_cost_delay, vacuum_cost_page_hit и vacuum_cost_page_limit в файле postgresql.conf? Результат разве не тот же самый будет?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37010811
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rockclimberОбъясните пожалуйста махровому чайнику (мне то есть), почему нельзя просто изменить значения параметров vacuum_cost_delay, vacuum_cost_page_hit и vacuum_cost_page_limit в файле postgresql.conf? Результат разве не тот же самый будет?

Какой тот же самый эффект? Vacuum без full не может ужать таблицу распухшую в 10 раз где 90% места пустое, он может только отрезать последние свободные страницы. А vacuum full или cluster которые могут упаковать таблицу - блокируют ее намертво (т.е. никаких операций с ней сделать нельзя будет в процессе... даже select не будет работать), и на большой таблице могут работать часами (а в запущенном случае сутками даже), и все это время ваш проект будет лежать. И никакой настройкой vacuum_* вы это поведение не уберете.

Так что остаются 3 варианта если у вас таблица распухла (из-за неработающего autovacuum, или из-за того что транзакция открытая висела 10 дней, или просто потому что через пол года вспомнили что надо удалять из таблицы данные старше недели и теперь она весит 400gb при том что данных там на 20g, или по еще какой причине...) то у вас остается 4 альтернативы:
1)vacuum full или cluster и длительный downtime проекта
2)перекидывание базы с помощь slony/londiste на другой сервер где она уже будет ужата и переключение туда
3)использовать вышеупомянутый pg_reorg (имеет свои минусы на самом деле так как требует 100% дополнительного свободного места на дисках на время работы)
4)использовать мою утилиту которая не очень быстро но таблицу ужмет и никому при этом не будет мешать.

Я раньше эту проблему через п2 решал но это безумно трудоемкое для DBA занятие к тому же требующее второго сервера под базу.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37011449
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

Закоммитил большую доработку кода:

1)добавлен вывод набора комманд для выполнения reindex после окончания упаковки таблицы

2)убрано много дублирующего кода и начата подготовка к использованию DBD::Pg при его наличии (будет заметно быстрее работать при небольших значениях --pages-per-round)

3)добавлен более умное определение значений --pages-per-round и --pages-per-vacuum в зависимости от размера таблицы (чем мельче таблица - тем мельче рабочие блоки и чаще routine vacuum)

4)добавлен специальный параметр --delay-ratio который работает следуюшим образом: если пачка в --pages-per-round обработалась за N ms то после этого код будет спать --delay-ratio * N ms (значение по умолчанию = 2), таким образом обеспечивается автоматическая подстройка кода под текущую загрузку сервера чтобы не перегружать дисковую подсистему (так как нагрузка днем и ночью может отличатся на порядки... а скрипт может работать сутками на реально больших таблицах и без такой функциональности может легко устроить 100% disk usage в рабочее время)
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37011895
905
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
предлагаю темы вроде этой, а также ссылки на полезные методы работы с БД прикрепить в теме
будет это что-то типа "advanced-faq" )
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37012387
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Макс, помощь в рефакторинге и причесывании кода нужна? Просто Perl/PostgreSQL - это мой конек. Возможно даже перевод всего этого на PL/Perlu и через pgScheduller - организация шадоу вакуумизатора.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37013162
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WarstoneМакс, помощь в рефакторинге и причесывании кода нужна? Просто Perl/PostgreSQL - это мой конек. Возможно даже перевод всего этого на PL/Perlu и через pgScheduller - организация шадоу вакуумизатора.

Да я думаю помощь пригодится, я на перле лет 5 уже как ничего серьезного не писал. Я доделаю первичный DBD::Pg support и подключу вас в коммитеры проекта.

Дальнейшее обсуждение этой идеи предлагаю перенести на:
jabber maxim.boguk@gmail.com
или (менее предпочтительно)
skype maxim.boguk
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37013480
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukКакой тот же самый эффект? Vacuum без full не может ужать таблицу распухшую в 10 раз где 90% места пустое, он может только отрезать последние свободные страницы. а после обычного vacuum (или autovacuum) пустое место "в середине" таблицы будет использоваться повторно?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37013646
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eddieMaxim BogukКакой тот же самый эффект? Vacuum без full не может ужать таблицу распухшую в 10 раз где 90% места пустое, он может только отрезать последние свободные страницы. а после обычного vacuum (или autovacuum) пустое место "в середине" таблицы будет использоваться повторно?Да, но "потом".авторskype maxim.bogukПостучался. С джаббером я, просто, не работаю и так ICQ и Skype - дофига, чтобы еще Jabber ставить.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37013736
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Warstoneeddie а после обычного vacuum (или autovacuum) пустое место "в середине" таблицы будет использоваться повторно?Да, но "потом".получается после vacuum распухшая база перестанет расти, после vacuum full она ещё и уменьшится, но потом опять начнёт расти.
грубо говоря через месяц использования итоговый размер базы будет одинаковый.

при этом vacuum full намного "тяжелее" обычного vacuum (а предлагаемая процедура, как я понимаю, намного тяжелее и медленнее autovacuum).
а где же профит? ;)
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37013772
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eddieWarstoneпропущено...
Да, но "потом".получается после vacuum распухшая база перестанет расти, после vacuum full она ещё и уменьшится, но потом опять начнёт расти.
грубо говоря через месяц использования итоговый размер базы будет одинаковый.

при этом vacuum full намного "тяжелее" обычного vacuum (а предлагаемая процедура, как я понимаю, намного тяжелее и медленнее autovacuum).
а где же профит? ;)Не так...
Есть таблица... В нее делали много раз INSERT.

Пока все нормально. Таблица большая, данных много, но она почти идеально полная.

Теперь в таблице удаляют старые записи.

Таблица на диске все-равно большая. Реальных данных там очень мало.

Делают VACUUM.

Таблица на диске все-равно большая, так как страницы-то были в начале таблицы, а не в конце.

Делают VACUUM FULL

Таблица на диске маленькая, так как произошла "релокация" данных с конечных страниц в начальные.

Так как таблица стала меньше, то она эффективнее ложится в файловый кеш (ОС) и выборки идут быстрее.

Примерно так.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37014732
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eddieWarstoneпропущено...
Да, но "потом".получается после vacuum распухшая база перестанет расти, после vacuum full она ещё и уменьшится, но потом опять начнёт расти.
грубо говоря через месяц использования итоговый размер базы будет одинаковый.

при этом vacuum full намного "тяжелее" обычного vacuum (а предлагаемая процедура, как я понимаю, намного тяжелее и медленнее autovacuum).
а где же профит? ;)

Вот вам наиболее популярные сценарии проблем:

Была себе таблица гигов на 20... вот в нее решили добавить новое поле предположим boolean с default value = FALSE. Если это делать на прямую - на выходе вы получите таблицу размером в 40GB (что в случае если к таблице активно обращаются а памяти у вас скажем 24GB на сервере значит что она перестала помещатся к кещ ОС и shared buffers, у вас пойдут обращения к диску сразу причем сразу очень много и станет грустно весьма).

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

Третий популярный вариант: у вас есть небольшая таблица очереди задач с большим потоком задач (ну скажем там идет 100 insert/update/delete в секунду), autovacuum для нее настроен и обычно там не больше 1000 задач (и ну суммарно 2000-4000 строк включая мертвые). Теперь из-за глюка какого то приложения вы получаете открытую сутки+ транзакцию (не на эту таблицу и возможно даже не на эту базу в пределах одного постгреса). На выходе ваша таблица очереди будет содержать теже 1000 живых строк и около 17280000 мертвых строк, т.е. распухнет где то в 4000 раз и уже никак не будет обеспечивать требуемые 100insert/update/delete в секунду.

Это три наиболее популярных варианта из моей практики когда таблицу надо было упаковывать любой ценой иначе все грозило лечь совсем.

VF как и моя утилита предназначены не для регулярного обслуживания базы а для восстановления производительности после разнообразных проблем подобных описанным выше.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37014749
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukТретий популярный вариант: у вас есть небольшая таблица очереди задач с большим потоком задач (ну скажем там идет 100 insert/update/delete в секунду), autovacuum для нее настроен и обычно там не больше 1000 задач (и ну суммарно 2000-4000 строк включая мертвые). Теперь из-за глюка какого то приложения вы получаете открытую сутки+ транзакцию (не на эту таблицу и возможно даже не на эту базу в пределах одного постгреса). На выходе ваша таблица очереди будет содержать теже 1000 живых строк и около 17280000 мертвых строк
хм... а где прочитать об этом?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37014984
Фотография Andron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Warstone...
Так как таблица стала меньше, то она эффективнее ложится в файловый кеш (ОС) и выборки идут быстрее.
...


Немного не по теме но разве у PostgreSQL нет собственного буферного пула куда считываются таблицы и индексы с диска? Насколько я понимаю параметр shared_buffers опредляет размер этого самого буферного пула и этот пул никакого отношения к файловому кэшу ОС не имеет. Страницы таблиц и индексов считываются как раз в эти буфера, разве не так?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37015028
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronWarstone...
Так как таблица стала меньше, то она эффективнее ложится в файловый кеш (ОС) и выборки идут быстрее.
...


Немного не по теме но разве у PostgreSQL нет собственного буферного пула куда считываются таблицы и индексы с диска? Насколько я понимаю параметр shared_buffers опредляет размер этого самого буферного пула и этот пул никакого отношения к файловому кэшу ОС не имеет. Страницы таблиц и индексов считываются как раз в эти буфера, разве не так?Если вы почитаете мануалы по тому, как рассчитывать shared_buffers то там черным по английски будет написано что PostgreSQL довольно сильно использует файловый кеш ОС, так как он все-равно есть.
Тынц говорит нам следующее18.4. Resource Consumptionbut because PostgreSQL also relies on the operating system cache, it is unlikely that an allocation of more than 40% of RAM to shared_buffers will work better than a smaller amount.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37015090
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eddieMaxim BogukТретий популярный вариант: у вас есть небольшая таблица очереди задач с большим потоком задач (ну скажем там идет 100 insert/update/delete в секунду), autovacuum для нее настроен и обычно там не больше 1000 задач (и ну суммарно 2000-4000 строк включая мертвые). Теперь из-за глюка какого то приложения вы получаете открытую сутки+ транзакцию (не на эту таблицу и возможно даже не на эту базу в пределах одного постгреса). На выходе ваша таблица очереди будет содержать теже 1000 живых строк и около 17280000 мертвых строк
хм... а где прочитать об этом?

Это следует из того как mvcc в postgresql организован.
google: postgresql table bloat long transaction

Если кратко то vacuum/autovacuum не может пометить как свободные для повторного использования удаленные уже записи если они могут быть видны какой то другой активной в базе транзакции (в данном случае очень долгой). В итоге сколько не удаляй записи из маленькой таблицы очереди место в таблице не будет использоватся повторно так как уже удаленные строки на самом деле еще живые так как могут быть видны из совершенно посторонней долгой транзакции. Итого при 100 insert/update/delete в секунду в таблице будут копится строки со скоростью 200записей в секунду (и вместе с этим будет пухнуть сама таблица и ее индексы...).
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37015161
Фотография Andron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Warstone]
...
Тынц говорит нам следующее18.4. Resource Consumptionbut because PostgreSQL also relies on the operating system cache, it is unlikely that an allocation of more than 40% of RAM to shared_buffers will work better than a smaller amount.

Там пишут о взаимосвязи файлового кэша и других структур памяти, но вовсе не о том куда считываются страницы таблиц и индексов.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37015183
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Andron]Warstone...
Тынц говорит нам следующеепропущено...


Там пишут о взаимосвязи файлового кэша и других структур памяти, но вовсе не о том куда считываются страницы таблиц и индексов.

Хм.. для работы страницы таблиц и индексов считываются и кешируются в shared memory конечно. Если в ней не найдено то идет запрос данных с диска... НО: ОС естественно данные кеширует у себя в памяти и если данные есть в кеше ФС то конечно данные будут взяты оттуда. И именно про это пишут когда говорят что postgres очень сильно (в отличии от оракла который вообще на raw разделах любит жить не используя возможности файловой системы и ее кеша) ориентируется на кеш ФС. Естественно что доступ к кешу ОС несколько медленее чем доступ к данным в shared buffers (изза переключения контекста), но на фоне крайне медленного доступа к физическому диску это как правило незаметно.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37015245
Фотография Andron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Maxim Boguk]Andronпропущено...


Хм.. для работы страницы таблиц и индексов считываются и кешируются в shared memory конечно. Если в ней не найдено то идет запрос данных с диска... НО: ОС естественно данные кеширует у себя в памяти и если данные есть в кеше ФС то конечно данные будут взяты оттуда. И именно про это пишут когда говорят что postgres очень сильно (в отличии от оракла который вообще на raw разделах любит жить не используя возможности файловой системы и ее кеша) ориентируется на кеш ФС.

Так давайте определимся что кэш ФС является посредником между диском и структурой PostgreSQL которая определяется через параметр shared_buffers. Т.е. вначале данные запрашиваются пользователем в базе, затем PostgreSQL если их не находит в shared_buffers то читает с диска, но не напрямую а используя посредника - кэш ФС. И данные эти опят таки помещает из кэша ФС в shared_buffers для дальнейшей обработки и передачи пользователю. Еще раз выделю свое предположение: PostgreSQL не управляет данными в файловом кэше ОС, только в кэше определенном как shared_buffers. Если это так то имеем интересное следствие с т.з. производительности дискового IO.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37015325
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Andron]Maxim Bogukпропущено...


Так давайте определимся что кэш ФС является посредником между диском и структурой PostgreSQL которая определяется через параметр shared_buffers. Т.е. вначале данные запрашиваются пользователем в базе, затем PostgreSQL если их не находит в shared_buffers то читает с диска, но не напрямую а используя посредника - кэш ФС. И данные эти опят таки помещает из кэша ФС в shared_buffers для дальнейшей обработки и передачи пользователю. Еще раз выделю свое предположение: PostgreSQL не управляет данными в файловом кэше ОС, только в кэше определенном как shared_buffers. Если это так то имеем интересное следствие с т.з. производительности дискового IO.

Самое интересное следствие выходит если отдать около 50% под shared buffers. В итоге есть шанс получить ситуацию когда у вас данные лежат в 2х местах в памяти и эффективный размер кеша будет половина от наличной памяти.

Из этого следует что по хорошему под shared buffers имеет смысл отдавать или 20-25% или 75-80% наличной памяти (предполагая что сервер выделен исключительно под базу). Из моего опыта оба варианта на 8.3+ вполне работоспособны а какой из них даст большую производительность очень сильно зависит от конкретного проекта.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37015351
Фотография Andron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

Вообще напрашивается такой вопрос: а зачем дополнительно кэшировать данные базы, ведь это приводит к накладным расходам и снижению надежности. Кажется это называется Direct IO и как раз позволяет избежать использования кэширования на уровне ОС в случае использования файлов для базы. Речь идет именно про файлы а не raw device, с которыми подобной проблемы не возникает, но и PostgreSQL их не поддерживает вроде бы.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37015378
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronВообще напрашивается такой вопрос: а зачем дополнительно кэшировать данные базы, ведь это приводит к накладным расходам и снижению надежности. Кажется это называется Direct IO и как раз позволяет избежать использования кэширования на уровне ОС в случае использования файлов для базы. Речь идет именно про файлы а не raw device, с которыми подобной проблемы не возникает, но и PostgreSQL их не поддерживает вроде бы.Насчет надежности - не согласен, а насчет накладных расходов... При первом приближении - кажется да, но если подумать, то L3/L2/L1 cache в процессорах зачем-то сделан?

Это к тому, что вообще говоря - надо читать, похоже, уже mailing lists, для ответа на вопрос. Я могу предположить, что это сделано для автоматического распределения ресурсов между процессорами... То есть когда у вас на одной машине стоят и Pg и Apache, то неизвестно - что больше будет читать данные Apache или Pg. И что эффективнее кешировать - файлы для Apache или файлы для Pg.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37015405
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronMaxim Boguk,

Вообще напрашивается такой вопрос: а зачем дополнительно кэшировать данные базы, ведь это приводит к накладным расходам и снижению надежности. Кажется это называется Direct IO и как раз позволяет избежать использования кэширования на уровне ОС в случае использования файлов для базы. Речь идет именно про файлы а не raw device, с которыми подобной проблемы не возникает, но и PostgreSQL их не поддерживает вроде бы.

До 8.3 Postgres очень плохо работал с обьемами shared memory большими чем 1gb. Поэтому так или иначе приходилось использовать кеш ОС.

Сейчас эта проблема устранена в основном (не до конца на самом деле... остались некоторые внутренние накладные расходы которые линейно от обьема shared memory растут), и разговоры о direct IO ведутся но общее мнение разработчиков таково:
текущая схема работы работает вполне прилично и пока никто еще не предоставил test case и результаты где бы direct IO давало бы выйгрыш в скорости работы и смысла в этом направлении двигатся нет (во всяком случае пока нет спонсоров которые бы это оплатили).
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37015415
Фотография Andron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WarstoneНасчет надежности - не согласен, а насчет накладных расходов... При первом приближении - кажется да, но если подумать, то L3/L2/L1 cache в процессорах зачем-то сделан?


В процессорах есть двойное кэширование? Потому что в случае с PostgreSQL имеем как раз двойное кэширование. А в IBM например думаете дураки сидят когда придумали использовать DirectIO для файлов базы?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37015434
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronWarstoneНасчет надежности - не согласен, а насчет накладных расходов... При первом приближении - кажется да, но если подумать, то L3/L2/L1 cache в процессорах зачем-то сделан?


В процессорах есть двойное кэширование? Потому что в случае с PostgreSQL имеем как раз двойное кэширование. А в IBM например думаете дураки сидят когда придумали использовать DirectIO для файлов базы?L3/L1 cache. L3 от 256Кб до 2Мб сейчас, L1 32/64Кб. Читайте доки.

А в IBM сидят не дураки (Причем тут IBM?) просто ИМХО считалось что их СУБД будет одна на железе. Для Пг-же считалось что на этом-же железе будет крутиться еще и веб-сервер или еще чего... И в этом случае использование кеша ОС - оправданно. Если хочется поведения а-ля IBM - ставьте shared_buffers в 70-80%.

ЗЫ: Предлагаю дальнейшую дискуссию выделить в отдельную тему.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37015445
Фотография Andron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы даже сказал не "двойное" а дублирующее кэширование. Насчет надежности такой схемы: она однозначно ненадежна при записи . База пишет данные в лог, пишет их в файл данных и считает что они уже на диске. А они всего то попали в файловый кэш ФС и неизвестно когда они будут реально записаны на диск . Это конечно не касается супер навороченных дисковых стоек с батарейками, но вполне имеет место проблема для недорогих серверов.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37015465
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К модератору:
если вас не затруднит, пожайлуста, отделите вопросы касащиеся shared buffers/direct IO из этой темы в отдельную.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37015901
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronЯ бы даже сказал не "двойное" а дублирующее кэширование. Насчет надежности такой схемы: она однозначно ненадежна при записи . База пишет данные в лог, пишет их в файл данных и считает что они уже на диске. А они всего то попали в файловый кэш ФС и неизвестно когда они будут реально записаны на диск . Это конечно не касается супер навороченных дисковых стоек с батарейками, но вполне имеет место проблема для недорогих серверов.Читайте мануалы. Для этого fsync придуман.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37016210
Фотография Andron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Warstone...
Читайте мануалы. Для этого fsync придуман.

Читал, параметр действует на запись буфера write ahead log на диск при выполнении коммита в базе: сервер ждет когда буфер лога будет действительно записан на диск и только после этого коммит считается выполненным. Конечно это решает проблему с надежностью.

However, using fsync results in a performance penalty: when a transaction is committed, PostgreSQL must wait for the operating system to flush the write-ahead log to disk .

Но одновременно снижает производительность.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37016225
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andron,

"Но одновременно снижает производительность."

- использование жестких дисков вообще снижает производительность.)
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37016290
Фотография Andron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk...
Сейчас эта проблема устранена в основном (не до конца на самом деле... остались некоторые внутренние накладные расходы которые линейно от обьема shared memory растут), и разговоры о direct IO ведутся но общее мнение разработчиков таково:
текущая схема работы работает вполне прилично и пока никто еще не предоставил test case и результаты где бы direct IO давало бы выйгрыш в скорости работы и смысла в этом направлении двигатся нет (во всяком случае пока нет спонсоров которые бы это оплатили).

Набрав в гугле "Direct IO performance" можно сразу найти ссылки на статьи почему ведущие разработчики СУБД используют его в своих базах. А PostgreSQL разработчики сомневаются что оно полезно :) Так что думаю тут дело не в test case а в ресурсах самих разработчиков.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37016307
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha Tyurin,

Обычно выделенный "диск" под вал-лог все вопросы "производительности" снимет. // ну и плюс правильно выставленные параметры "сброса" буферов, то что про чекпоинты.

вот в тему:

http://it.toolbox.com/blogs/database-soup/rhel-6-and-the-return-of-wal_sync_method-42931?rss=1

http://www.westnet.com/~gsmith/content/postgresql/TuningPGWAL.htm

http://archives.postgresql.org/pgsql-hackers/2010-11/msg00226.php - тут надо всю ветку полистать.

а вот кое-что про чекпоинты:

http://www.depesz.com/index.php/2010/11/03/checkpoint_completion_target/
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37016361
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha TyurinMisha Tyurin,

Обычно выделенный "диск" под вал-лог все вопросы "производительности" снимет. совсем свалюсь в оффтопик ;)

в случае скажем 4 дисков какая конфигурация будет предпочтительнее?
raid 10 под data+wal или raid 1 под data + raid 1 под wal?
в случае 6 и более дисков тот же самый вопрос - есть ли смысл делать отдельный raid 1 под wal?

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

ps: речь в первую очередь про сервера, соответсвенно подразумевается использование рейд-контроллеров с bbu.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37016411
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eddie,

суть в том, что вы ничего от direct io для вал-лога по факту не получаете, кроме общих потенциальных проблем с ним связанных.

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

--

про конфигурацию райдов, надо прикидывать. у меня сейчас зеркало из двух винтов под вал и четыре диска в десятке под базу. ничего не меряли - просто так получилось)
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37016442
AlexeyNP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andron

Если ты думаешь, что люди делающие PG делают что-то не так - возьми и помоги, если есть острое желание, время, силы и знания. Что сложного? Вот Maxim Boguk так и поступил.

Maxim Boguk
Насколько добавляется I/O при таком, ленивом вакууме?
Можно как-то лимитировать по этому параметру?
Насколько оцениваете надежность - на фронтальной базе запустить можно?
А то опять эти дампы-копи-пасты между 4-мя серваками :(


eddie

Без знания специфики задачи что-то посоветовать нельзя. Если грубо, то мало коммитов/много чтений, то лучше один массив. Если много коммитов, то лучше отдельный массив под WAL. Надо знать профиль нагрузки на БД.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37016487
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyNP Maxim Boguk
Насколько добавляется I/O при таком, ленивом вакууме?
Можно как-то лимитировать по этому параметру?
Насколько оцениваете надежность - на фронтальной базе запустить можно?
А то опять эти дампы-копи-пасты между 4-мя серваками :(Если сравнивать с VACUUM FULL, то, теоретически, "не на много больше", но тут только тесты покажут.

Лимитировать по IOPSам пока нельзя, но планируется, насколько я понял.

Про надежность - пусть сам автор скажет, я туда пока-что не сильно залез.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37016536
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha Tyurinсуть в том, что вы ничего от direct io для вал-лога по факту не получаете, кроме общих потенциальных проблем с ним связанных. понятное дело, wal у нас в общем-то небольшой

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

наоборот, СУБД знает что она делает - index scan или seq scan, соответственно и есть смысл в учреждающем чтении или нет.


AlexeyNPБез знания специфики задачи что-то посоветовать нельзя. Если грубо, то мало коммитов/много чтений, то лучше один массив. Если много коммитов, то лучше отдельный массив под WAL. Надо знать профиль нагрузки на БД. а как обосновать выделенное?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37016708
AlexeyNP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexeyNPБез знания специфики задачи что-то посоветовать нельзя. Если грубо, то мало коммитов/много чтений, то лучше один массив. Если много коммитов, то лучше отдельный массив под WAL. Надо знать профиль нагрузки на БД. а как обосновать выделенное?[/quot]

Логически - на этот массив не будет идти I/O по чтению основных данных БД.
Практически - было у меня пара проектов, где выделенный массив под WAL давал прирост скорости - шла работа с большими кусками текстовых данных (документы).

На практике, обычно, не удается найти достаточно лишних дисков, чтобы соорудить из них WAL-массив, так что проще все закинуть в один кусок RAID-10 и пусть ось+контроллер все сами разруливают. Ну и в среднем если по профилю нагрузки смотреть - если много коммитов, то это основной профиль БД, и нет смысла его отделять, а если много чтений, то аналогично. Так что, наверное, то что в цитате, это скорее пожелание, а не правило - т.е. если можно, то лучше выделить, но не критично.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37016747
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eddie,

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

а секскан (в широком смысле, любой перебор страниц таблицы) - это последовательный перебор, сначала выстраиваем порядок (сортировка полученных указателей на страницы) а потом бежим.

--

если у нас много пишущих транзакций, то нам надо их все фсинкать.

сколько позволяет делать записей в секунду современный диск?

а) без кеша рейда с батарейкой (может он сглаживает пики через кеш)
б) с кешом рейда
в) как зависит кол-во возможных записей в секунду от конфигурации рейда? может ли рейд писать быстрее чем один голый диск? мне кажется что нет, это я вывожу из определения рейд 0. можно и обсудить.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37016759
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha Tyurin,

в) поправляюсь, если он может писать параллельно куски данных - то похоже имеем серьезное увеличение скорости по кол-ву винтов в рейде 0
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37016876
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyNPЕсли много коммитов, то лучше отдельный массив под WAL. Надо знать профиль нагрузки на БД.Всегда казалось что если много INSERT/UPDATE операций, а не COMMIT, так как I/U операции вроед так-же в WAL оседают, даже если потом был роллбек... Поправьте меня, если я не прав.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37017202
сколько позволяет делать записей в секунду современный диск?

Смотрите среднее время поиска сектора (seek time) для диска. Среднее кол-во иопсов будет как 1/ на это время. Для типичных SATA HDD дисков около 100. У серверных вариантов HDD числа будут выше в разы, до 2-3.

а) без кеша рейда с батарейкой (может он сглаживает пики через кеш)
б) с кешом рейда


От батарейки скорость не зависит, важен режим записи - write-back (блок считается записанным после записи в кэш контролёра) или write-through (... на диск). Прирост будет, а на сколько - зависит от типа нагрузки.

в) как зависит кол-во возможных записей в секунду от конфигурации рейда? может ли рейд писать быстрее чем один голый диск? мне кажется что нет, это я вывожу из определения рейд 0. можно и обсудить.


Опять всё зависит от типа нагрузки. Для "разбросанных" IO (random, scattered read/write) и последовательных IO большими блоками RAID0 в идеале удваивает кол-во иопсов. RAID1 удваивает максимум до 2х иопсы на scattered чтение (диски везде считаем одинаковыми). Это называется расслоением блочного устройства и различные комбинации RAID0/1/JBOD как раз используются для повышения иопсов.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37017279
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyNP Andron

Если ты думаешь, что люди делающие PG делают что-то не так - возьми и помоги, если есть острое желание, время, силы и знания. Что сложного? Вот Maxim Boguk так и поступил.

Maxim Boguk
Насколько добавляется I/O при таком, ленивом вакууме?
Можно как-то лимитировать по этому параметру?
Насколько оцениваете надежность - на фронтальной базе запустить можно?
А то опять эти дампы-копи-пасты между 4-мя серваками :(



IO добавляется приблизительно столько же сколько от vacuum full было бы (+/- 2 раза от ситуации в таблице зависит).
По IO лимитировать можно... смотрите параметры:
--pages-per-round= (сколько страниц чистить за 1 цикл вызова хранимки) по умолчанию 10
--delay= (сколько в секундах ждать после каждой пачки в --pages-per-round принимает float по умолчанию - 0)
--delay-ratio - наиболее полезный для целей лимитирования нагрузки параметр... работает он следующим образом: смотрится за сколько обработалось последняя --pages-per-round= пачка страниц, после спит (время обработки предыдущей пачки)*--delay-ration времени, умолчательное значение 2 (это позволяет одному и тому же скрипту нормально работать и в пиковую нагрузку и ночью в минимуме нагрузки... так как чем медленее идет основной процесс тем больше будут паузы между вызовами... я в при эксплуатации видел до 10 раз разницы в скорости между дневной и ночной работой).

Умолчательные настройки (не быстро но не создавая большой нагрузки на сервер):
--pages-per-round=10 --delay-ratio=2
Настройки упаковать любой ценой максимально быстро:
--pages-per-round=100 --delay-ratio=0
(ставить больше 100 в --pages-per-round=100 не стоит начинаются накладные расходы и с 1000 уже в 1.5 раза медленее идет... меньше 10 тоже не стоит ставить пока нет реализации через DBD::Pg или managed psql).

Обязательно стоит посмотреть на то чтобы у вас vacuum_cost_delay был в базе так настроен чтобы вызов vacuum не вызывал перегрузки дисковой системы, так как скрипт в процессе работы делает обычный vacuum таблицы до 20 раз.

Система тестировалась на ОЧЕНЬ нагруженных базах моих клиентов (список тут: http://mboguk.moikrug.ru/) на очень разных серверах и структурах таблиц. Проблем выявлено не было (лучше не забывать делать svn up перед использованием так как выявленные сложности я оперативно исправяю).

Потери или повреждения данных не было ни разу, 1 раз возникла перегрузка дисковой системы в дневное время (после чего собственно и появилась автоподстройка нагрузки через --delay-ratio).

Комментарии по результатам использования приветствуются.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37017467
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eddieнаоборот, СУБД знает что она делает - index scan или seq scan, соответственно и есть смысл в учреждающем чтении или нет. http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-EFFECTIVE-IO-CONCURRENCY

PG всё это умеет, и O_DIRECT и posix_fadvise.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37018804
905
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WarstoneДелают VACUUM FULL

Таблица на диске маленькая, так как произошла "релокация" данных с конечных страниц в начальные.

Так как таблица стала меньше, то она эффективнее ложится в файловый кеш (ОС) и выборки идут быстрее.


Получается, что если из таблицы удалить половину строк (и не делать пока vacuum full), а затем с ней производить работу, то в памяти(кэше) будет бессмысленно болтаться удаленная половина таблицы ?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37018926
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
905Получается, что если из таблицы удалить половину строк (и не делать пока vacuum full), а затем с ней производить работу, то в памяти(кэше) будет бессмысленно болтаться удаленная половина таблицы ?Не совсем так. Эта информация МОЖЕТ быть в кеше (например когда ее "вот прям щас удалили"), но индексы, насколько я помню, будут гораздо больше, равно как и общее количество страниц и, как следствие, поиск необходимой страницы (как в кеше, так и на диске) будет больше. Хотя, конечно, у меня нет 100% уверенности в предыдущем высказывании, так как я код не смотрел, но по ощущениям - если в таблице много пустого места, то с ней "тяжелее" работать.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37019194
web_fox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
905WarstoneДелают VACUUM FULL

Таблица на диске маленькая, так как произошла "релокация" данных с конечных страниц в начальные.

Так как таблица стала меньше, то она эффективнее ложится в файловый кеш (ОС) и выборки идут быстрее.


Получается, что если из таблицы удалить половину строк (и не делать пока vacuum full), а затем с ней производить работу, то в памяти(кэше) будет бессмысленно болтаться удаленная половина таблицы ?
по-любому информация с диска читается страницами. Если в каждой странице будет 90% мусора, то будет полная опа. Если вы сделаете VACUUM FULL. Эта опа переместиться из таблицы в индексы и будет опа, но уже с другой стороны :)
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37019591
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
web_foxпо-любому информация с диска читается страницами. Если в каждой странице будет 90% мусора, то будет полная опа. Если вы сделаете VACUUM FULL. Эта опа переместиться из таблицы в индексы и будет опа, но уже с другой стороны :)В индексах она будет меньше.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37019651
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Warstoneweb_foxпо-любому информация с диска читается страницами. Если в каждой странице будет 90% мусора, то будет полная опа. Если вы сделаете VACUUM FULL. Эта опа переместиться из таблицы в индексы и будет опа, но уже с другой стороны :)В индексах она будет меньше.

Предполагая что индексы были не распухшие при VF их размер строго удвоится. Если распухшие уже то они могут даже и не вырости вообще. На самом деле кроме primary key/unique constraints распухшие индексы лечатся достаточно легко и бескровно в отличии от упаковки самой таблицы.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37019833
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

а почему с primary key хуже дела обстоят?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37020092
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eddieMaxim Boguk,

а почему с primary key хуже дела обстоят?

Потому что с обычными индексами вместо блокируюшего таблицу reindex можно поступить следующим образом:

CREATE INDEX CONCURRENTLY applicant_adv_subscription_sent_date_key_new ON applicant_adv_subscription USING btree (sent_date);
DROP INDEX public.applicant_adv_subscription_sent_date_key;
ALTER INDEX public.applicant_adv_subscription_sent_date_key_new RENAME TO applicant_adv_subscription_sent_date_key;

пересоздав индекс без блокировки таблицы.

А вот с primary key этот фокус до выхода версии 9.1 не пройдет (в 9.1 обещают возможность уже созданный индекс обьявить как primary key).
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37021280
web_fox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, человеческое спасибо что небезразличны, разработали и открыли полезную вещь.
А автоматическая неблокирующая прозрачная оптимизация таблиц и индексов уже давно напрашивается в стандартную поставку PG.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37022027
Фотография Степан H.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо большое. Особо ценная вещь.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37022136
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukА вот с primary key этот фокус до выхода версии 9.1 не пройдет (в 9.1 обещают возможность уже созданный индекс обьявить как primary key).Причем непонятно будет-ли тогда блокироваться таблица.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37023930
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёш http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-EFFECTIVE-IO-CONCURRENCY

PG всё это умеет, и O_DIRECT и posix_fadvise. насчёт O_DIRECT - речь про это:
The open_* options also use O_DIRECT if available. Not all of these choices are available on all platforms.
http://www.postgresql.org/docs/current/static/runtime-config-wal.html
?

так оно имеет отношение только к WAL (то есть никак не поможет в борьбе с двойной буферизацией в shared memory/кэше OS).

PS: из изменений в 9.0.2:
Force the default wal_sync_method to be fdatasync on Linux (Tom Lane, Marti Raudsepp)

The default on Linux has actually been fdatasync for many years, but recent kernel changes caused PostgreSQL to choose open_datasync instead. This choice did not result in any performance improvement, and caused outright failures on certain filesystems, notably ext4 with the data=journal mount option.

http://www.postgresql.org/docs/9.0/static/release-9-0-2.html
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37024080
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eddieнасчёт O_DIRECT - речь про это:
The open_* options also use O_DIRECT if available. Not all of these choices are available on all platforms.
http://www.postgresql.org/docs/current/static/runtime-config-wal.html
?Да.
eddieтак оно имеет отношение только к WAL (то есть никак не поможет в борьбе с двойной буферизацией в shared memory/кэше OS).Можно сделать большой shared buffers, тогда под кеш файловой системы не останется места. Так же, кеш файловой системы можно настроить средствами операционной системы.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37026895
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обновлена версия утилиты. (переписана почти начисто)
Из бонусов:
1)поддержка DBD::Pg как основного API к базе (спасибо Warstone)
2)поддержка ключа --all вместо указания таблицы для того чтобы обработать всю базу или всю схему за раз
3)встроена эвристика которая не делает упаковку таблицы если оцениваемый уровень распухания меньше 30% (можно отключить через --force)
4)заметно более умная установка параметров --pages-per-round и --pages-per-vacuum (причем первый будет автоматически уменьшатся по мере уменьшения таблицы)... все это сделано для того чтобы --all нормально работал и с большими и с маленькими таблицами в базе
5)добавлена куча отладочного вывода... см --verbose-level
6)слегка побыстрее в простых случаях
7)по коду стало в 10 раз более читаемо и понятно... весь sql изолирован от основной логики работы.

Брать прямо из svn все там же где и раньше:
http://code.google.com/p/compacttable/

Версия протестирована на нескольких базах размером от 10GB до 300GB никаких проблем или ошибок пока не выявлено.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37027952
Фотография SmeL_md
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vacuum_table.pl revision 22

Код: plaintext
1.
2.
3.
4.
5.
6.
root@ubuntus:/home/andrei# ./vacuum_table.pl --username postgres --dbname test --all
 Tue Dec 21 17:19:01 2010 BEGIN WORK
Can't init DBI because of No such file or directory
Managed psql connection will be avail. in futher revisions
SQL execution method is Password for user postgres:
Using: host = localhost, port = 5432, user = postgres, database = test, delay = 0 s, delay-ratio = 2
Can't use an undefined value as an ARRAY reference at ./vacuum_table.pl line 322.

line 322
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	my $result = perform_query("
SELECT
	c.oid	  AS oid,
	n.nspname AS schema,
	c.relname AS name
....
");
	return @$result;
Что я сделал не так ? К базе скрипт подключился создал хранимку в логе пишет
EET LOG: could not receive data from client: Connection reset by peer
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37028609
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SmeL_mdvacuum_table.pl revision 22

Код: plaintext
1.
2.
3.
4.
5.
6.
root@ubuntus:/home/andrei# ./vacuum_table.pl --username postgres --dbname test --all
 Tue Dec 21 17:19:01 2010 BEGIN WORK
Can't init DBI because of No such file or directory
Managed psql connection will be avail. in futher revisions
SQL execution method is Password for user postgres:
Using: host = localhost, port = 5432, user = postgres, database = test, delay = 0 s, delay-ratio = 2
Can't use an undefined value as an ARRAY reference at ./vacuum_table.pl line 322.

line 322
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	my $result = perform_query("
SELECT
	c.oid	  AS oid,
	n.nspname AS schema,
	c.relname AS name
....
");
	return @$result;
Что я сделал не так ? К базе скрипт подключился создал хранимку в логе пишет
EET LOG: could not receive data from client: Connection reset by peer

Спасибо за репорт сейчас разберемся и починим... судя по всему при создании поддержки DBI сломали где то работу через psql. Через час будет новая версия.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37028653
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В репозитарий закомичена исправленная версия. Мои извинения за пролезший косяк.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37033171
905
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дошли руки попробовать

ругается в скрипте на сформированный sql:
Код: plaintext
AND c.oid = "__test"::regclass 
поправил на:
Код: plaintext
AND c.oid = '__test'::regclass 

мой тест делал так (уменьшил кол-во строк и возле рандома поправил 1 на 0.5):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE __test as select id,random() as f1,random() as
f2,random()::text as f3,now() as mtime,(random()> 0 . 5 )::boolean as flag
FROM generate_series( 1 , 1000000 ) as t(id);
DELETE FROM __test where id% 5 <> 0 ;
ALTER TABLE __test add primary key (id);
CREATE INDEX __test_f1_key ON __test(f1);
CREATE INDEX __test_f2_key ON __test(f2);
CREATE INDEX __test_f3_key ON __test(f3);

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT sum(pg_relation_size('public.'
||indexname))::bigint/current_setting('block_size')::bigint
,pg_relation_size('__test')/current_setting('block_size')::bigint,
pg_size_pretty(pg_relation_size('__test')), pg_size_pretty(pg_total_relation_size('__test'))
FROM pg_indexes WHERE schemaname='public' AND tablename='__test';

 13188 	 11358 	 89  MB	 192  MB

Код: plaintext
1.
2.
3.
4.
./vacuum_table.pl
real    2m55.557s

 13188 	 2287 	 18  MB	 121  MB

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

opensuse 11.3 x86_64; postgresql 8.4.4, r31
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37033273
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
905дошли руки попробовать

ругается в скрипте на сформированный sql:
Код: plaintext
AND c.oid = "__test"::regclass 
поправил на:
Код: plaintext
AND c.oid = '__test'::regclass 

мой тест делал так (уменьшил кол-во строк и возле рандома поправил 1 на 0.5):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE __test as select id,random() as f1,random() as
f2,random()::text as f3,now() as mtime,(random()> 0 . 5 )::boolean as flag
FROM generate_series( 1 , 1000000 ) as t(id);
DELETE FROM __test where id% 5 <> 0 ;
ALTER TABLE __test add primary key (id);
CREATE INDEX __test_f1_key ON __test(f1);
CREATE INDEX __test_f2_key ON __test(f2);
CREATE INDEX __test_f3_key ON __test(f3);

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT sum(pg_relation_size('public.'
||indexname))::bigint/current_setting('block_size')::bigint
,pg_relation_size('__test')/current_setting('block_size')::bigint,
pg_size_pretty(pg_relation_size('__test')), pg_size_pretty(pg_total_relation_size('__test'))
FROM pg_indexes WHERE schemaname='public' AND tablename='__test';

 13188 	 11358 	 89  MB	 192  MB

Код: plaintext
1.
2.
3.
4.
./vacuum_table.pl
real    2m55.557s

 13188 	 2287 	 18  MB	 121  MB

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

opensuse 11.3 x86_64; postgresql 8.4.4, r31

На всякий случай при vacuum fulll размер индексов может и в 2 раза вырости и растет почти всегда.
А касательно уменьшения индексов берите свежую версию из svn и используйте ключ --perform-reindex.
Указанная вами выше проблема в свежей версии тоже уже вылечена.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37033493
905
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukА касательно уменьшения индексов берите свежую версию из svn и используйте ключ --perform-reindex.
Указанная вами выше проблема в свежей версии тоже уже вылечена.

взял последнею версию и перевыполнил тест с --perform-reindex, и опять не уменьшился индекс
удалил еще половину записей (DELETE FROM __test where id%2<>0) и прогнал скрипт, стало:
Код: plaintext
 13188 	 1144 	 9152  kB	 112  MB
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37033653
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
905Maxim BogukА касательно уменьшения индексов берите свежую версию из svn и используйте ключ --perform-reindex.
Указанная вами выше проблема в свежей версии тоже уже вылечена.

взял последнею версию и перевыполнил тест с --perform-reindex, и опять не уменьшился индекс
удалил еще половину записей (DELETE FROM __test where id%2<>0) и прогнал скрипт, стало:
Код: plaintext
 13188 	 1144 	 9152  kB	 112  MB


Хммм... постучитесь ко мне в jabber или почту maxim.boguk@gmail.com или в skype maxim.boguk
попробуем разобратся почему реиндексация не срабатывает.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37044006
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Был выявлен и исправлен неприятный баг при использовании --perform-reindex (--print-reindex) в ситуации когда индексы расположены на отдельном от базы tablespace. В такой ситуации после отработки программы индексы оказывались в умолчательном tablespace для базы.

Исправлено с r35.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37047184
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очередная серьезная доработка программы (r36). Видимых изменений в функциональности нет но очень много сделано для ускорения работы и повышения надежности.

Изменения:
1)--perform-reindex --print-reindex теперь заменяют старый индекс новым и дропают старый индекс в одной транзакции (так чтобы не могло возникнуть ситуации при аварийном завершении процесса когда старый индекс уже убили а новый еще не переименовали в старое название)

2)--print-reindex --perform-reindex теперь выполняются в самом конце после того как все таблицы уже упакованы

3)добавлены корректные проверки на завершение старых транзакций (перед тем как выполнять vacuum) и на то что нет давних локов на таблицу (чтобы не повесить ожидающий exclusive lock на таблицу когда не надо) (резко снизился шанс того что при переиндексации возникнет долгий exclusive lock на смене индексов). Как итог стало работать быстрее так как вместо обязательного 2х секундного ожидания перез запуском vacuum стало ожидать только завершения старых транзакций.

4)добавлен механизм корректного retry упаковки таблиц если они в первом проходе не упаковались по какой то причине (весьма вероятная ситуация на очень активно используемых таблицах).

5)перераскидана часть сообщений между --verbose-level= 1,2 и 3 и добавлено много новой полезной информации о процессе выполнения.

6)по результатам профилирования изменена часть значений по умолчанию.

7)добалена корректная (насколько это возможно) проверка на то что таблица успешно упакована до максимально возможного размера или около того.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37050630
Фотография alienzzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отпишите, кто-то это пользует в рабочих проектах ?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37050632
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alienzzzzОтпишите, кто-то это пользует в рабочих проектах ?

Я как автор использую (список текущих рабочих проектов см http://mboguk.moikrug.ru/ ,он весьма представительный).
Еще несколько человек с которыми я общался ее пробовали насколько я знаю.

Если кто то кроме меня ее использует (или пробовал) отпишитесь в этот топик если вас не затруднит (с комментариями и предложениями если таковые будут).

Хочу заметить что утилита все-таки не для того чтобы ее по крону пускать (т.е. это скорее инструмент для починки когда что то не то с размером таблицы случилось а не замена autovacuum хотя я временами с --all ее пускаю но только руками под контролем происходящего).

В данный момент все известные мне баги или проблемы в ней устранены (хотя безусловно там есть куда дальше развивать).
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37050741
Фотография SmeL_md
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,
Использовал на рабочих базах, проблем не обнаружил
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37054173
905
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
планирую использовать, на тестах ведет себя хорошо
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37374634
daevy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk Спасибо тебе за твой инструмент, очень полезная разработка. Приведу результат применения:

# select relname,relpages from pg_class where relname = 'products';
products | 497671 # до использования
products | 224612 # после использования

# SELECT pg_size_pretty(pg_total_relation_size('products'));
5753 MB # до использования
3699 MB # после использования

# SELECT pg_size_pretty(pg_relation_size('products'));
3888 MB # до использования
1825 MB # после использовия
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37422337
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня не хочет работать от пользователя postgres. Требует пароль:
failed: fe_sendauth: no password supplied at /etc/postgresql/9.0/UTF8/vacuum_table.pl line 732

В то же время для работы psql вполне хватает ident в pghba_conf.

Что я делаю не так?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37422446
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadminУ меня не хочет работать от пользователя postgres. Требует пароль:
failed: fe_sendauth: no password supplied at /etc/postgresql/9.0/UTF8/vacuum_table.pl line 732

В то же время для работы psql вполне хватает ident в pghba_conf.

Что я делаю не так?

хм забавный эффект да... спасибо за report.

сейчас софтина написана так что она по unix socket вообще не пытается ходить (так было проще на первом этаме)
и если --host не указан используется --host=localhost т.е. tcp в любом случае
а ident работает только с unix socket коннектами

если вы попробуете сделать что то вида psql -U username -h localhost вас запросит пароль.

Это скорее бага чем фича но быстро я ее сейчас не вылечу (там прийдется ковырять более одного места).
Предложения или:

1)прописать trust на 127.0.0.1 в pg_hba.conf

2)или внести пароль в ~/.pgpass

3)или подождать пару дней когда у меня появится время на выходных и я эту проблему устраню (возможно даже сегодня но обещать не буду).
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37422799
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

спасибо, что-то я не подумал.
Сделать работу через сокет было бы здорово. Мало ли кто представится postgres'ом c локалхоста.....
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37425793
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Maxim BogukТак что остаются 3 варианта если у вас таблица распухла...

Забыли самый прямой путь - перекинуть данные во временную таблицу, truncate текущую, закинуть данные обратно. На ваших 20 гиг займет несколько минут даже при наличии индексов. При желании можно копировать инкрементально и рули повесить переадресующие на актуальную в текущий момент копию, если уж простой ~1 минуты критичен (а тормоза всего проекта в течении суток - это нормально?.. а если дедлок словите, пока вас на месте нет?).
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37425966
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЗабыли самый прямой путь - перекинуть данные во временную таблицу, truncate текущую, закинуть данные обратно.
тут ! очень важно не забыть повесить ! блокировочку какую-нибудь на таблицу в начале всего этого мероприятия. иначе можно потерять изменения между исходным копированием во временную таблицу и транкейтом. плюс транкейт сама по себе имеет эффекты - параллельные транзакции могут получать пустоту.

http://www.postgresql.org/docs/current/static/sql-truncate.html - Warning номер 1 тут

--

но в целом подход рабочий, поддерживаю. подобное юзаю для редко обновляемых больших таблиц, которые иногда могут распухать после массовых апдейтов.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37426178
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Misha Tyurin,

Еще вопрос... а почему партиционирование не применяете? Скажем, по месяцам - тогда зачастую старые таблицы используются как read-only и их можно беспроблемно сжимать, да и размер данных в каждой таблице на порядки уменьшается. Если дело в специфике задачи, интересно было бы услышать подробности (хотя, вероятнее, БД унаследована в таком виде).
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #37426407
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBG,

часть "объектов" у меня живут "вечно", и крутятся туда - сюда, жизненный цикл потенциально бесконечный у них. это пока продут потому что так устроен, менять надо с самого верха. занимаемся и этим.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Vacuum Full без полного лока таблицы
    #38318364
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

в 9.2 баг при выполнении реиндексов из-за переименования pg_stat_activity.procpid в pg_stat_activity.pid:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ERROR:  column "procpid" does not exist
LINE 4: ...::integer) from pg_locks join pg_stat_activity on procpid=pi...
                                                             ^
query '
SELECT
coalesce(
	(SELECT max(extract(epoch from now()-xact_start)::integer) from pg_locks join pg_stat_activity on procpid=pid where relation=280866::regclass and database=(select oid from pg_database where datname=current_database()))
	,0
)
' asked for 1 rows but got total 0 rows as answer



исправил у себя заменой в 414 строке
Код: sql
1.
(SELECT max(extract(epoch from now()-xact_start)::integer) from pg_locks join pg_stat_activity on procpid=pid where relation=${relid}::regclass and database=(select oid from pg_database where datname=current_database()))


на
Код: sql
1.
(SELECT max(extract(epoch from now()-xact_start)::integer) from pg_locks join pg_stat_activity using(pid) where relation=${relid}::regclass and database=(select oid from pg_database where datname=current_database()))
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38318658
Фотография SmeL_md
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexius,
вот тут Postgresql-consulting.ru развитие
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38318792
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexiusMaxim Boguk,

в 9.2 баг при выполнении реиндексов из-за переименования pg_stat_activity.procpid в pg_stat_activity.pid:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ERROR:  column "procpid" does not exist
LINE 4: ...::integer) from pg_locks join pg_stat_activity on procpid=pi...
                                                             ^
query '
SELECT
coalesce(
	(SELECT max(extract(epoch from now()-xact_start)::integer) from pg_locks join pg_stat_activity on procpid=pid where relation=280866::regclass and database=(select oid from pg_database where datname=current_database()))
	,0
)
' asked for 1 rows but got total 0 rows as answer



исправил у себя заменой в 414 строке
Код: sql
1.
(SELECT max(extract(epoch from now()-xact_start)::integer) from pg_locks join pg_stat_activity on procpid=pid where relation=${relid}::regclass and database=(select oid from pg_database where datname=current_database()))


на
Код: sql
1.
(SELECT max(extract(epoch from now()-xact_start)::integer) from pg_locks join pg_stat_activity using(pid) where relation=${relid}::regclass and database=(select oid from pg_database where datname=current_database()))



собственно современная разработу живет вот тут вот
https://code.google.com/p/pgtoolkit/downloads/list
там этой проблемы быть не должно
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38495203
Фотография Константин Евтеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Решил попробовать на базе в 200 гб(до этого создавал дубль индексов и удалял старые версии).

Запустил
Код: powershell
1.
perl /usr/bin/pgcompact --all --reindex -v info  -c 500 -E 1


таблица размером 8900mb индексы 7670 mb обрабатывалась 42 часа, размер таблицы стал 6220, индексов 8559 в данный момент идет обработка следующей таблицы 35 gb индексы 51 gb за шесть дней прогресс 20%
shared_buffers 3 gb
temp_buffers 16 mb
work_mem 12 mb
maintenance_work_mem 128 mb

vacuum_cost_delay,10
vacuum_cost_limit,200
vacuum_cost_page_dirty,20
vacuum_cost_page_hit,1
vacuum_cost_page_miss,10

Вопрос в следующем можно ли как-нибудь ускорить работу pgcompact?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38495361
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте стандартные настройки без -c 500 -E 2
Вам точно нужен принудительный reindex? Как мне кажется, это нужно при активных изменениях по PK
Еще можно maintenance_work_mem поднять конкретно в этой сессии.


У меня база в два раза меньше, самая большая таблица ~10G, но все на порядок быстрее.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38495618
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин ЕвтеевДобрый день!
Решил попробовать на базе в 200 гб(до этого создавал дубль индексов и удалял старые версии).

Запустил
Код: powershell
1.
perl /usr/bin/pgcompact --all --reindex -v info  -c 500 -E 1


таблица размером 8900mb индексы 7670 mb обрабатывалась 42 часа, размер таблицы стал 6220, индексов 8559 в данный момент идет обработка следующей таблицы 35 gb индексы 51 gb за шесть дней прогресс 20%
shared_buffers 3 gb
temp_buffers 16 mb
work_mem 12 mb
maintenance_work_mem 128 mb

vacuum_cost_delay,10
vacuum_cost_limit,200
vacuum_cost_page_dirty,20
vacuum_cost_page_hit,1
vacuum_cost_page_miss,10

Вопрос в следующем можно ли как-нибудь ускорить работу pgcompact?

ускорить
1)--delay-ratio=0 и -с не ставить
2)vacuum_cost_delay = 0 в конфиге (я почти уверен что 90% времени проводится в vacuum а не в самом компакторе)
3)если 2 невозможно то вызывать с --no-routine-vacuum

чтобы не пухли индексы: вызывать с --reindex (это вообще всегда полезно)
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38778085
yura31
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток!

Попробовал срипт на пг 9.3, вот так ругнулось:
Код: sql
1.
ERROR: column "procpid" does not exist



Я так понимаю в скрипте нужно исправить "procpid" на "pid" ?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38778095
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura31Доброе время суток!

Попробовал срипт на пг 9.3, вот так ругнулось:
Код: sql
1.
ERROR: column "procpid" does not exist



Я так понимаю в скрипте нужно исправить "procpid" на "pid" ?

обновить версию на более свежую для начала
( например с https://github.com/PostgreSQL-Consulting/pgcompacttable )
у вас что то очень древнее по виду текста ошибки.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38778137
yura31
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за овет!
С свн брал. Это не одно и тоже?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38778139
yura31
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ааа, все увидел! Спасибо еще раз! :)
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38778253
yura31
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,
Код: sql
1.
2.
3.
4.
dbname=# select pg_size_pretty(pg_relation_size( 'table_name' )) as pg_relation_size, pg_size_pretty(pg_total_relation_size( 'table_name' )) as pg_total_relation_size;
 pg_relation_size | pg_total_relation_size 
------------------+------------------------
 6806 MB          | 18 GB





Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
./pgcompact -h 127.0.0.1 0 -U postgres --dbname dbname -t table_name --reindex -v info --no-routine-vacuum
Wed Oct 15 22:15:03 2014 INFO Database connection method: DBI/Pg.
Wed Oct 15 22:15:03 2014 dbname INFO Created environment.
Wed Oct 15 22:15:03 2014 dbname NOTICE Statictics calculation method: approximation.
Wed Oct 15 22:58:21 2014 dbname, public.table_name INFO Vacuum initial: 871154 pages left, duration 2597.573 seconds.
Wed Oct 15 22:58:21 2014 dbname, public.table_name NOTICE Statistics: 871154 pages (2363415 pages including toasts and indexes), approximately 11.49% (100092 pages) can be compacted reducing the size by 782 MB.
Wed Oct 15 22:58:21 2014 dbname, public.table_name INFO Skipping processing: 11.49% space to compact from 20% minimum required.
Wed Oct 15 22:58:21 2014 dbname NOTICE Processing complete.
Wed Oct 15 22:58:21 2014 dbname NOTICE Processing results: size reduced by 0 bytes (120 kB including toasts and indexes) in total.
Wed Oct 15 22:58:21 2014 NOTICE Processing complete: 0 retries from 10.
Wed Oct 15 22:58:21 2014 NOTICE Processing results: size reduced by 0 bytes (120 kB including toasts and indexes) in total, 0 bytes (120 kB) dbname.



Больше половины места свободоно на разделе с базой
/dev/sdb1 191G 90G 102G 47% /mnt/sdb

На кореневом правда
/dev/sda1 16G 12G 3.3G 78% /

Подскажите пож в чем проблема?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38778269
yura31
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Неверное опять не оттуда взял :)
https://github.com/grayhemp/pgtoolkit - вот здесь наверное свежая версия.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38778294
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura31Maxim Boguk,
Код: sql
1.
2.
3.
4.
dbname=# select pg_size_pretty(pg_relation_size( 'table_name' )) as pg_relation_size, pg_size_pretty(pg_total_relation_size( 'table_name' )) as pg_total_relation_size;
 pg_relation_size | pg_total_relation_size 
------------------+------------------------
 6806 MB          | 18 GB





Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
./pgcompact -h 127.0.0.1 0 -U postgres --dbname dbname -t table_name --reindex -v info --no-routine-vacuum
Wed Oct 15 22:15:03 2014 INFO Database connection method: DBI/Pg.
Wed Oct 15 22:15:03 2014 dbname INFO Created environment.
Wed Oct 15 22:15:03 2014 dbname NOTICE Statictics calculation method: approximation.
Wed Oct 15 22:58:21 2014 dbname, public.table_name INFO Vacuum initial: 871154 pages left, duration 2597.573 seconds.
Wed Oct 15 22:58:21 2014 dbname, public.table_name NOTICE Statistics: 871154 pages (2363415 pages including toasts and indexes), approximately 11.49% (100092 pages) can be compacted reducing the size by 782 MB.
Wed Oct 15 22:58:21 2014 dbname, public.table_name INFO Skipping processing: 11.49% space to compact from 20% minimum required.
Wed Oct 15 22:58:21 2014 dbname NOTICE Processing complete.
Wed Oct 15 22:58:21 2014 dbname NOTICE Processing results: size reduced by 0 bytes (120 kB including toasts and indexes) in total.
Wed Oct 15 22:58:21 2014 NOTICE Processing complete: 0 retries from 10.
Wed Oct 15 22:58:21 2014 NOTICE Processing results: size reduced by 0 bytes (120 kB including toasts and indexes) in total, 0 bytes (120 kB) dbname.



Больше половины места свободоно на разделе с базой
/dev/sdb1 191G 90G 102G 47% /mnt/sdb

На кореневом правда
/dev/sda1 16G 12G 3.3G 78% /

Подскажите пож в чем проблема?

так в чем ваша проблема то?
в таблице 11% свободного места...
если всеравно хочеться ее сжать то --force добавьте (но смысла сжимать таблицу с 10% свободного маста немного).
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38782247
yura31
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!
Вы правы, нет места в таблицы.
Что делать в таких случаях?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38782382
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura31Спасибо!
Вы правы, нет места в таблицы.
Что делать в таких случаях?

а что вы хотите получить?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38782818
yura31
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как поступать с таблицами в которых не достаточна места?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38782966
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura31Как поступать с таблицами в которых не достаточна места?

Никак, они занимают сколько занимают.
Если места не хватает то придумывать что и как удалять или места больше на дисках выделять.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38783246
yura31
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ, а можно как то подробнее или ссылку на ман по этой теме? Места на разделе где БД более чем достаточно.
df -h|grep pos
/dev/sdb1 197G 110G 78G 59% /var/lib/postgresql

Код: sql
1.
2.
3.
4.
5.
6.
7.
select pg_size_pretty(pg_relation_size( 'tasks' )) as pg_relation_size, pg_size_pretty(pg_total_relation_size( 'tasks' )) as pg_total_relation_size;
 pg_relation_size | pg_total_relation_size 
------------------+------------------------
 2216 MB          | 18 GB
(1 row)

./pgcompact -h 127.0.0.1 -U postgres --dbname dbname -t tasks --reindex -v info --no-routine-vacuum


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Tue Oct 21 14:58:48 2014 INFO Database connection method: psql.
Tue Oct 21 14:58:48 2014 dbname INFO Created environment.
Tue Oct 21 14:58:48 2014 dbname NOTICE Statictics calculation method: approximation.
Tue Oct 21 14:59:40 2014 dbname, public.tasks INFO Vacuum initial: 283615 pages left, duration 52.622 seconds.
Tue Oct 21 14:59:40 2014 dbname, public.tasks NOTICE Statistics: 283615 pages (2398931 pages including toasts and indexes), approximately 9.86% (27967 pages) can be compacted reducing the size by 218 MB.
Tue Oct 21 14:59:40 2014 dbname, public.tasks INFO Skipping processing: 9.86% space to compact from 20% minimum required.
Tue Oct 21 14:59:40 2014 dbname, public.tasks, pg_toast.pg_toast_16606 INFO Vacuum initial: 0 pages left, duration 0.011 seconds.
Tue Oct 21 14:59:40 2014 dbname, public.tasks, pg_toast.pg_toast_16606 INFO Skipping processing: empty or 1 page table.
Tue Oct 21 14:59:40 2014 dbname NOTICE Processing complete.
Tue Oct 21 14:59:40 2014 dbname NOTICE Processing results: size reduced by 0 bytes (-16 kB including toasts and indexes) in total.
Tue Oct 21 14:59:40 2014 NOTICE Processing complete: 0 retries from 10.
Tue Oct 21 14:59:40 2014 NOTICE Processing results: size reduced by 0 bytes (-16 kB including toasts and indexes) in total, 0 bytes (-16 kB) dbname.
Tue Oct 21 14:59:40 2014 dbname INFO Dropped environment.



Что не так делаю?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38783280
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura31Спасибо за ответ, а можно как то подробнее или ссылку на ман по этой теме? Места на разделе где БД более чем достаточно.
df -h|grep pos
/dev/sdb1 197G 110G 78G 59% /var/lib/postgresql

Код: sql
1.
2.
3.
4.
5.
6.
7.
select pg_size_pretty(pg_relation_size( 'tasks' )) as pg_relation_size, pg_size_pretty(pg_total_relation_size( 'tasks' )) as pg_total_relation_size;
 pg_relation_size | pg_total_relation_size 
------------------+------------------------
 2216 MB          | 18 GB
(1 row)

./pgcompact -h 127.0.0.1 -U postgres --dbname dbname -t tasks --reindex -v info --no-routine-vacuum


Код: sql
1.
2.
3.
<>
Tue Oct 21 14:59:40 2014 dbname, public.tasks INFO Skipping processing: 9.86% space to compact from 20% minimum required.
<>



Что не так делаю?а чего вы ожидаете ?
скорее всего -- чего-то странного


снесите индексы, дропните тосты -- может быть и подгоните размер таблицы к полному размеру таблицы
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38783379
Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ы
Гость
yura31,

В вашей таблице слишком мало мусора, чтобы компактор ее сжал добровольно, как заставить сжимать принудительно, вам уже писали выше.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38783442
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ыyura31,

В вашей таблице слишком мало мусора, чтобы компактор ее сжал добровольно, как заставить сжимать принудительно, вам уже писали выше.поскольку юра с упорством маньяка приводит левое (не относящееся к делу) сравнение полного размера таблицы (с индексами и тостами) с размером голого "релейшена" (без индексов и тостов) предполагаю, что он хочет добиться странного -- а именно сжать таблицу до 2216 MB.

объяснять ему ,что при хотении странного, надобно первым делом себя перепроверить -- дело важное, но малоперспективное.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38783458
yura31
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ы, возможно Вы правы. Завтра попробую сделать ваккум фулл этой таблицы и показать результат.

лопата, Все что я предоставляю, я понимаю, чего я не понимаю, я спрашиваю. И не надо умничать.

pg_relation_size | pg_total_relation_size
------------------+------------------------
2216 MB | 18 GB

Это я предоставил для Максима, для подтверждения что свободного места на дисках больше чем занимает таблица. С названия полей и ежу понятно что с индексами, а что без, нет чего сказать\помочь, пройдите лучше мимо!
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38783528
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura31Ы, возможно Вы правы. Завтра попробую сделать ваккум фулл этой таблицы и показать результат.

лопата, Все что я предоставляю, я понимаю, чего я не понимаю, я спрашиваю. И не надо умничать.

pg_relation_size | pg_total_relation_size
------------------+------------------------
2216 MB | 18 GB

Это я предоставил для Максима, для подтверждения что свободного места на дисках больше чем занимает таблица. С названия полей и ежу понятно что с индексами, а что без, нет чего сказать\помочь, пройдите лучше мимо!вам по кругу второй раз написали, что свободного места (то, чего можно ужать) в таблице меньше 20%.

чтобы сжать меньше 20 (чтобы компактор не увиливал) -- используйте ключ компактора --force (это опять не я, а раньше написали)
т.е. чего тут не ясно -- не ясно. хехе
т.ч. мне остаётся только умничать.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38783566
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura31Ы, возможно Вы правы. Завтра попробую сделать ваккум фулл этой таблицы и показать результат.

лопата, Все что я предоставляю, я понимаю, чего я не понимаю, я спрашиваю. И не надо умничать.

pg_relation_size | pg_total_relation_size
------------------+------------------------
2216 MB | 18 GB

Это я предоставил для Максима, для подтверждения что свободного места на дисках больше чем занимает таблица. С названия полей и ежу понятно что с индексами, а что без, нет чего сказать\помочь, пройдите лучше мимо!

попробуйте для интереса запустить с ключами --force --reidex

но вообще не понятно откуда вывод "свободного места на дисках больше чем занимает таблица".
вы почитайте что эти две функции считают
1)размер файла собственно таблицы на диске
2)суммарный размер файлов относящихся к таблице (включая toast, все индексы и прочая)
при такой большой разнице у вас или очень много индексов или в таблице большой toast (если вы в ней храните большие по длинне тексты или картинки или еще какой xml то это нормальная ситуация).
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38783725
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,
не подскажете -- реиндекс у вас вызывается стандартный, блокирующий, или вы что-то там конкурентно делаете ?

-- у меня есть постоянно обновляющиеся таблички с индексами раздутыми примерно втрое[оптимистическая оценка]. а поскольку постоянно висят какие-то недобитые 10 и более минутные транзакции (текущие отчеты, джобы) -- интересно их реиндексить не сильно блокируя.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38783771
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лопатаMaxim Boguk,
не подскажете -- реиндекс у вас вызывается стандартный, блокирующий, или вы что-то там конкурентно делаете ?

-- у меня есть постоянно обновляющиеся таблички с индексами раздутыми примерно втрое[оптимистическая оценка]. а поскольку постоянно висят какие-то недобитые 10 и более минутные транзакции (текущие отчеты, джобы) -- интересно их реиндексить не сильно блокируя.

неблокирующий (через конкурентный create/drop)
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38784168
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura31
Код: plaintext
1.
2.
3.
 pg_relation_size | pg_total_relation_size 
------------------+------------------------
 2216 MB          | 18 GB


По документации :
`pg_relation_size` возвращает размер таблицы без индексов, тостов и вспомогательных данных (FSM, VM).

`pg_total_relation_size` возвращает размер таблицы включая все индексы, тосты и прочая.

Ни одна из этих функций не лезет внутрь и не проверяет видимость данных, т.е. они не могут быть использованы для определения степени раздутости таблицы и/или индексов.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38786075
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://github.com/pgexperts/pgx_scripts/tree/master/administration
примеры подходов к замеру блоатов:
* index_bloat_check.sql
* table_bloat_check.sql
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38786079
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha Tyurin,

ну и у Максима там тоже должна быть мерилка блоата
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38786242
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha TyurinMisha Tyurin,

ну и у Максима там тоже должна быть мерилка блоата

лучшие мерилки это pgstattuple/pgstatindex из pgstattuple contrib
они во всяком случае реальные цифры дают а не непонятное приближение посчитанное по заумной эвристике
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38786806
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukMisha TyurinMisha Tyurin,

ну и у Максима там тоже должна быть мерилка блоата

лучшие мерилки это pgstattuple/pgstatindex из pgstattuple contrib
они во всяком случае реальные цифры дают а не непонятное приближение посчитанное по заумной эвристике

pgstattuple contrib
+1

ну да, ну да
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38879334
Фотография grufos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

Спасибо за прекрасный инструмент!
Сегодня (да, вот так вот поздно) нашел этот тред на форуме и с большим интересом ознакомился.
Исходник инструмента брал вот отсюда:
GitHub PostgreSQL-Consulting
Я работаю на windows и поэтому сначала озаботился установкой Perl.
Остановилcя на ActivePerl 5.20.1.2000
Попробовал выполнить и столкнулся с проблемой - функция getpwuid($<) (её просто нет в реализации под windows)
Поискав.. нашел решение - заменить на getlogin()
Заработало!
Попробовал на своей локальной БД (6 Гб). Всё отработало без ошибок.
У меня стоит PostgreSQL 9.4.1 (64 bit)
Возможно мой опыт использования на Windows будет кому-то полезен.

Есть предложение
- не нашел опций для задания вывода всех информационных сообщений в файл лога
запуск вида ... > may.log это конечно как вариант, но виде отдельной опции : на экран только ошибки, а в лог детали (это просто как пример)
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38879628
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grufos,


grufosЯ работаю на windows и поэтому сначала озаботился установкой Perl.Первое что вам скажут - поставьте Линукс. Просто потому что Линукс для Пг - родная ОС, в то время, как Винодус для ПГ не является основной ОС. Нет, там он тоже работает, но медленнее и не всегда очевидно. + бывают специфичные для винды ошибки.

Но основной довод - тут очень мало кто знает как готовит Пг на Венде, по причине того, что это никому не надо было. Спецов мало.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38879641
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grufosMaxim Boguk,

Спасибо за прекрасный инструмент!
Сегодня (да, вот так вот поздно) нашел этот тред на форуме и с большим интересом ознакомился.
Исходник инструмента брал вот отсюда:
GitHub PostgreSQL-Consulting
Я работаю на windows и поэтому сначала озаботился установкой Perl.
Остановилcя на ActivePerl 5.20.1.2000
Попробовал выполнить и столкнулся с проблемой - функция getpwuid($<) (её просто нет в реализации под windows)
Поискав.. нашел решение - заменить на getlogin()
Заработало!
Попробовал на своей локальной БД (6 Гб). Всё отработало без ошибок.
У меня стоит PostgreSQL 9.4.1 (64 bit)
Возможно мой опыт использования на Windows будет кому-то полезен.

Есть предложение
- не нашел опций для задания вывода всех информационных сообщений в файл лога
запуск вида ... > may.log это конечно как вариант, но виде отдельной опции : на экран только ошибки, а в лог детали (это просто как пример)

Это вообще сюрприз что оно хоть как то под Win работает если честно. Я о таком варианте даже не думал когда разрабатывал.
Про лог в файл - продумаю и добавлю в течении какого то времени (идея наверное небесмысленная хотя я в 100% случаев использую >pgc.log).

--Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38956834
yura31
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,
Подскажите пожалуйста, как работает pgcompact в нативной мастер-слейв репликации. Пробовал в такой связке, у меня на время процедуры синхронизация останавливалась. После окончание все восстанавливалось с архивов обратно.
Можно это обойти?

Зарание спасибо!
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38956955
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura31Maxim Boguk,
Подскажите пожалуйста, как работает pgcompact в нативной мастер-слейв репликации. Пробовал в такой связке, у меня на время процедуры синхронизация останавливалась. После окончание все восстанавливалось с архивов обратно.
Можно это обойти?

Зарание спасибо!

pgcompact на репликацию вообще никак влиять не должен и не может.
Но количество wal генерируемых при его работе может быть заметно выше обычного.
Могло происходить следующее:
1)не хватала канала между мастером и репликой на передачу всего потока wal
и в итоге
2)в какой то момент просто не хватило установленного у вас wal_keep_segments и реплика отвалилась.

Стоит логи реплики посмотреть на этот счет. И возможно поставить какое то разумное значение для wal_keep_segments (5000 например только проверив что у вас места на дисках хватает).

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38957000
yura31
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,
>1)не хватала канала между мастером и репликой на передачу всего потока wal
Да, Вы правы, спасибо!
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38967168
Фотография grufos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

Вопрос по документации выдаваемой по ключу --man

--no-reindex
Reindex tables after processing.
по наименовании ключа "--no-reindex" можно сказать, что эта опция говорит об отключении индексирования.
А вот во описанию ключа: Переиндексация таблиц после обработки. (То есть включение индексирования)
Здесь что-то не так или может быть я не правильно что-то из этих 2-х строк читаю ...
Рассудите...

В теле скрипта я вижу, что добавился новый ключ
'i|initial-reindex' => \$initial_reindex
но его нет в описании в --man
можно услышать ваш комментарий?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38967169
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grufos,

Мнда давненько я в --man не заглядывал. Поправим на днях.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #38967675
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grufosMaxim Boguk,

Вопрос по документации выдаваемой по ключу --man

--no-reindex
Reindex tables after processing.
по наименовании ключа "--no-reindex" можно сказать, что эта опция говорит об отключении индексирования.
А вот во описанию ключа: Переиндексация таблиц после обработки. (То есть включение индексирования)
Здесь что-то не так или может быть я не правильно что-то из этих 2-х строк читаю ...
Рассудите...

В теле скрипта я вижу, что добавился новый ключ
'i|initial-reindex' => \$initial_reindex
но его нет в описании в --man
можно услышать ваш комментарий?

Вывод --man поправили
Новую версию выложили.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Vacuum Full без полного лока таблицы
    #39669780
gav21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оставлю положительный отзыв о работе тулзы.
Использовал на бою, за 23 часа вычистила 270Гб таблицу, высвободив в ОС около 230Гб.
Из 23 часов, последние 8 часов это работа вакуума, который кусками возвращал место в ОС (phase: truncating heap)
(кстати не понял этот момент, почему итерационно. Я ожидал возврат большим куском сразу по аналогии с truncate only в MS SQL :))
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39669830
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gav21Из 23 часов, последние 8 часов это работа вакуума, который кусками возвращал место в ОС (phase: truncating heap)
(кстати не понял этот момент, почему итерационно. Я ожидал возврат большим куском сразу по аналогии с truncate only в MS SQL :))

Внутренние эффекты реализации в Postgresql.
Если подробно то - фаза truncate она лочит таблицу и на чтение и на запись.
Поскольку делать это надолго вредно (приложение и пользователи будут не рады) то есть максимальная длинна времени насколько vacuum может такой лок взять, и сколько он успеет страниц вернуть с ФС столько и обработает и далее освободит лок и попробует еще раз (и так в цикле).
Отсюда такое странное поведение.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39669863
gav21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,
Спасибо! Теперь понятно :)
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39692337
per
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Максим, добрый день (или ночь у вас в Австралии).

Ссылка в первом сообщении недоступна.

Это то, что вы создали:
https://github.com/koordinates/pg_comparator/blob/master/pg_comparator
?



Хочу установить эту штуковину под виндоус.


Подскажите пожалуйста, как это сделать?

plperl уже установлен.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39692352
per
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grufos,

ваши пост прошел.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39692382
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
perМаксим, добрый день (или ночь у вас в Австралии).

Ссылка в первом сообщении недоступна.

Это то, что вы создали:
https://github.com/koordinates/pg_comparator/blob/master/pg_comparator
?
Нет, что-то другое.
Актуальный pgcompacttable вот здесь: https://github.com/dataegret/pgcompacttable

perplperl уже установлен.
Не нужен. Нужен только сам perl в ОС и DBI коннектор к pg для него. Со стороны базы - contrib pgstattuple, а plperl не нужен.

Не помню, тестировали ли под такой экзотикой как windows.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39692450
per
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MelkijperМаксим, добрый день (или ночь у вас в Австралии).

Ссылка в первом сообщении недоступна.

Это то, что вы создали:
https://github.com/koordinates/pg_comparator/blob/master/pg_comparator
?
Нет, что-то другое.
Актуальный pgcompacttable вот здесь: https://github.com/dataegret/pgcompacttable

perplperl уже установлен.
Не нужен. Нужен только сам perl в ОС и DBI коннектор к pg для него. Со стороны базы - contrib pgstattuple, а plperl не нужен.

Не помню, тестировали ли под такой экзотикой как windows.

Спасибо, за оперативный ответ!

Оказалось plperl вообще не нужен, а я его именно для pgcompacttable хотел :)

По поводу первой ссылки, не вашей, меня комментарии насторожили, типа "я ненавижу перл" и тп.


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


Итак, ближе к делу.

Сделал: create extension pgstattuple.

>DBI коннектор к pg для него
пока ищу что это такое.


По ссылке https://github.com/dataegret/pgcompacttable/blob/master/bin/pgcompacttable огромный скрипт:
Код: sql
1.
2.
3.
#!/usr/bin/perl
use strict;
use warnings;... и т.д.



Я так понимаю что его надо сохранить как файл и вызывать perl.exe с этим скриптом, он на вход запросит параметры.
Правильно или я что-то опять не так понял?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39692456
per
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkij,

пока получил ошибку о которой говорил grufos, сейчас попробую последовать его рекомендации.

Код: sql
1.
2.
3.
4.
C:\Windows\system32>perl C:\compacttable
The getpwuid function is unimplemented at C:\install\compacttable line 47.

C:\Windows\system32>
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39692463
per
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grufosПопробовал выполнить и столкнулся с проблемой - функция getpwuid($<) (её просто нет в реализации под windows)
Поискав.. нашел решение - заменить на getlogin()
Заработало!
Попробовал на своей локальной БД (6 Гб). Всё отработало без ошибок.
У меня стоит PostgreSQL 9.4.1 (64 bit)
Возможно мой опыт использования на Windows будет кому-то полезен.



Сделал как вы сказали - действительно заработало!
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39692478
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
perЗаранее прошу прощения за тупость, но что такое перл вообще не знаю и для постгреса никаких языков ни разу не устанавливал, пользовался из установленного по умолчанию...
Интерпретируемый язык программирования, один из старейших среди ныне встречаемых. Не имеет отношения к postgresql в общем-то никакого.
plperl - биндинг в перлу. От того, что существуют модули pl/python, pl/sh, да даже прости ктулху pl/v8 и pl/java - сами используемые языки не становятся чем-то специфичным для postgresql. Биндинги с деталями взаимодействия с базой - да, специфичны. Сами языки отдельно.

per>DBI коннектор к pg для него
пока ищу что это такое.
libdbi-perl и libdbd-pg-perl
Для экзотики не скажу.

perПо ссылке https://github.com/dataegret/pgcompacttable/blob/master/bin/pgcompacttable огромный скрипт:
Код: sql
1.
2.
3.
#!/usr/bin/perl
use strict;
use warnings;... и т.д.



Я так понимаю что его надо сохранить как файл и вызывать perl.exe с этим скриптом, он на вход запросит параметры.
Правильно или я что-то опять не так понял?
Скрипт намеренно сделан одним файлом, чтобы его можно wget'ом стянуть, дать файлу права на запуск и пользоваться.
Параметры указываются сразу при запуске. Интерактивного режима работы нет.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39692525
per
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkijper>DBI коннектор к pg для него
пока ищу что это такое.
libdbi-perl и libdbd-pg-perl
Для экзотики не скажу.


Ничего дополнительно не создавал, но к БД подключение есть.

Натравил на тестовую табличку 5 Гб с 99.99% мертвых строк.

Надеюсь получится...





Еще один важный вопрос: не держит ли этот скрипт snapshot БД на начало запуска? Т.е. будут ли хот апдэйты и вакуум отрабатывать на других таблицах для данных стрше времени старта скрипт? Ну вы поняли о чем я :)
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39692539
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
per,

нет, не держит. Таблица обновляется крошечными пачками в отдельных транзакциях с паузами. Заметные по длительности транзакции возможны во время перестроения индексов (дефолтно после урезания размера таблицы), там create index concurrently без извращений - тут уж насколько ваше железо позволит быстро построить индекс.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39692541
per
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkijper,

нет, не держит. Таблица обновляется крошечными пачками в отдельных транзакциях с паузами. Заметные по длительности транзакции возможны во время перестроения индексов (дефолтно после урезания размера таблицы), там create index concurrently без извращений - тут уж насколько ваше железо позволит быстро построить индекс.

Отлично!

Как раз хотел на счет индексов уточнить, есть ли возможность запустить без перестройки индексов? (чтоб их ночью, например отдельно перестроить)


Кстати, протестировал.

Я очень доволен результатом!


Вот что было:
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39692542
per
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стало


Максим, большое спасибо!

Ваша утилита просто супер!!!


Я бы ее в контриб предложил включить!
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39692545
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
perКак раз хотел на счет индексов уточнить, есть ли возможность запустить без перестройки индексов? (чтоб их ночью, например отдельно перестроить)
--no-reindex
У вас настолько плохие диски?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39692551
per
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MelkijperКак раз хотел на счет индексов уточнить, есть ли возможность запустить без перестройки индексов? (чтоб их ночью, например отдельно перестроить)
--no-reindex
У вас настолько плохие диски?


Плохие... Думаю перестройка индекса займет часов 8...

Еще у вас там вроде есть различные опции для уменьшения нагрузки на диск (nice или что-то похожее), будут ли они работать на windows ?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39692558
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
per,

ionice -c 3 пробуем вызвать для pid backend'а базы.
Это вас как windows админа надо спросить, есть ли у вас какие-нибудь средства для управления приоритетами i/o. Если есть - то проставьте приоритет backend процессу базы. Помнится pgcompacttable в начале работы даже выводит pid backend'а.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39692564
per
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkijper,

ionice -c 3 пробуем вызвать для pid backend'а базы.
Это вас как windows админа надо спросить, есть ли у вас какие-нибудь средства для управления приоритетами i/o. Если есть - то проставьте приоритет backend процессу базы. Помнится pgcompacttable в начале работы даже выводит pid backend'а.


Так точно, выводит.




Еще важный вопрос: я так понял что compacttable можно запускать с удаленного сервера.

Будет ли в таком случае весь объем таблицы гоняться по сети туда-сюда?

Ну или примерно в % от объема таблицы сколько по сети гнать придется? И на сколько быстрая сеть нужна? Ну вы поняли о чем я спрашиваю :)
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39692572
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
per,

да, можно по сети. Данные вообще не покидают базу.
Создаётся функция и табличка обходится постранично через эту функцию, принимая на вход откуда начинать и возвращая где очередная пачка была завершена. По сети ходят только короткие управляющие команды
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39694941
per
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkij, добрый день.

Запустил на проме по 1 табличке.

Выполняется уже двое суток.


При этом выполнено около 5%.

Таблица объемная, около 300Гб постоянно апдэйтится и инсерется.



В связи с этим возник вопрос:


Я так понял что compacttable переносит данные со всех файлов в несколько первых, максимально заполняя их "живыми" данными.
При этом если будет хоть одна живая запись в конце файла, то он не очистится.

Получается что compacttable бесполезна при постоянных апдэйтах таблицы? Или я что-то не так понял и файлы таблицы все равно очистятся в итоге?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39694991
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
per,

1)как то очень медленно для 300GB
или у вас сильно перегруженные механические диски (вместо SSD)
или что то странное...
я бы рекомендовал заодно поставить
--delay-ratio
A dynamic part of the delay between rounds is calculated as previous-round-time * delay-ratio. By default 2.
В 0 вместо 2 по умолчанию если вам скорость критична и будет быстрее раза в 3 (ценой более высокой нагрузки на сервер).

2)При этом если будет хоть одна живая запись в конце файла, то он не очистится.
Получается что compacttable бесполезна при постоянных апдэйтах таблицы? Или я что-то не так понял и файлы таблицы все равно очистятся в итоге?

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

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39705788
per
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk, добрый день.


В общем, отработала процедурка по огромной таблице.

Но уменьшила ее всего процентов на 5-7, при этом vacuum full уменьшает обычно в два-три раза.

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


Есть три вопроса:



1) Хочется разобраться с механизмом перестройки индексов.

Я так понял что создается новый индекс конкарентли, с временным именем, затем старый удаляется и новый переименовывается в имя старого, который уделился. Так ли это?


2) Пересоздались ли индексы в этом случае?

В логе такие сообщения:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
[Wed Sep 20 04:39:50 2018] (prod:public.my_big_table) Reindex forced: public.my_big_table_pkey, lock retry 1
[Wed Sep 20 04:39:52 2018] (prod:public.my_big_table) Reindex forced: public.my_big_table_pkey, lock retry 2
...
...
...
[Wed Sep 20 04:39:56 2018] (prod:public.my_big_table) Reindex forced: public.my_big_table_pkey, lock retry 99
[Wed Sep 20 04:39:58 2018] (prod:public.my_big_table) Reindex forced: public.my_big_table_pkey, lock retry 100
[Wed Sep 20 04:40:00 2018] (prod:public.my_big_table) Reindex forced: public.my_big_table_pkey, unable lock, delete index
[Wed Sep 20 04:52:50 2018] (prod:public.my_big_table) Reindex forced: public.my_big_table_pkey, lock has not been acquired, initial size 1299018 pages(9.911GB)




3) Имеет ли смысл после окончания процедуры перезапустить postgres и выполнять вакуум большой таблицы еще раз?

Сразу скажу, что у меня это ни на сколько не уменьшило объем таблицы, но я делал с перестройкой индексов, возможно, если не ждать перестройки 3-4 суток (--no-reindex), результат будет другой.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39705812
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
per,

1) да
2) нет, возможно какая-то долгая транзакция мешала
3) нет

Но уменьшила ее всего процентов на 5-7, при этом vacuum full уменьшает обычно в два-три раза.
pgcompacttable не умеет сжимать данные в toast'ах (база не дает в них делать изменения), возможно в этом дело (можно посмотреть размер toast таблицы и оценить bloat в нем). или не удается подчистить конец таблицы из-за постоянных блокировок/долгих транзакций (в этом случае в его выводе будет видно что он 10 раз пытался сжать и не получалось). в последних версиях базы с эта проблема вроде перестала быть заметной (после патча Improve speed of VACUUM's removal of trailing empty heap pages (Claudio Freire, Álvaro Herrera)), до этого приходилось немного извращаться с большими таблицами, где много записи идет постоянно.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39705848
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
per,

Судя по unable lock у вас постоянно какие то транзакции висят длинные на этой таблице.
В таком варианте vacuum никогда не сможет отрезать конец таблицы с свободным местом.
Скорее всего у вас в конце таблицы куча свободного места сейчас.
Я бы попробовал vacuum verbose руками запустить для начала.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39707507
per
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexiuspgcompacttable не умеет сжимать данные в toast'ах (база не дает в них делать изменения)




Maxim Boguk, добрый день.

Так ли это?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39707510
per
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
perAlexiuspgcompacttable не умеет сжимать данные в toast'ах (база не дает в них делать изменения)




Maxim Boguk, добрый день.

Так ли это?


Просто запустил по таблице размером поменьше и вот что в логе, в начале:

Statistics: 4793571 pages (13826429 pages including toasts and indexes), it is expected that ~33.200% (1591468 pages) can be compacted with the estimated space saving being 12.142GB.

Размер тоаст сейчас померяю конечно, но выполняться будет думаю недели две-три, до окончания не узнать.
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39707511
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
perAlexiuspgcompacttable не умеет сжимать данные в toast'ах (база не дает в них делать изменения)

Maxim Boguk, добрый день.

Так ли это?

Да. Если у вас toast распухший вам pg_repack нужен если у вас достаточно места есть на сервере.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39707513
per
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Bogukperпропущено...


Maxim Boguk, добрый день.

Так ли это?

Да. Если у вас toast распухший вам pg_repack нужен если у вас достаточно места есть на сервере.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru


Очень жалко... а toast как-то отдельно пересоздать можно без репака? Типа вакуум фул, только для toast ?
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39707519
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
perMaxim Bogukпропущено...


Да. Если у вас toast распухший вам pg_repack нужен если у вас достаточно места есть на сервере.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru


Очень жалко... а toast как-то отдельно пересоздать можно без репака? Типа вакуум фул, только для toast ?

vacuum full всей таблицы.

PS: не понимаю как у вас недельные времена получаются на такую мелочь, даже терабайтные таблицы компактором за несколько дней легко обрабатываются. Такое может быть только если у вас диски не просто медленные а ОЧЕНЬ медленные, и вам надо сначала проблемы с оборудованием порешать.

PPS: --delay-ratio=0 в командную строку добавьте будет веселее идти.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Vacuum Full без полного лока таблицы
    #39707524
per
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Maxim Boguk]perпропущено...

PPS: --delay-ratio=0 в командную строку добавьте будет веселее идти.



Это я сразу добавил как только вы посоветовали ;)
...
Рейтинг: 0 / 0
154 сообщений из 154, показаны все 7 страниц
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Vacuum Full без полного лока таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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