Что и как postgresql хранит в toast

В документации сказано, что сначала postgresql пытается сжать данные, если не получится, то помещает в таблицу toast. Проверим это и дополнительно выясним, может ли он поместить в toast массивы. Создадим разные таблицы, каждую заполним 1.000 строк.

таблица колонки данные

общий

размер

размер

таблицы

размер toast

размер таблицы

на строку

размер toast

на строку

полезный

размер строки

simple_1 c1 text 'a' x 2004 2.080.768 2.072.576 8.192 2.072 8 2004+4
simple_2 c1 text 'a' x 2005 106.496 98304 8.192 98 8 2005+4
                 
rnd_1 c1 text rnd x 2000 2.080.768 2.072.576 8.192 2.072 8 2000+4
rnd_2 c1 text rnd x 2500 2.908.160 81.920 2.826.240 81 2.826 2500+4
rnd_3 c1 text rnd x 5000 6.053.888 81.920 5.971.968 81 5.971 5000+4
                 
rnd_si_1 c1 text 'a' x 2500 + rnd x 2500 3.244.032 81920 3.162.112 81 3.162 5000+4
rnd_si_2 c1 text rnd x 2500 + 'a' x 2500 5.931.008 81920 5.849.088 81 5.849 5000+4
                 
crnd_1 c1 text .. c3 text rnd x 1000 .. rnd x 1000 3.629.056 1.196.032 2.433.024 1.196 2.433 3000+4*3
crnd_1 c1 text .. c3 text 'a' x 1000 .. 'a' x 1000 1.204.224 1.196.032 8.192 1.196 8 3000+4*3
                 
arr_1 c1 text[] ARRAY['a' x 1000 .. 'a' x 1000] 139.264 131.072 8.192 131 8 3000+4*3+4
arr_2 c1 text[] ARRAY[rnd x 1000 .. rnd x 1000] 42.68032 81.920 4.186.112 81 4.186 3000+4*3+4
arr_3 c1 integer[] ARRAY[0 x 10000] 581.632 573.440 8.192 573 8 40000
arr_4 c1 integer[] ARRAY[rnd x 10000] 41.721.856 81.920 41.639.936 81 41.639 40000

Если таблица toast создается, и она пустая, то toast занимает 8192 байта.

simpe_1 и simple_2 показывают, что postgresql начинает сжимать кортежи начиная с 2005 байт, как и сказано в документации.

simple_2 демонстрирует, что если после сжатия данные помещаются в 2Кб, то остаются в таблице.

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

crnd_1 показывается что данные в toast перемещаются и сжимаются по полям.

arr_1 показывается что поля-массивы перемещаются целиком

arr_3, arr_4 - array это тип который сжимается, даже если содержит int, и помещается в toast, если после сжатия не влезает в таблицу.

 

Яндекс.Метрика