我正在寻找关于如标题中那样构造数据表的建议,以使其有效地进行查询和编写。我存储有关具有通常数据类型,数字,短字符串等的实体的信息。现在我需要存储包含大量数据的额外字段(~30 KB),我正在查看两个选项:
nvarchar(100000)
列
其他因素:
现在我倾向于有一个单独的表,但它也有一个不好的方面,我必须记住一些关于保持数据一致的担忧。
如果没有真正的基准测试就很难做出决定,但这可能需要几天的工作时间,所以我转向SO来寻找捷径。
答案 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访问的东西。