Предположим, у меня есть таблица со столбцом name varchar(20)
, и я храню строку с именем = "abcdef".
INSERT INTO tab(id, name) values(12, 'abcdef');
Как в этом случае выполняется выделение памяти для name
?
Есть два способа, которыми я могу думать:
а)
20 байтов выделено, но используется только 6. В этом случае varchar2
не имеет каких-либо существенных преимуществ перед char
в плане выделения памяти.
б)
Выделено только 6 байтов. Если это так, и я добавил еще несколько строк после этого,
INSERT INTO tab(id, name) values(13, 'yyyy');
INSERT INTO tab(id, name) values(14, 'zzzz');
а потом я ОБНОВЛЯЮ,
UPDATE tab SET name = 'abcdefghijkl' WHERE id = 12;
Откуда СУБД получает дополнительные 6 байтов, необходимые? Может случиться так, что следующие 6 байтов не будут свободными (если изначально было выделено только 6 байтов, то для каких-то следующих байтов могло бы быть выделено что-то еще) еще).
Есть ли другой способ, кроме как перенести ряд на новое место? Даже сдвиг будет проблемой в случае таблиц с индексами (это может быть хорошо для таблиц с кучей).