如何在SQL Server 2012行中内联存储超过8000字节的数据?

时间:2013-06-04 15:49:14

标签: sql-server

我正在尝试编写一个小型博客引擎。我很想找到一个示例SQL Server架构给我一些想法,但还没有找到一个。

我想有一个博客表,允许我存储超过8000字节的数据。任何人都可以告诉我,如果有一个好的方法可以使用这样的两个字段:

CREATE TABLE [Blog](
 [BlogId] [int] IDENTITY(1,1) NOT NULL,
 [BlogText1] [nvarchar](8000) NOT NULL,
 [BlogText2] [nvarchar](8000),
 ..

我想的是将文本存储在两个字段中,让我的应用程序在显示数据时附加两个字段的内容,当存储数据时,第一个xxx字符存储在BlogText1中,然后存储在BlogText2。

这是合理的做法还是应该使用nvarchar(max)?

如果我使用nvarchar(8000)我可以容纳多少个字符?

我关心的是检索行所需的时间。我是否正确假设如果我使用nvarchar(max),则检索行需要更长的时间。

1 个答案:

答案 0 :(得分:5)

简短版本 - 使用NVARCHAR(MAX),直到您确定存在明确的性能问题需要解决 - 尝试手动拆分大型博客条目以便保存它们"内联"几乎肯定会导致比将其留给SQL Server更糟糕的性能。


长版本 - SQL Server将数据存储在名为pages的8060字节大小的块中。通常,单个列的长度不能超过此大小,但是某些大值类型(例如TEXT)可以专门处理,并且它们的值替换为24字节指针指向存储在别处的实际数据(在ROW_OVERFLOW_DATA分配单位)

NVARCHAR(MAX)数据类型实际上提供了一种混合方法 - 在数据足够小的情况下,值通常会存储在数据页中,但是当数据太大时,它是无缝的为您转换为大值类型。这通常意味着你将获得两全其美。