Фрагментация таблиц в бд Oracle 12c, которой нет в 19с. Часть 1.

Окружение:

OS: OEL 7.8

DB: 12.1.0.2.190716 BP,  2. 19.7.0.0.200414 RU

При выполнений пакетных заданий и не только было замечено интересное — фрагментация таблиц, где казалось бы её не должно быть(или должно?).

Для проверки влияния был составлен тест из 3 циклов:

 1 цикл — главный.

2 цикл находится внутри цикла 1, выполняет вставку.

3 цикл находится внутри цикла 1, выполняет удаление.

Количество проходов циклов 2 и 3 одинаково и задаётся при старте, циклы выполняются друг за другом, commit выполняется после каждой удалённой или вставленной строки.

Тест проводится с участим трёх таблиц(KKS$FRAG_512B, KKS$FRAG_1024B, KKS$FRAG_2048B), в которых длина вставляемой строки заранее известна, это 512байт, 1024байт и 2048байта. Размер сегмента берётся из dba_segments.

Исходный код теста

Для таблиц KKS$FRAG_512B, KKS$FRAG_1024B, KKS$FRAG_2048B было выполнено:

Количество цикловКоличество операций вставок и удалений в каждом цикле
3032003
6061006
606706
606506
606106
Таб.1
  1. Результат для KKS$FRAG_512B:
12.1.0.2.190716 BP, занято байт в таблице KKS$FRAG_512B33554432
12.1.0.2.190716 BP, занято блоков в таблице KKS$FRAG_512B4096
19.7.0.0.200414 RU, занято байт в таблице KKS$FRAG_512B7340032
19.7.0.0.200414 RU, занято блоков в таблице KKS$FRAG_512B896
Таб.2 KKS$FRAG_512B

Различие в размере сегмента составляет 4,5 раза.

2. Результат для KKS$FRAG_1024B:

12.1.0.2.190716 BP, занято байт в таблице KKS$FRAG_1024B33554432
12.1.0.2.190716 BP, занято блоков в таблице KKS$FRAG_1024B4096
19.7.0.0.200414 RU, занято байт в таблице KKS$FRAG_1024B9437184
19.7.0.0.200414 RU, занято блоков в таблице KKS$FRAG_1024B1152
Таб.3 KKS$FRAG_1024B

Отличие скромнее, но оно по прежнему существенно — в 3,5 раза.

3. Результат для KKS$FRAG_2048B:

12.1.0.2.190716 BP, занято байт в таблице KKS$FRAG_2048B19922944
12.1.0.2.190716 BP, занято блоков в таблице KKS$FRAG_2048B2432
19.7.0.0.200414 RU, занято байт в таблице KKS$FRAG_2048B16777216
19.7.0.0.200414 RU, занято блоков в таблице KKS$FRAG_2048B2048
Таб.4 KKS$FRAG_2048B

Разница не велика, но она есть: 1,18 раза

4. Другой профиль нагрузки для KKS$FRAG_512B.

Количество цикловКоличество операций вставок и удалений в каждом цикле
20021002
Таб.5 KKS$FRAG_512B
12.1.0.2.190716 BP, занято байт в таблице KKS$FRAG_512B46137344
12.1.0.2.190716 BP, занято блоков в таблице KKS$FRAG_512B5632
19.7.0.0.200414 RU, занято байт в таблице KKS$FRAG_512B720896
19.7.0.0.200414 RU, занято блоков в таблице KKS$FRAG_512B88
Таб.6 KKS$FRAG_2048B

Разница: в 64 раза

5. Другой профиль нагрузки для KKS$FRAG_1024B.

Количество цикловКоличество операций вставок и удалений в каждом цикле
20021002
Таб.7 KKS$FRAG_1024B

Результат:

12.1.0.2.190716 BP, занято байт в таблице KKS$FRAG_1024B262144
12.1.0.2.190716 BP, занято блоков в таблице KKS$FRAG_1024B32
19.7.0.0.200414 RU, занято байт в таблице KKS$FRAG_1024B196608
19.7.0.0.200414 RU, занято блоков в таблице KKS$FRAG_1024B24
Таб.6 KKS$FRAG_1024B

Разница: в 1.3 раза

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