为什么在更新行时VARCHAR比CHAR慢?

时间:2019-04-15 07:26:46

标签: sql-server tsql

我正在读书:

  

例如,当一列定义为VARCHAR(25)时,支持的最大字符数为25,但是实际上,字符串中的实际字符数决定了存储量。因为存储消耗   这些数据类型的数据小于固定长度类型的数据,读取操作更快。但是,更新可能导致行扩展,这可能导致数据移动到当前页面之外。因此,具有可变长度数据类型的数据的更新效率比具有固定长度数据类型的数据的更新效率低。

我可以理解,varchar的存储消耗比char的存储消耗少,但是为什么更新记录时它比char慢呢?行扩展是什么意思,行扩展时实际上会发生什么?

假设我们有一个郊区表,其中有两列zipcode char(5)name varchar,并且我们需要将zipcode的行记录更新为10005,而{{ 1}}设为'NYC',我们为name列仅设置了3个字符,难道它不比需要5个字符的name列有效吗?

1 个答案:

答案 0 :(得分:3)

行首先以固定大小的列进行布局,与行开头的位置为 fixed 。然后(在中间的一些重要字节之后)将可变大小的数据放在末尾。由于它的大小可变,因此无法为整个表(如固定数据)计算数据的实际偏移量,而必须逐行计算。

如果一个varchar(5) 1 正在存储NYC,然后被要求存储NYCX,则可能会发现末尾没有备用字节NYC中的-已用于另一列-因此该行必须 expand ,方法是将一个字节后的所有内容往前移,以腾出空间来容纳多余的字节。


1 我注意到在您的一个示例中,您未能指定长度。请深入了解自己that's a bad habit

相关问题