(3.4)常用知识-char与varchar的选择
1.char与varchar的比较
(1)数据存储开销
【1】varchar列需要2个额外的字节来记录存储数据的长度
【2】每个可为null的char列,需要一些字节(空位图)来反应数据的为空性
【3】无论数据多少,char都占定义的长度分配的存储空间
【4】varchar是存储多少空间,就占多少空间,最大不能超过定义的空间,除此之外还需要2个额外的字节如【1】中所属。
【5】索引上的数据存储不需要额外的内部开销,索引数据的存储方式与数据也在数据的存储方式一样。
(2)NULL值
【1】char列的null占用存储空间
【2】varchar列的null不占存储空间
【3】插入同样数量的null,varchar比char效率高出很多
(3)插入数据
【1】无论是否有索引,char的效率都低于varchar的效率
(4)更新数据
【1】如果更新的列未建立索引,则char的效率低于varchar,但区别不大
【2】如果更新的列简历的索引,则char的效率低于varchar,且区别较大
(5)修改结构
【1】无论是增加还是删除,char与varchar的效率没有什么差异
【2】对于增加列的宽段而言,varchar基本上不花多少时间(因为本来就给它预留了那么多空间并且是根据实际存储数据来分配空间),char则需要花费很长时间(要考虑页分裂、或存储到ROW_OVERFLOW_DATA)
(6)数据检索
【1】无论是否有索引,varchar都比char的扫描要略优。(因为扫描的长度与页数)
2.如何选择char与varchar
(1)char使用情况
【1】列汇总的各行数据长度基本一致,长度变化小,不超过50字节
【2】数据变更频繁,检索需求少
【3】列长度不会经常变化,因为修改char类型的列宽代价很大
【4】不要出现大量null,因为char中null占存储空间
【5】列上不需要建过多索引,过多的索引对char列的数据变更影响较大
(2)varchar使用情况
【1】列中各行长度差异较大
【2】列中数据更新非常少(因为虽然是存多少占多少空间,但是为了避免增长导致使用row_overflow_data),但查询非常频繁
【3】列中没有数据,或为null、空值
3.其他影响因素
(1)列是否允许NULL值
如果允许,则需要考虑NULL值所占数据的比例,定义char null的列时,需要额外的开销来反应为NULL的情况,这回导致插入NULL值分配更多的空间,影响性能,当大表且NULL量较大时,性能影响非常明显。
(2)磁盘空间开销
使用char存储数据时,它占用的空间长度为列定义的长度,与实际数据长度无关,因此往往意味着会比varchar消耗更多存储空间
(3)内存大小
SQL SERVER 以页为单位,数据占用的页越多,往往以为着内存消耗更高,如果数据还没有加载到内存中则读取更多的数据页也意味着更多的磁盘I/O。
(4)数据传输
数据传输主要考虑服务器到客户端,或者是服务器之间的数据交互,或者是与其他系统的数据交互。