如果另一列是 varchar,char 有用吗?
Posted
技术标签:
【中文标题】如果另一列是 varchar,char 有用吗?【英文标题】:Is char useful if another column is varchar? 【发布时间】:2018-11-04 04:27:17 【问题描述】:如果一个表有一个可变长度的列,是否会在其他列的长度固定时有任何好处,或者它们的优势会因为行没有固定长度而被取消,因此 SQL 应用程序将无法轻松计算行的位置?
如果重要的话,我问的是 SQL Server。
编辑:重复??哇。哇...
【问题讨论】:
@maSTAShuFu 例如varchar。 What's the difference between VARCHAR and CHAR?的可能重复 【参考方案1】:从寻址记录的角度来看,这根本没有区别。不要担心 SQL Server 会找到行的位置。数据库不假定行是具有固定长度项的数组。
相反,行存储在数据页上。数据页有一个标题。标题具有页面上行的偏移量。没有乘以固定长度来查找记录的开始位置。
好吧,从技术上讲,行偏移不是页眉的一部分,而是页脚的一部分。这是一个细微差别。 Here 很好地描述了页面布局。 documentation 也涵盖了该主题。
【讨论】:
谢谢!所以使用char(或nchar)的原因只是为了空间(在那些实际上节省空间的情况下)而不是索引,我猜。 @ispiro 。 . .主要关心的应该是哪种类型能更好地表示您要表示的数据。 是的。但我现在可以决定是使用简单的字符串表示还是使用某种代码来节省空间(我想,速度也是如此)。一种 enum (“枚举”。我不知道它是被所有人使用还是仅在 C# 中使用)。而且似乎没有简单的方法来保存枚举。 @ispiro 。 . . “枚举”的 SQL 等效项是引用表的外键。不完全一样。我会说你在优化方面的努力还为时过早。将数据表示为最适合您的需求。如果您的数据变得非常大,或者您预计会出现其他性能问题,那么您可以根据可行的方法重新审视决策。 谢谢。The SQL equivalent of an "enum"...
- 是的。这就是我写“没有简单方法”的原因。我不想处理那个。【参考方案2】:
实现细节由数据库本身处理。您需要指定所需的内容,SQL Server 将适当地存储和检索它们。
别担心。
【讨论】:
【参考方案3】:是的,如果您坚持使用CHAR
列,将会有所收获。考虑页面拆分和碎片。由于VARCHAR
列上的页面拆分,我看到主键有 99% 的碎片。
【讨论】:
以上是关于如果另一列是 varchar,char 有用吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何将三列合并为两列,一列是分类的,另一列是数字的? (蟒蛇熊猫)