Имя: Пароль:
1C
 
Размер индексных таблиц в PostgreSQL
0 timurhv
 
15.10.20
13:58
Имеется PostgreSQL 11.9-1.1C
Платформа 1С 8.3.17.1549
Регистр накопления с измерениями (только кластерный индекс), в измерениях есть строковые (3шт) и ссылочные типы (2шт).

Занялся оптимизаций регистра, хочу избавиться от строковых типов и заметил сильное отличие в размерах между PostgreSQL и MSSQL:
Основная таблица итогов _accumrgt3795 - 6583 Мб
Индексная таблица итогов _accumrgt3795_1 - 6970 Мб
Итого: 13553 Мб

Эта же конфигурация, но архив старый имеет размер в MSSQL:
Data: 5197 Мб
Index: 232 Мб
Итого: 5429 Мб

С чем это связано? Есть какая-то особенность хранения индексов в PostgreSQL?
1 ДенисЧ
 
15.10.20
14:00
А строковые наверно символов по 200?
2 timurhv
 
15.10.20
14:01
(1) 96 + 96 + 14
3 timurhv
 
15.10.20
14:04
Понимаю что надо перейти на ключи-справочники, это и сделаю.
Интересно почему разница в десятки раз отличается.
4 mistеr
 
15.10.20
15:01
(0) Могу предположить, что разница из-за старых версий данных. PostgreSQL хранит их рядом с актуальными данными, а MSSQL отдельно (в tempdb).

Vacuum-то делается в базе?

Также могут влиять настройки выделения места в файлах данных.
5 ДенисЧ
 
15.10.20
15:09
(2) ииии... А чего ты хотел тогда?
6 timurhv
 
15.10.20
15:20
(5) хотел как в MSSQL в 232 Мб, а не 6970 Мб
7 timurhv
 
15.10.20
15:35
(4) Автовакум включен.
Настройки посмотрю, спс
8 rphosts
 
15.10.20
16:54
(7) тебя спросили про вакуум, а не автовакуум.
Вангую что базу никогда не обслуживали... а потом ещё на постгри ругаются...
9 timurhv
 
15.10.20
18:01
(8) Запустил vacuum + full, ничего не изменилось после выполнения.
База с нуля была создана в дев-контуре и загружена dt. При пересчете итогов размеры таблиц уходят в 0, потом снова разрастаются.
10 H A D G E H O G s
 
15.10.20
21:30
(0) Это связано с какой-то дичью. Кластерный индекс не содержит в себе данные, это лишь сортировка + чето там служебное.

Вот у меня получается 10.4 байта индекса на одну строку таблицы при размере в 160 байт данных на строку.
http://prntscr.com/v026ry
11 Cyberhawk
 
15.10.20
21:51
SELECT pg_relation_size('имя_твоего_индекса'); что возвращает?
12 timurhv
 
15.10.20
22:34
(10) В MSSQL все ок
(11) 7308124160, я и физически на диске по OID посмотрел сколько файлы весят

Создал пустую базу 1 документ, 1 регистр накопления, 3 строковых и 2 ссылочных измерения, такая же ситуация.
Оставил 2 ссылочных - тоже самое, т.е. это не связано со строковыми измерениям.
Индексы таблицы итогов: public._accumrgt42_1 = 8776 kB
Таблица итогов: public._accumrgt42 = 8248 kB
13 timurhv
 
15.10.20
22:40
(12) Дополню, выставил у первого измерения ссылочного типа "Индексировать", размер уменьшился до 6648 kB
По второму уже смысла нет, размер не уменьшается, создается еще одна таблица в 4880 kB
14 timurhv
 
15.10.20
22:58
В типовых конфигах БП тоже самое, грусть-печалька.
15 H A D G E H O G s
 
15.10.20
23:01
(13) Используйте MS SQL
16 Cyberhawk
 
16.10.20
20:45
(12) Наверное это как-то связано с тем, что в Постгри кластерный индекс живет отдельно от "основной" таблицы, а кластеризация (упорядочивание) основной таблицы выполняется только на конкретный момент времени. После этого новые записи продолжают вставляться тупо в конец таблицы независимо от порядка, задаваемого кластерным индексом. И кластеризацию поэтому нужно проводить периодически.
Кстати, В-деревья подвезли в Постгри ж совсем недавно, может только от таких индексов можно ожидать, что они будут занимать меньше места? Хотя чем оно занято если индекс не В-дерево, все равно хз.