有人正在审查我用于创建表的 DDL 代码并建议,当他们看到我看到使用VARCHAR(256)
文本字段时,我希望它非常小,比如名字或其他什么,我应该总是只使用VARCHAR(MAX)
和链接为什么使用 varchar(max )。我读过它,但它似乎过时了,因为它专注于 2005 年,并且似乎没有提供任何真正的理由来在所有文本字段上每行分配最多 2 GB。
从性能、存储等角度来看,应该如何决定是使用VARCHAR(MAX)
SQL Server 的现代版本还是使用更小更具体的类型?(例如,2008、2012、2014)
在网上搜索,我发现在指定过宽的 VARCHAR 列时是否会影响性能的建议相互矛盾,例如 VARCHAR(255) 时 VARCHAR(30) 可能会这样做。
我一致认为,如果整行超过 8060 字节,性能会受到影响。除此之外,我看到了分歧。
索赔是真的The default is SET ANSI PADDING ON = potential for lots of trailing spaces
吗?只要总行宽小于 8060,过大的 VARCHAR 列是否有任何真正的性能问题?
列宽很重要的证据
The same goes for CHAR and VARCHAR data types. Don’t specify more characters in character columns that you need.
http://www.sql-server-performance.com/2007/datatypes/
Length is a constraint on the data (like CHECK, FK, NULL etc)
Performance when the row exceeds 8060 bytes
Can not have unique constraint or index (key column width must …
其他问题的图表适用于 100 万行的表。当绘制 10,000 行时,该图具有相当不同且更有趣的形状。
当列长度在 524 到 903 之间时,会出现一个平台期。
这种形状可以在我的工作和家用笔记本电脑上看到。(分别是 SQL Server 2017 CU27 和 2017 CU22、2019 CU8。两个盒子都有 16GB RAM。)
这让我认为这是经过调整的真正设计选择,而不是人工制品。
对于 SQL Server 2019 设置 BATCH_MODE_ON_ROWSTORE = OFF 几乎没有任何区别。除 t800 为 6688kB OFF 和 6656kB ON 外,所有大小所需的内存都是相同的。
这个图怎么会是这个形状呢?哪些考虑因素意味着三区域解决方案在中等行数(10,000 行)时是最佳的,但在较大行数(100 万行)时则不是最佳?
据我所知,SQL Sever 开发团队之外的任何人都无法最终说明该特定图形为何呈这种形状。但一般来说,从学术和行业经验来看,如果我开始为假设的 DBMS 编写内存管理模块,什么样的考虑会导致这种结果?