SQL Server中基于CHAR值设置外键的最优方案及性能优化疑问
问题分析与优化建议
把hazards表的主键改为INT自增类型,同时将main表的外键字段改为INT,确实是合理的优化方向,也能有效减小数据库体积,具体可以从这几个角度来看:
存储空间的直观节省:
SQL Server里CHAR(14)固定占14字节,而INT类型只占4字节。假设你的main表有100万条数据,光外键列就能省出100万*(14-4)=1000万字节(约9.5MB),数据量越大,节省的空间就越多。除此之外,hazards表的主键索引、main表的外键索引体积也会跟着缩小,索引的读写效率也会同步提升。查询性能的提升:
INT类型的索引查找、表连接操作天生比CHAR(14)更快——因为字节数更少,数据库内存里能缓存更多的索引页,减少磁盘IO次数。尤其是当main表数据量上去之后,关联查询的速度差异会很明显。迁移时的注意事项:
直接改表结构容易出问题,建议按这个步骤来:- 先给hazards表加一个INT自增列(比如
new_id INT IDENTITY(1,1) PRIMARY KEY),同时把原来的id CHAR(14)设为唯一约束,防止重复的危险值。 - 给main表加一个INT类型的列(比如
hazard_id INT),通过UPDATE语句关联原hazard列和hazards表的new_id,把数据填充进去。 - 核对数据一致性没问题之后,删掉main表原来的
hazard列,把新的hazard_id设为外键,关联hazards的new_id。 - 如果业务上需要用到这个14字符的ID(比如对外展示、导入导出),记得保留hazards表的原
id列;如果只是内部关联用,也可以考虑删掉,但一般建议留着备用。
- 先给hazards表加一个INT自增列(比如
业务层面的取舍:
如果这个14字符的ID是业务上必须的编码(比如对外输出、和其他系统交互要用),完全可以保留,只把内部关联的主键换成INT就行,不影响业务使用;如果只是用来做关联的内部标识,换成INT就更清爽。
内容的提问来源于stack exchange,提问作者Robson Luan
相关产品推荐
相关产品推荐

