我正在设计一个具有大量记录的事务表。它会有很多读写。
用户上传XML文件会有一个点,我将其存储在XML类型的数据库列中。
对于给定的事务记录,不需要像其他所有内容那样经常使用此XML。它可能只会被读取几次,通常只是插入而不是更新。
我想知道将此XML字段存储在单独的表中是否有任何优势。然后,我只能在需要时加入它。我认为唯一的优势是“主”表上的单个记录占用的空间更少。但是,如果我的表格被正确编入索引,这真的有效吗?
我怀疑我正在过度思考这个问题,而且我的优化还为时过早。我应该将XML字段留在主表上吗?
我有一个示例XML文件是12KB。我不认为它会比这更大。我不确定SQL Server的XML数据类型是否会比这更有效地存储信息。
澄清一下,这是一对一的关系。每个事务都会有一个XML blob。多个事务不会有一个XML blob。并且每个事务都最终获取XML blob,即使它不是立即的。
谢谢, Tedderz
答案 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)