Что и как 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, если после сжатия не влезает в таблицу.
- Log in to post comments