原文:设计表的时候,对变长字段长度选择的一点思考

不管是在MSSQL还是MySQL或者Oracle,变长字段的长度衡量都是要经常面对的。
对于一个变长的字段,在满足业务的情况下(其实所谓的满足业务是一个比较模糊的东西),到底是选择varchar(50)还是varchar(200)亦或是varchar(500)?
对于保守型选择,往往是选择一个较大的长度,比如varchar(500)要比varchar(50)更具有兼容性,因为是变长字段的原因,存储空间也一样。
这样的选择并不能说就不好,看站在哪个角度来看问题。
那么,相对于varchar(50),varchar(500)在更具备兼容性的同时,有哪些不好的地方,也是需要思考的,。

这里的原则就是:对于可变长度的字段,在满足条件的前提下,尽可能使用较短的变长字段长度。

以下是一个相对极端的例子,以SQL Server为例,
TestVarchar1和TestVarchar2的SortColumn 字段长度分别是varchar(50)和varchar(8000),两个表写入10000条测一样的试数据,
SortColumn 的实际长度是36个字符。

Create Table TestVarchar1
(Id INT IDENTITY(1,1),SortColumn varchar(50)
)Create Table TestVarchar2
(Id INT IDENTITY(1,1),SortColumn varchar(8000)
)DECLARE @SortColumn char(36);
set @SortColumn = CAST(NEWID() as char(36))
insert into TestVarchar1(SortColumn) values (@SortColumn)
insert into TestVarchar2(SortColumn) values (@SortColumn)
GO 10000

1,基于存储空间的考虑

存储空间上,存储不超过一定长度的变长字段,不同长度的变长字段存储空间是一样的,比如选择使用varchar(50)和varchar(500)是一样的,
也就说,对于不超过50个字符串的数据存储,两者在物理空间占用上并没有区别。

这里会发现,两个表的数据在完全一致的情况下,其存储空间也是完全一样的,的确,并不会因为varchar使用一个较长的长度而多占用存储空间

2,基于性能的考虑
选择varchar(50)还是varchar(8000),在性能上确实有显著的差异,考虑到某些查询需要内存(Memory Grant),查询引擎会预估当前查询需要的内存,影响查询内存的因素有以下几个方面
1,查询的类型,有没有聚合运算,有没有排序等等
2,每个操作符涉及到的记录数量
3,数据行的大小(这里是字段类型的长度而不是字段实际长度)
当行记录的数据类型长度较大的时候,执行计划预估的平均大小较大,数据类型定义的长度越大,预估的长度越大,需要分配的内存越大
如果一个查询涉及一些聚合操作并且数据量较大,就可能需要大量的内存来完成这个查询,查询引起会分配多余实际需要的内存。

两者对数据行Size的预估是一样的(尽管是完全一样的数据)

造成的结果就是两个查询的内存授予是一样的,同时第二个执行计划还有一个警告信息(黄色的感叹号)

以上可以看出,尽管两个表的数据是完全一致的,
不过字段的最大长度不一致,造成执行计划预估出现较大的偏差,因此给予较高的内存,浪费无所谓的资源。

再看一个通过聚合函数操作两张表的例子,会增加CPU的使用。

因此对于可变长度的字段,在满足条件的前提下,尽可能使用较短的变长字段长度。

当然,较大的字段(相比较小)还可能存在一些不是太直观的影响,参考:https://yq.aliyun.com/articles/17147?spm=a2c4e.11155435.0.0.578a71a89qSBMc

设计表的时候,对变长字段长度选择的一点思考相关推荐

  1. mysql设计表时 varchar长度_设计表的时候,对变长字段长度选择的一点思考

    设计表时,不管是在MSSQL还是MySQL或者Oracle,变长字段的长度衡量都是要经常面对的. 对于一个变长的字段,在满足业务的情况下(其实所谓的满足业务是一个比较模糊的东西),到底是选择varch ...

  2. 对于表列数据类型选择的一点思考

    对于表列数据类型选择的一点思考 简介 SQL Server每个表中各列的数据类型的选择通常显得很简单,但是对于具体数据类型的选择的不同对性能的影响还是略有差别.本篇文章对SQL Server表列数据类 ...

  3. Kafka消息格式中的变长字段(Varints)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  4. 关于程序变式中动态选择的一点说明

    今天在做一个程序,功能是调用FBL3N(总账科目行项目显示),并且向这个程序传入相应的选择屏幕值,直接展示报表.但是,遇到了一个问题,就是这里面的动态选择中的屏幕选项,无法写入值,废了好大的周折,才搞 ...

  5. mysql 修改字段长度_面试官:InnoDB记录存储结构都不知道,你敢说你懂MySQL?

    前言 了解MySQL的人都知道,MySQL服务器上负责对表中数据的读取和写入工作的部分是存储引擎,而MySQL的存储引擎有MyISAM和InnoDB.不同的存储引擎一般是由不同的人为实现不同的特性而开 ...

  6. 数据库架构设计——表结构设计

    摘要 如何打造出一个能支撑海量的并发访问的分布式 MySQL 架构,本系列博文将从一下多个方面来分析有关MYSQL系统的架构设计相关原理.实际的业务为案例分析,分析实际业务中表使用的字段类型是如何选型 ...

  7. 使用基于Boost的预处理器元编程实现变长类型列表的参数化

    最近的工作中有这样一个需求: 使用宏自动生成类成员函数的声明和实现代码,成员函数的返回值类型不定,参数表可能为空,也可能有任意个任意类型的参数,例如: //函数名:foo0.返回值:int.参数类型表 ...

  8. FI:会计年度变式, 字段状态变式, 信贷控制范围

    基于公司代码级别的四个变式:(科目表),会计年度变式, 字段状态变式, 信贷控制范围 1) 会计年度变式 会计年度变式(Fiscal Year Variant)是指每个年份的记帐期间数量,包括普通记帐 ...

  9. 数据库设计技巧系列(二)——设计表和字段

    设计表和字段 1. 检查各种变化 我在设计数据库的时候会考虑到哪些数据字段将来可能会发生变更.比方说,姓氏就是如此(注意是西方人的姓氏,比如女性结婚后从夫姓等).所以,在建立系统存储客户信息时,我倾向 ...

最新文章

  1. java地图上标记_绘制点标记-在地图上绘制-开发指南-Android 地图SDK | 高德地图API...
  2. kettle安装部署及远程执行
  3. python工程师-如何面试Python后端工程师?
  4. 1小时学会建站(二):购买及绑定域名
  5. WUSTOJ 1299: 结点选择(Java)
  6. 百度更新算法之后我想说
  7. 大华供应链管理平台_files_锦江全球采购平台SRM系统2.0版本上线 打造更智能的供应链...
  8. c语言编程宝典pdf,C语言编程宝典之一.pdf
  9. C++异常(exception)第一篇--综合讲解
  10. 互联网晚报 | 2月18日 星期五 | 高途宣布停止高中学科辅导服务;小红书启动最严医美专项治理;FF 91量产版2月23日发布...
  11. 【今日CV 计算机视觉论文速览 第131期】Mon, 17 Jun 2019
  12. python get,post提交表单
  13. 贴吧用html标签,html标签3(转载)
  14. nhibernate入门的帮助
  15. ggplot2作图详解:ggplot图形对象
  16. .net页面间的参数传递简单实例
  17. C++中常引用的注意事项以及常引用和非常引用之间的转换
  18. Fiddler2汉化版使用说明
  19. 【持续更新中...】2021年全国大学生电子设计大赛 (三)匿名四轴拓空者飞控系统设计解读
  20. python文件或文本加密(4种方法)

热门文章

  1. express基本原理
  2. mysql主从复制中间件_linux下mysql主从复制(第二篇读写分离) mycat 中间件
  3. docker容易内部怎么编辑_在Docker的工作流中常见问题及最终方案
  4. java流程控制if_java程序流程控制(分支结构之 if-else)
  5. Python得到n个从start到end的不重复随机数(set实现)
  6. Eclipse 取消 Import 堆叠
  7. php 删除 session 文件,如何删除php中的session文件
  8. OFFICE EXCEL表格中让A1 中的数字为变量时,如何引用
  9. 你敲键盘的声音,出卖了你 | 附开源代码
  10. 谷歌CEO皮猜:我们想服务中国用户,但是没想好提供何种服务