2014-06-13 24 views
1

我正在寻找关于如何在标题中构造数据表的建议,以使其在查询和写入时更加高效。我存储有关通常数据类型,数字,短字符串等实体的信息。现在我需要存储具有大量数据(〜30 KB)的额外字段,我正在寻找两种选择:用大型文本字段构造数据库表

  1. 添加一列的nvarchar(100000)在实体表
  2. 创建单独的表来存储这种数据和链路从实体表

其他因素:

  • 每个实体行将具有伴随的大文本字段
  • 每个伴随文本字段将具有至少20 KB的数据
  • 〜20%的针对实体表的查询也需要大字段。其他查询可以不用它的查询
  • 〜95%寻求单一实体
  • 我使用的是O/RM访问数据,所以所有列在(我可以挑选并通过使选择拉代码看起来很可怕)

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

如果不做一个真正的基准测试就很难做出决定,但这可能需要几天的工作时间,所以我转而选择SO作为捷径。

+0

我会在这个问题上给其他人留下建议,但是在提供结果方面需要查询大型文本字段中的数据吗?也许这会帮助人们提供更好的设计。 –

+0

我想建议阅读全文搜索和ntext字段。 – sdrzymala

+0

取决于您处理独立表的行数,可能是从存储角度看的一种解决方案:您可以将“附带数据”表放在单独的设备上,这可能是一个优势。 – Paolo

回答

1

我们最近有这个确切的问题。 (虽然它是一个XML列而不是NVarchar(max)),但问题完全相同。

我们的用例是显示表 的网页(前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)足够短,它会被存储“在行”,但如果它超出了页面大小,那么它就会被存储在其他地方,并取决于)的大小表和记录设置您的查询,以及b)您的nvarchar(max)中的数据量可以具有相当戏剧性的性能。下降。

有这个环节的读: http://msdn.microsoft.com/en-us/library/ms189087.aspx

当大型值类型或大型对象数据类型列值存储在数据行中 ,数据库引擎不必访问 单独的一页或一组页面读取或写入字符或二进制字符串 。这使得读取和写入行内字符串的速度与读写限制大小的varchar,nvarchar或varbinary字符串一样快。同样,如果将值存储在行外,则数据库引擎会引发额外的页面读取或写入操作。

我硬着头皮现在,和设计表的大nvarchar(max)存储在一个单独的表中,假设你不需要它包含在每一个select查询

至于数据,您有关使用ORM的评论。我们也在使用NHibernate。将映射配置为按需延迟加载相关对象相对比较容易。

+1

谢谢!这鼓励我创建单独的表格。我必须存储大型XML,但我也有另一个JSON字段,所以我试图让我的问题更一般,而不是询问'xml' SQL类型。再次感谢。 –

+0

没问题。在过去的2天里,把这个重构的代码直接写在了Proudction中。 :-) –

1

嗯,你可以用文件开始...

在鉴于现场的8000个字节的文件最大尺寸实体表

添加一列一个nvarchar(100000)和因此nvarchar(4000)是最大的,我有兴趣知道你如何考虑这个选项?

nvarchar(max) - ntext等将是正确的做法。

然后,你应该阅读全文搜索,这是在SQL服务很长一段时间。您的ORM可能不支持它 - 当人们抽象时遇到问题时,限制功能的技术选择是典型的。不是我用ORM访问的东西。

+0

感谢您指出我的大小限制。我浏览了一下文档,但只看到了我想看到的内容(“最大存储大小为2^31-1字节”,但现在你指向我了,我看到这是'nvarchar(max)')。正如你所看到的,我意识到ORM的限制,并且已经准备好解决它们。我不打算为每个查询提供兆字节的数据。 –

+0

然后答案取决于。一个单独的表对于像这样的东西是有意义的,因为在理论上,你也可以将这个隔离到另一个文件组中。 – TomTom

+0

谢谢。我想唯一的缺点是在查询时不便于分开表格,但我不得不稍微懒散。 –