3

我正在设计一个有很多记录的事务表。它将有很多读取和写入。

用户将在某一时刻上传一个 XML 文件,我将其存储在 XML 类型的数据库列中。

对于给定的事务记录,不需要像其他所有内容那样频繁地使用此 XML。它可能只会被读取几次,并且通常只会被插入而不被更新。

我想知道将此 XML 字段存储在单独的表中是否有任何优势。然后,我可以只在需要时加入它。我认为唯一的优势是“主”表上的各个记录将占用更少的空间。但是,如果我的表被正确索引,那真的很重要吗?

我怀疑我对此想得太多了,而且我的优化还为时过早。我应该把 XML 字段留在主表上吗?

我拥有的一个示例 XML 文件是 12KB。我不希望它变得比这大得多。我不确定 SQL Server 的 XML 数据类型是否会比这更有效地存储信息。

澄清一下,这是一对一的关系。每个事务都有一个 XML blob。多个事务不会有一个 XML blob。每个事务最终都应该得到一个 XML blob,即使它不是立即的。

谢谢,泰德兹

4

3 回答 3

3

答案是您无需修改​​或以其他方式损害您的逻辑数据设计以适应此物理存储考虑。

'large value types out of row'这是因为在 SQL Server 中,XML 是一种“大值类型”,您可以通过使用系统过程中的选项来控制这些是物理存储在行内还是行外sp_tableoption,如下所示:

EXEC sys.sp_tableoption N'MyTable', 'large value types out of row', 'ON'

如果将其设为 OFF,则小于 8000 字节的 XML 值将存储在行中。如果将其设置为 ON,则所有 XML 值(和 [N]Varchar(MAX) 列)都将存储在表外的单独区域中。(这都在这里详细解释:http ://technet.microsoft.com/en-us/library/ms189087(SQL.105).aspx )

将其设置为哪个问题很难说,但一般来说:如果您希望大量检索/修改此列,我建议您将其放入行内。否则将其存储在行外。

于 2013-01-02T20:30:40.607 回答
2

如果您的 XML 相当大,并且有很多用例在查询中不需要该信息 - 那么将其放入单独的表中可能是有意义的 - 即使存在 1:1 关系.

这里的动机是这样的:如果您的“基本”表较小,例如不包含 XML blob,并且您经常查询您的表而不需要检索 XML,那么这个较小的行大小可以带来更好的性能基表(因为更多的行适合一个页面,因此 SQL Server 需要加载更少的页面来满足您的某些查询)。

另外:如果 XML 仅在少数情况下存在(例如,只有 10-20% 的行实际上有 XML blob),那么这也可能是有利于将 XML blob“外包”到单独的表。

于 2013-01-02T18:13:52.720 回答
0

不,你不应该。如果存在一对一关系,则属于同一张表。连接很昂贵。

于 2013-01-02T17:58:14.380 回答