使用大文本字段构建数据库表

时间:2014-06-13 08:21:41

标签: sql-server

我正在寻找关于如标题中那样构造数据表的建议,以使其有效地进行查询和编写。我存储有关具有通常数据类型,数字,短字符串等的实体的信息。现在我需要存储包含大量数据的额外字段(~30 KB),我正在查看两个选项:

  1. 在实体表
  2. 中添加nvarchar(100000)
  3. 创建单独的表来存储此类数据和实体表链接
  4. 其他因素:

    • 每个实体行都有一个附带的大文本字段
    • 每个附带的文本字段至少有20 KB的数据
    • ~20%对实体表的查询也需要大字段。其他查询可以不用它
    • ~95%的查询寻求单个实体
    • 我正在使用O / RM访问数据,因此所有列都被拉入(我可以通过使代码看起来很糟糕来挑选)

    现在我倾向于有一个单独的表,但它也有一个不好的方面,我必须记住一些关于保持数据一致的担忧。

    如果没有真正的基准测试就很难做出决定,但这可能需要几天的工作时间,所以我转向SO来寻找捷径。

2 个答案:

答案 0 :(得分:3)

我们最近遇到了这个问题。 (虽然它是一个XML列而不是NVarchar(最大值)),但问题完全相同。

我们的用例是在表格的网页(前6列)上显示记录列表 然后在nvarchar(max)列中存储一系列附加信息,这些信息在您选择的单个行后显示。

最初一个表包含所有7列。

TABLE 1
    INT ID (PK IDentity)
    5 other columns
    NVARCHAR(max)

一旦我们将其重构为以下内容,我们就获得了大量的性能。升压。

TABLE 1
    INT ID (PK IDentity)
    5 other columns
    INT FID  (FK -TABLE2)

TABLE 2
    FID (PK IDENTITY)
    nvarchar(max)

原因是如果nvarchar(max)足够短,它将被“存储在行内”,但如果它超出页面大小,那么它将被存储在其他地方,并取决于a)的大小表格和记录设置了您的查询,以及b)nvarchar(max)中的数据量可能会产生相当大的影响。下降。

阅读此链接: http://msdn.microsoft.com/en-us/library/ms189087.aspx

  

当大值类型或大对象数据类型列值为时   存储在数据行中的数据库引擎不必访问   单独的页面或一组页面来读取或写入字符或二进制文件   串。这使得读取和写入行内字符串为   快速读取或写入有限大小varchar,nvarchar或   varbinary字符串。同样,当值存储在行外时,   数据库引擎会产生额外的页面读取或写入。

我现在咬了一下子弹,并设计你的表以将大nvarchar(max)存储在一个单独的表中,假设你不需要它在每个select查询中包含的数据

关于您对使用ORM的评论。我们也在我们的情况下使用NHibernate。将映射配置为根据需要延迟加载相关对象相对容易。

答案 1 :(得分:1)

嗯,你可以从文档开始......

  

在实体表

中添加一个nvarchar(100000)列

鉴于字段的最大大小为8000字节,因此nvarchar(4000)是最大值,我很想知道您如何看待这个选项?

nvarchar(max) - ntext等将是正确的事情。

然后你应该阅读全文搜索,这在SQL服务中已经很久了。你的ORM可能不支持它 - 技术选择限制功能是典型的人 - 有抽象的问题。不是我用ORM访问的东西。