问题很老,我想没有 100% 正确的答案。但想听听更有经验的建议。
使用 SQL Server 2008 R2。
我有将存储数百万行的表。大多数列是 varbinary(max) 列数据的描述(日期、状态、标题、..)。还有 2 列 XML 数据类型。这些 XML 很小,会经常被查询。所以:
MyTable
(
SomeID varchar(20)-- queried most often
Date DateTime -- queried most often
Status VarChar(10) -- queried most often
Title VarChar(50) -- queried most often
-- some more columns here
SomeSmallXML xml -- queried quite often
SomeOtherSmallXML xml -- queried quite often
MyData varbinary(max) -- queried rarely
MyOtherData varbinary(max) -- queried rarely
)
如果我将所有大值类型移动到其他表:
其他表。因为他们经常被查询,它似乎并不
合理的。 (我期待碎片,因为 SomeID 列即将到来
从客户端应用程序。将其他代理键设为不合理
聚集索引,所以 SomeID 将是聚集索引的键。)
表分区(慢速文件组中的旧数据)+索引相同
关于快速存储。
在这种情况下,看不出将大值数据类型移动到其他表的充分理由。
我确实看到了设置“sp_tableoption N'MyTable'、'行外大值类型'、'ON'”的理由。
你的建议是什么?我还需要考虑什么?
最佳答案
我根据与其他同事的讨论做出了决定:将 LOB 数据(还有 SomeID 和 Date 列)的一些分离到其他表中的分离数据中。
最重要:我错过了考虑更新率 列数以及经常查询数据的时间长度 当他们老到不再有趣时 在绝大多数(但不是全部)情况下。
这就是在这种情况下有所不同的原因。
于是想出了:
MyTable
(
SomeID varchar(20)-- queried most often / Updated never
Date DateTime -- queried most often / Updated never
Status VarChar(10) -- queried most often / Updated few times after insert
Title VarChar(50) -- queried most often / Updated never
-- some more columns here
SomeSmallXML xml -- queried quite often / Updated few times after insert
SomeOtherSmallXML xml -- queried quite often / Updated never
MyData varbinary(max) -- queried rarely / Updated never
MyOtherData varbinary(max) -- queried rarely / Updated 1 shortly after insert
)
因此,正如所见,一些 LOB 数据 - MyData 和 MyOtherData varbinary(max) 在短时间内变得静态。它们足够大,所以我想将它们存储在便宜的磁盘上,并在某个时间点放在只读分区上。日期越近,我就越需要“MyData”或“MyOtherData”。
所以最终的设计大概是这样的:
MyTable
(
SomeID varchar(20)
Date DateTime
Status VarChar(10)
Title VarChar(50)
-- some more columns here
SomeSmallXML xml
SomeOtherSmallXML xml
)
MyTableLOB
(
SomeID varchar(20)
Date DateTime -- used for partitioning
MyData varbinary(max)
MyOtherData varbinary(max)
)
关于sql-server - 我是否必须将大值数据类型存储在单独的表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9768004/