我应该将XML Blob放入单独的表中吗?

时间:2013-01-02 17:47:22

标签: sql sql-server-2008 database-design

我正在设计一个具有大量记录的事务表。它会有很多读写。

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

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

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

我怀疑我正在过度思考这个问题,而且我的优化还为时过早。我应该将XML字段留在主表上吗?

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

澄清一下,这是一对一的关系。每个事务都会有一个XML blob。多个事务不会有一个XML blob。并且每个事务都最终获取XML blob,即使它不是立即的。

谢谢, Tedderz

3 个答案:

答案 0 :(得分:3)

答案是,您无需修改​​或以其他方式危害逻辑数据设计以适应此物理存储注意事项。

这是因为在SQL Server中,XML是“大值类型”,您可以通过使用'large value types out of row'选项来控制这些是物理存储在行内还是行外。 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

设置它的问题很难说,但一般来说:如果你希望重新检索/修改这个专栏,我建议你插入行。否则将它存放在行外。

答案 1 :(得分:2)

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

这里的动机是这样的:如果你的“基数”表更小,例如不包含XML blob,并且您经常在没有需要检索XML的情况下查询表,然后这个较小的行大小可以在基表上获得更好的性能(因为更多的行适合于页面,因此SQL Server需要加载更少的页面来满足您的一些查询。)

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

答案 2 :(得分:0)

不,你不应该。如果存在一对一关系,则它属于同一个表。加入很贵。