Supposons que j'ai une table avec une colonne name varchar(20)
, et que je stocke une ligne avec name = "abcdef".Comment cela ne rend pas varchar2 inefficace?
INSERT INTO tab(id, name) values(12, 'abcdef');
Comment l'allocation de mémoire pour name
fait dans ce cas?
Il y a deux façons que je peux penser:
a) est alloué, mais seulement 6 utilisés
20 octets. Dans ce cas varchar2
n'a pas d'avantage significatif sur char
, en termes d'allocation de mémoire.
b)
Seuls six octets sont alloués. Si tel est le cas, et j'addded deux autres lignes après celui-ci,
INSERT INTO tab(id, name) values(13, 'yyyy');
INSERT INTO tab(id, name) values(14, 'zzzz');
puis je fais un UPDATE,
UPDATE tab SET name = 'abcdefghijkl' WHERE id = 12;
Où le SGBD obtenir les 6 supplémentaires octets nécessaires de? Il peut y avoir un cas où les 6 octets suivants ne sont pas libres (si seulement 6 ont été alloués initialement, les octets suivants pourraient avoir été attribués pour quelque chose d'autre).
Existe-t-il un autre moyen que de déplacer la ligne vers un nouvel emplacement? Même le décalage serait un problème dans le cas de tables organisées en index (cela peut convenir aux tables organisées en tas).
Cela dépend de l'implémentation, mais il est très probable que lorsque vous mettez à jour, la nouvelle ligne est écrite dans un endroit complètement différent de l'ancienne ligne. C'est vrai même sans varchar. – hobbs