Sql 我需要一个单独的表来描述nvarchar(max)吗

Sql 我需要一个单独的表来描述nvarchar(max)吗,sql,database,database-design,data-modeling,Sql,Database,Database Design,Data Modeling,在我以前的一家公司,我们曾经有一个单独的表,我们将长描述存储在一个文本类型列中。我认为这样做是因为文本类型的局限性 我现在正在为我正在开发的现有应用程序设计表,我想到了这个问题。我对将项目的长描述存储在同一个项目表的varchar(max)列上产生了共鸣。我知道我不能为这个列编制索引,但这没关系,因为我不会对这些列进行搜索 到目前为止,我看不出有任何理由将此列分隔到另一个表中 如果我缺少一些东西,或者如果将我的描述存储在varchar(max)上的同一个表上是一个好方法,您能给我一些输入吗?谢谢

在我以前的一家公司,我们曾经有一个单独的表,我们将长描述存储在一个文本类型列中。我认为这样做是因为文本类型的局限性

我现在正在为我正在开发的现有应用程序设计表,我想到了这个问题。我对将项目的长描述存储在同一个项目表的varchar(max)列上产生了共鸣。我知道我不能为这个列编制索引,但这没关系,因为我不会对这些列进行搜索

到目前为止,我看不出有任何理由将此列分隔到另一个表中


如果我缺少一些东西,或者如果将我的描述存储在varchar(max)上的同一个表上是一个好方法,您能给我一些输入吗?谢谢

这取决于您使用它们的频率,但是是的,您可能需要将它们放在单独的桌子上。在做出决定之前,您需要阅读SQL文件分页、页面拆分以及SQL如何存储数据的详细信息


简而言之,varcharmax()肯定会导致性能下降,因为这些字段的长度会因页面拆分的增加而发生很大变化,这是一种昂贵的操作。

将字段保留在表中它们所属的位置。自SQLServer2005以来,该引擎在大数据类型甚至可变长度的短数据类型方面变得更加智能。旧文本、NTEXT和图像类型已弃用。具有最大长度的新类型是它们的替代品。在SQL 2005中,每个分区有3种类型的底层分配单元:一种用于行,一种用于LOB,另一种用于行溢出。MAX类型存储在LOB分配单元中,因此实际上引擎为您管理一个单独的表来存储大型对象。行溢出单元用于更新后不再适合页面的行内可变长度数据,因此它“溢出”到单独的单元中


请参阅。

即使我正在查询表以检索不包含描述列的数据(这对我来说是关键),将varchar(max)列保留在同一个表上是否会降低表的性能?我还想知道这些性能下降是否严重到足以将列分隔到其他表。我只是不想为了一些可以谈判的事情做不必要的工作……也许吧。这取决于字段更新的频率。如果它们只插入一次,很少更新,那么就没有那么多问题了。性能提升是否重要,实际上只有通过对特定场景建模才能知道。用预期的行数填充表格。启动一台机器,以您期望的速度进行插入和更新,然后启动另一台机器,启动大量选定的操作。测量性能创建具有不同布局的新db,然后再次测试。