Thread: index на таблицу с ~ 700 000 записей: чем занят постгрес???

На днях подумал я о бэкапе и воссоздании базы... Сдампил, после
некоторых тестов закомментарил в дампе создание индексов на таблицу
n_traffic (почему - ниже).
Если что, default_statistics_target = 350, хотя было от 200 до 800 не
дождался так и так.

Дело вот такое. Создалась и заполнилась таблица

=# \d n_traffic
                         Table "public.n_traffic"
    Column    |            Type             |          Modifiers
--------------+-----------------------------+------------------------------
 login_id     | integer                     | not null
 traftype_id  | integer                     | not null
 collect_time | timestamp without time zone | not null default now()
 bytes_in     | bigint                      | not null default (0)::bigint
 bytes_out    | bigint                      | not null default (0)::bigint
Indexes:
    "n_traffic_login_id" btree (login_id)
Foreign-key constraints:
    "n_traffic_login_id_fkey" FOREIGN KEY (login_id) REFERENCES
n_logins(login_id) ON UPDATE CASCADE
    "n_traffic_traftype_id_fkey" FOREIGN KEY (traftype_id) REFERENCES
n_traftypes(traftype_id) ON UPDATE CASCADE

В ней более 700 000 записей, collect_time в основном раз в 5 минут, то
есть идут пачки строк, штук по сотне и больше, с одним collect_time.

Делаю для порядка даже
=# VACUUM FULL ANALYZE n_traffic ;

Затем
=# CREATE INDEX n_traffic_collect_time ON n_traffic(collect_time);

...и это замирает надоооолго. Я не стал ждать конца, пока что оставлю
на ночь и спать пойду.
Покопал в архивах, пересмотрел настройки, изменений не видать.
systat vmstat показывает почти полное отсутствие активности диска,
нет-нет возникают какие-то килобайты, и постоянную полную загрузку
проца. top показывает
  PID USERNAME PRI NICE  SIZE   RES STATE    WAIT     TIME    CPU COMMAND
19715 _postgre  64    0   26M   80M onproc/1 -        24:36 99.07% postgres

 До этого был unique индекс на логин, тип и время, но я уже его совсем
закомментарил, боюсь ТАКОГО не дождусь и за неделю... :-((

 Возникает вопрос (в свете замечаний в архиве от Oleg Bartunov о том,
что он и на 500 миллионов записей создавал индексы) - а что собсно
постгрес делает всё это время и делает ли что-то полезное? Чего это он
жучит проц, но почти ничерта не читает/пишет на диск?
--
engineer

Вопрос решился.
Дело было в системных лимитах на разделяемую память и семафоры, а
возможно и в размере кэша файловой системы. Определенно сказать не
могу, т.к. настраивал всё :)
Индекс создается за секунды.
--
engineer

> >> а что у тебя прописано в настройках ?
> > Сначала было много. Потом ещё раз перечитал доку по настройкам
> > произв-ти и сделал
> уменьшил ?
> я обычно их только увеличиваю :)

Нет, дело было уже не в них...
А в СИСТЕМНЫХ лимитах (BSD) на разделяемую память и семафоры. То есть
постгресу по всей видимости хотелось, но не удавалось взять
достаточное количество этого дела. Линукс видимо в таких делах
"отдаётся полностью", вплоть до исчерпания памяти и прибития процесса
за это, поэтому вопрос системных лимитов там не так актуален и здесь
никому на ум не пришёл.
--
engineer