当前位置: 首页 > 面试题库 >

SQL varchar列长度的最佳做法

林修真
2023-03-14
问题内容

已关闭 。这个问题是基于观点的。它当前不接受答案。

想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。

2个月前关闭。

每次设置新的SQL表或varchar向现有表添加新列时,我都想知道一件事:的最佳价值是什么length

假设您有一个名为nametype 的列varchar。因此,您必须选择长度。我想不出一个名称>
20个字符,但您永远不会知道。但是我总是使用四舍五入到下一个2 ^
n数字,而不是使用20。在这种情况下,我将选择32作为长度。我这样做是因为从计算机科学家的角度来看,数字2 ^ n
even在我看来比其他数字要多,我只是假设下面的体系结构可以更好地处理这些数字。

另一方面,例如,当您选择创建varchar列时,MSSQL服务器会将默认长度值设置为50。那让我开始思考。为什么是50?它只是一个随机数,还是基于平均列长,还是什么?

不同的SQL Server实现(例如MySQL,MSSQL,Postgres等)也可能具有(也可能是)不同的最佳列长值。


问题答案:

据我所知,没有DBMS有任何“优化”可以使长度VARCHAR为a的2^n性能比max长度不是2的幂的性能更好。

我认为早期的SQL Server版本实际上将VARCHAR255的长度与最大长度较高的长度区别对待。我不知道是否仍然如此。

对于几乎所有的DBMS,所需的实际存储空间仅取决于您放入其中的字符数,而不取决于max您定义的长度。因此,从存储的角度(也可能是性能的角度),无论您将列声明为VARCHAR(100)还是都没有任何区别VARCHAR(500)

您应该max将为VARCHAR列提供的长度看作是一种约束(或业务规则),而不是技术/实际的事物。

对于PostgreSQL来说,最好的设置是使用text不受长度限制CHECK CONSTRAINT的字符集,它将字符数限制为您的业务需求。

如果该要求发生变化,那么更改检查约束比更改表要快得多(因为不需要重写表)

可以对Oracle和其他对象应用相同的方法-在Oracle中,它VARCHAR(4000)不是,text而是。

我不知道SQL Server VARCHAR(max)VARCHAR(500)SQL Server
之间是否存在物理存储差异。但是varchar(max)与相比,使用显然会对性能产生影响varchar(8000)

看到此链接(由Erwin Brandstetter发表评论)

编辑2013-09-22

关于bigown的评论:

在9.2之前的Postgres版本中(我写初始答案时不可用),对列定义的更改 确实
重写了整个表,请参见例如此处。从9.2开始,情况不再如此,快速测试确认增加具有120万行的表的列大小实际上仅需0.5秒。

对于Oracle来说,从更改大表的varchar列所需的时间来看,这似乎也是正确的。但是我找不到任何参考。

对于MySQL,该手册会说 “ 在大多数情况下,ALTER TABLE为原始表创建一个临时副本
”。我自己的测试证实了:ALTER TABLE在具有120万行的表上运行(与我对Postgres的测试相同)以增加列的大小需要1.5分钟。但是,在MySQL中,您 不能
使用“替代方法”来使用检查约束来限制列中的字符数。

对于SQL Server,我找不到明确的声明,但是执行增加varchar列大小的执行时间(同样是上表的120万行表)表明 没有 重写。

编辑2017-01-24

似乎我(至少部分地)对SQL Server错误。请参阅Aaron
Bertrand的答案,该答案表明a
nvarcharvarcharcolumn 的声明长度对性能有很大的影响。



 类似资料:
  • 这里,在这段代码中,它打印序列的最大子序列的长度,该序列先增加后减少,或者反之亦然。 例如: 输入:1,11,2,10,4,5,2,1 如增-减-增或减-增-减 示例: 投入:7 16 1 6 20 17 7 18 25 1 25 21 11 5 29 11 3 3 26 19

  • 引子 Rax 提供的长列表标签有很多,在什么场景下使用什么列表组件,怎样选择列表组件性能会更好,这些问题可能会给刚接触 Rax 的同学带来困扰。本文结合 Rax 0.5 发布版本对列表能力进行一次详细的梳理。 如何让页面滚动 在开始正题之前先说说为什么要有长列表的概念,以及如何让页面可以滚动。 传统的 Web 页面天生在浏览器里就是可以滚动的,我们额外引入一个滚动容器的概念好像比较多余。但当我们做

  • 问题内容: 我正在寻找一种显示3列内容的方法。我找到了一种显示环绕列的方法,但是我不希望在此页面上显示。我正在寻找一种说法 3次,并在彼此之间显示3列。我最好的例子是The Verge(http://www.theverge.com/)。做这个的最好方式是什么? 问题答案: 我建议您使用或CSS。 CSS是更灵活的首选。一个例子是: 使用float:left会使3列相互粘连,并从居中的div“内容

  • 问题内容: 获取最长单词长度的更Python方式是什么: 要么: 或者是其他东西? 是字符串列表。我发现我经常需要这样做,并且在用几个不同的样本量进行计时之后,第一种方法似乎始终如一地更快,尽管在票面价值上似乎效率不高(被叫两次的冗余似乎无关紧要,在第二种方法中发生的更多)这种形式的C代码?)。 问题答案: 我认为两者都可以,但是我认为除非速度是最易读的大考虑。 当我看着它们时,我花了更长的时间才

  • 问题内容: 我试图从表中获取所有列的列表,这些列表包含它们的数据类型,数据长度和该列中最长值的长度。 我使用此SQL来获取列及其数据类型和长度: 我有此SQL,用于获取值的最大长度: 但是我不知道如何将它们结合起来。我正在使用SQL Server 2008。 问题答案: 感谢您的建议。我想出了以下解决方案。它为我获取了我需要的数据,但是希望了解它是否可以提高效率。

  • 问题内容: 多线程Java应用程序中进行进程间通信的最佳方法是什么? 它应该是高性能的(因此请不要使用JMS),易于实现且可靠,以便对象和数据只能绑定到一个线程? 任何想法欢迎! 问题答案: 假设场景1是JVM,那么实际上应该是多个线程,尤其是各种Queue实现,都是java.util.concurrent。但是,在此之上的抽象可能很好,Jetlang看起来非常有趣,轻量级的Java消息传递。