powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / VACUUM FULL: не всегда нужен и полезен (?)
12 сообщений из 12, страница 1 из 1
VACUUM FULL: не всегда нужен и полезен (?)
    #34721458
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, я вставляю большое количество записей, серер притормаживает, насколько я понимаю на расширении файлов.
Потом часть записей удаляю, делаю VACUUM.

В базе остается место, уже аллоцированное и доступное для использования. И при следующей вставке по идее сервер должен побыстрее работать.
...
Рейтинг: 0 / 0
VACUUM FULL: не всегда нужен и полезен (?)
    #34721668
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WinnipuhНапример, я вставляю большое количество записей, серер притормаживает, насколько я понимаю на расширении файлов.
Потом часть записей удаляю, делаю VACUUM.

А чего ему тормозить на расширении файлов? Благо таблицы в ПГ хранятся в разных файлах, а расширение файла - не самая долгая опреация, если конечно винт не "под завязку" накачан. FAT (как таблица, а не FS) практически всегда в памяти кешируется.

Winnipuh
В базе остается место, уже аллоцированное и доступное для использования. И при следующей вставке по идее сервер должен побыстрее работать.
Ну, в принципе-то оно конечно да, но прыганье по страницам - не самое лучшее что может происходить с винтом.
VACUUM FULL уменьшает кол-во страниц, соотвественно таблица, индексы и т.д. занимает меньше места.
ИМХО главная проблема VACUUM FULL - блокировка всей таблицы. А так - юзайте на здоровье.
...
Рейтинг: 0 / 0
VACUUM FULL: не всегда нужен и полезен (?)
    #34722989
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WinnipuhНапример, я вставляю большое количество записей, серер притормаживает, насколько я понимаю на расширении файлов.
Потом часть записей удаляю, делаю VACUUM.

В базе остается место, уже аллоцированное и доступное для использования. И при следующей вставке по идее сервер должен побыстрее работать.Мы именно такую картину наблюдали. Добавление строк в заполненную таблицу выполнялось существенно медленнее, чем в таблицу с имеющимся пустым местом (после vacuum). Поэтому facuum full не злоупотребляем, ежедневно делаем vacuum (или сейчас autovacuum), и еженедельно - vacuum full. (При том, что ежедневно обновляется 20-100% данных.)
...
Рейтинг: 0 / 0
VACUUM FULL: не всегда нужен и полезен (?)
    #34725149
Sad Spirit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WinnipuhНапример, я вставляю большое количество записей, серер притормаживает, насколько я понимаю на расширении файлов.
Потом часть записей удаляю, делаю VACUUM.

В базе остается место, уже аллоцированное и доступное для использования. И при следующей вставке по идее сервер должен побыстрее работать.
Ход мыслей правильный, был бы он неправильным в PostgreSQL бы не добавили такую штуку как FILLFACTOR .
...
Рейтинг: 0 / 0
VACUUM FULL: не всегда нужен и полезен (?)
    #34725696
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понимаю, то фраза This gives UPDATE a chance to place the updated copy of a row on the same page as the original, which is more efficient than placing it on a different page. говорит о том, что прикольно, если все версии одной записи находятся на одной странице. Как я понимаю, то прикольность заключается в том, что не разрастается индекс, и при проверке видимости не нужно читать несколько страниц.
По идее для вставок - некритично, будут ли они вставлятся в конец или в середину - здесь уже нужно смотреть на индексы и т.д.
Для обновлений - польза от попадания на ту же страницу вроде как очевидна.

2LeXa NalBat: А можно поконкретнее условия такого наблюдения? Не совсем понятно откуда такое (на каких механизмах) может браться.
...
Рейтинг: 0 / 0
VACUUM FULL: не всегда нужен и полезен (?)
    #34725837
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat и еженедельно - vacuum full.
Не знаю как в вашем случае, но в моем, к сожалению, на OLTP 24x7 с таблицами > 1 Gb про VACUUM FULL приходится забыть.
...
Рейтинг: 0 / 0
VACUUM FULL: не всегда нужен и полезен (?)
    #34725978
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey DaeronЕсли я правильно понимаю, то фраза This gives UPDATE a chance to place the updated copy of a row on the same page as the original, which is more efficient than placing it on a different page. говорит о том, что прикольно, если все версии одной записи находятся на одной странице. Как я понимаю, то прикольность заключается в том, что не разрастается индекс, и при проверке видимости не нужно читать несколько страниц.При апдейте происходит не только запись новой строки, но и изменение старой строки? Если так, то в случае нахождения обоих строк на одной странице, для этого потребуется запись одной страницы.

Andrey DaeronПо идее для вставок - некритично, будут ли они вставлятся в конец или в середину - здесь уже нужно смотреть на индексы и т.д.Может быть для B-дерева лучше, если близкие записи будут лежать на одной странице, это бы ускорило выборку диапазона. Реализовано ли это в постгресе?

Andrey Daeron2LeXa NalBat: А можно поконкретнее условия такого наблюдения? Не совсем понятно откуда такое (на каких механизмах) может браться.Наверное файловой системе быстрее записать в середину имеющегося файла, чем добавить к файлу кусок. Зависит от ФС? Хотя наш админ сейчас сказал, что по части ФС скорость этих операций должна быть почти одинаковая.

Это наблюдали давно, но вот вроде бы нашел тест и результаты от 2004 года, кажется то что нужно. Видимо, дело не в ФС, а в fsync.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

main()
{
        int fd, i;

        fd = open( "test.dat", O_WRONLY|O_CREAT|O_TRUNC );
        fchmod( fd,  00644  );
        lseek( fd,  100000 , SEEK_SET );
        write( fd, "",  1  );

        lseek( fd,         0 , SEEK_SET );
        for ( i= 0 ; i< 1000 ; i++ )
        {
                write( fd, "",  100  );
                fsync( fd );
        }

        close( fd );
}
Код: plaintext
1.
2.
3.
4.
5.
6.
                        IDE             SCSI

        nosync           0 . 01  /  0 . 003      0 . 01  /  0 . 003 

        f_sync           26  /  19           9  /  9 

        o_sync           26  /  0 . 2          9  /  5 . 5 
Сейчас запустил как есть, и с закомментаренными строками "lseek( fd, 100000, SEEK_SET ); write( fd, "", 1 );" - разница в скорости выполнения в 3.5 раза.

Thamerlanк сожалению, на OLTP 24x7 с таблицами > 1 Gb про VACUUM FULL приходится забыть.И ладно, ИМХО, проживете и без него. У вас например и в ночь с субботы на воскресенье нельзя опустить сервис на 10 минут?
...
Рейтинг: 0 / 0
VACUUM FULL: не всегда нужен и полезен (?)
    #34726323
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatИ ладно, ИМХО, проживете и без него. У вас например и в ночь с субботы на воскресенье нельзя опустить сервис на 10 минут?

К сожалению, опускать нельзя, ровно как и выделить 10 минут простоя. Пытаюсь обходиться VACUUM'ом (autovacuum) + надо срочно вводить вертикальное/горизонтальное партиционирование.
...
Рейтинг: 0 / 0
VACUUM FULL: не всегда нужен и полезен (?)
    #34726523
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat Andrey DaeronЕсли я правильно понимаю, то фраза This gives UPDATE a chance to place the updated copy of a row on the same page as the original, which is more efficient than placing it on a different page. говорит о том, что прикольно, если все версии одной записи находятся на одной странице. Как я понимаю, то прикольность заключается в том, что не разрастается индекс, и при проверке видимости не нужно читать несколько страниц.При апдейте происходит не только запись новой строки, но и изменение старой строки? Если так, то в случае нахождения обоих строк на одной странице, для этого потребуется запись одной страницы.

По идее да. В каждой записи как минимум хранится ID транзакции с которой и по какую она видима. дока
Т.е. для UPDATE - польза несомненна.

LeXa NalBat
Andrey DaeronПо идее для вставок - некритично, будут ли они вставлятся в конец или в середину - здесь уже нужно смотреть на индексы и т.д.Может быть для B-дерева лучше, если близкие записи будут лежать на одной странице, это бы ускорило выборку диапазона. Реализовано ли это в постгресе?

Для B-дерева - однозначно лучше (например кластеризация по индексу). В постгресе ИМХО - не реализоавно, но уверенности в этом нет. В доках -не нашел. Тесты пока тоже не проводил.

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

LeXa NalBat
Andrey Daeron2LeXa NalBat: А можно поконкретнее условия такого наблюдения? Не совсем понятно откуда такое (на каких механизмах) может браться.Наверное файловой системе быстрее записать в середину имеющегося файла, чем добавить к файлу кусок. Зависит от ФС? Хотя наш админ сейчас сказал, что по части ФС скорость этих операций должна быть почти одинаковая.

Ну мне тоже так кажется. Может быть накладные расходы? Опять же на индексы и таблицу страниц.

LeXa NalBat
Это наблюдали давно, но вот вроде бы нашел тест и результаты от 2004 года, кажется то что нужно. Видимо, дело не в ФС, а в fsync.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

main()
{
        int fd, i;

        fd = open( "test.dat", O_WRONLY|O_CREAT|O_TRUNC );
        fchmod( fd,  00644  );
        lseek( fd,  100000 , SEEK_SET );
        write( fd, "",  1  );

        lseek( fd,         0 , SEEK_SET );
        for ( i= 0 ; i< 1000 ; i++ )
        {
                write( fd, "",  100  );
                fsync( fd );
        }

        close( fd );
}
Код: plaintext
1.
2.
3.
4.
5.
6.
                        IDE             SCSI

        nosync           0 . 01  /  0 . 003      0 . 01  /  0 . 003 

        f_sync           26  /  19           9  /  9 

        o_sync           26  /  0 . 2          9  /  5 . 5 
Сейчас запустил как есть, и с закомментаренными строками "lseek( fd, 100000, SEEK_SET ); write( fd, "", 1 );" - разница в скорости выполнения в 3.5 раза.

Ну, наверно да... блок в ФС 512 байт, (1000*100)/512 ~200 выделиний блоков - многовато, еще и каждое fsync()'ить. Но я сильно не уверен в том, что такая же ситуация в СУБД.
1. В СУБД fsync() делается реже.
2. Выделение места в СУБД идет сразу на страницу, коорая по размерам ИМХО больше (4к штоли), и для мелких записей - естественно гораздо реже будут выделятся.
...
Рейтинг: 0 / 0
VACUUM FULL: не всегда нужен и полезен (?)
    #34727058
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey DaeronВ ПГ в индексах хранятся номера страниц, в которых когда-то были данные и он каждый раз проверяет их там наличие (когда индекс юзает). Чем меньше страниц - тем однозначно лучше, меньше проверять.В индексе хранятся номера страниц таблицы? Проверяет их наличие в таблице? Тогда выигрыша не получается, так как параметр FILLFACTOR относится к индексу, а не таблице. А в таблице строки разбросаны по страницам, конечно в общем случае, если таблица не кластеризована по этому индексу. Или я что-то не так понял?

Andrey Daeron LeXa NalBatНаверное файловой системе быстрее записать в середину имеющегося файла, чем добавить к файлу кусок. Зависит от ФС? Хотя наш админ сейчас сказал, что по части ФС скорость этих операций должна быть почти одинаковая.Ну мне тоже так кажется. Может быть накладные расходы? Опять же на индексы и таблицу страниц.Мне кажется, что наблюдается существенная разница в скорости. И тесты это вроде бы подтверждают. Чтобы уменьшить влияние "накладных расходов", я бы делал тест как можно проще, на таблице без индексов и т.п.

Andrey Daeronблок в ФС 512 байтУ меня наверное 4K, судя по тому что ls показывает размер директории 4096.

Andrey Daeron(1000*100)/512 ~200 выделиний блоков - многоватоСтолько юзер захотел данных добавить. Кстати вовсе не много - всего 100K. И смотреть ведь надо не на абсолютное время записи данных, а сравнивать скорости двух вариантов (в аллоцированный файл, и последовательное добавление) друг относительно друга.

Andrey Daeronеще и каждое fsync()'итьМы пытались сэмулировать INSERT через write(), и COMMIT через fsync(). То есть юзер делает INSERT строки размером 100 байт, затем COMMIT.

Andrey Daeron1. В СУБД fsync() делается реже.Нет, при commit-е, что мы и моделировали, то есть вроде бы тест верный.

Andrey Daeron2. Выделение места в СУБД идет сразу на страницуНаблюдая за файлами в data/base похоже. А это где-то описано?

Andrey Daeronкоорая по размерам ИМХО больше (4к штоли)Я думал, что страница в СУБД и сраница в ФС - одно и то же. Это не так?
...
Рейтинг: 0 / 0
VACUUM FULL: не всегда нужен и полезен (?)
    #34727637
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat Andrey DaeronВ ПГ в индексах хранятся номера страниц, в которых когда-то были данные и он каждый раз проверяет их там наличие (когда индекс юзает). Чем меньше страниц - тем однозначно лучше, меньше проверять.В индексе хранятся номера страниц таблицы? Проверяет их наличие в таблице? Тогда выигрыша не получается, так как параметр FILLFACTOR относится к индексу, а не таблице. А в таблице строки разбросаны по страницам, конечно в общем случае, если таблица не кластеризована по этому индексу. Или я что-то не так понял?

Вот для таблиц:
FILLFACTOR

Код: plaintext
1.
2.
3.
4.
5.
The fillfactor for a table is a percentage between  10  and  100 .  100  (complete packing) is the 
default. When a smaller fillfactor is specified, INSERT operations pack table pages only to the indicated
 percentage; the remaining space on each page is reserved for updating rows on that page. This gives 
UPDATE a chance to place the updated copy of a row on the same page as the original, which is more 
efficient than placing it on a different page. For a table whose entries are never updated, complete 
packing is the best choice, but in heavily updated tables smaller fillfactors are appropriate.

Про INSERT ни слова. Для UPDATE - супер, для INSERT - пофиг.

В отличие от обычного сканирования индекса, в котором за один раз из индекса считывается только один указатель на запись, по которому потом поднимается сама запись из таблицы , bitmap scan считывает все указатели за один раз (Bitmap Index Scan), сортирует их в памяти и потом считывает записи уже в локализованном на диске порядке (Bitmap Heap Scan). Таким образом, увеличивается скорость чтения записей с диска, но ценою создания в памяти специальной структуры данных. Заметим, что производительность ORDER BY может пострадать, так как записи считываются не в том порядке, как они хранились в индексе.
Если bitmap становится очень большим, то вместо записей хранятся ссылки на страницы, которые содержат записи, удовлетворяющие запросу. Поэтому, в таком случае, необходима дополнительная проверка (Recheck), чтобы получить только требуемые записи.
(c) Олег Бартунов и Федор Сигаев
Но че-то меня не оставляет мысль что и в самих индексах не совсем то хранится т.е. не ссылки на записи, а на страницы. Но найти ссылку не могу. По этому - это все таки ИМХО.

LeXa NalBat
Andrey Daeron LeXa NalBatНаверное файловой системе быстрее записать в середину имеющегося файла, чем добавить к файлу кусок. Зависит от ФС? Хотя наш админ сейчас сказал, что по части ФС скорость этих операций должна быть почти одинаковая.Ну мне тоже так кажется. Может быть накладные расходы? Опять же на индексы и таблицу страниц.Мне кажется, что наблюдается существенная разница в скорости. И тесты это вроде бы подтверждают. Чтобы уменьшить влияние "накладных расходов", я бы делал тест как можно проще, на таблице без индексов и т.п.

Я не уверен, что этот код отражает происходящее в СУБД. ИМХО он слишком "простой" в реальной жизни все может быть нмного по другому.

LeXa NalBat
Andrey Daeronблок в ФС 512 байтУ меня наверное 4K, судя по тому что ls показывает размер директории 4096.

Это зависит от ОС, FS и ее настроек. 512 - размер сектора. Роясь в инете - нарыл еще и 64к сектора.

LeXa NalBat
Andrey Daeron(1000*100)/512 ~200 выделиний блоков - многоватоСтолько юзер захотел данных добавить. Кстати вовсе не много - всего 100K. И смотреть ведь надо не на абсолютное время записи данных, а сравнивать скорости двух вариантов (в аллоцированный файл, и последовательное добавление) друг относительно друга.

Может есть время на СУБД тест провести? На реальных данных? Забульбенить этак 10-50кк записей, проиндексировать к примеру сначала все четные. Потом их нафиг удалить и залить заново но уже INSERT'ом. VACUUM по вкусу :) и посмотреть и время, и физический размер файлов. Он тоже очччень интерисует.

LeXa NalBat
Andrey Daeronкоорая по размерам ИМХО больше (4к штоли)Я думал, что страница в СУБД и сраница в ФС - одно и то же. Это не так?
Нет, не так. Цитата (правда про WAL, на сколько я нашел косвенные упоминания для обычных таблиц тоже самое):
Each segment is divided into pages, normally 8 kB each . Для разных FS разные размеры кластеров, для PG - ИМХО это параметр компиляции.
...
Рейтинг: 0 / 0
VACUUM FULL: не всегда нужен и полезен (?)
    #34728637
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey DaeronВот для таблиц: FILLFACTOR Точно, что-то меня проглючило, будто бы FILLFACTOR только для индексов, а не для таблиц. Злостно заблуждался.

Andrey DaeronМожет есть время на СУБД тест провести? На реальных данных? Забульбенить этак 10-50кк записей, проиндексировать к примеру сначала все четные. Потом их нафиг удалить и залить заново но уже INSERT'ом. VACUUM по вкусу :) и посмотреть и время, и физический размер файлов. Он тоже очччень интерисует.Может быть когда-нибудь позже.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / VACUUM FULL: не всегда нужен и полезен (?)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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