2012-03-19 27 views
4

问题是旧的,我想没有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 
    ) 

如果我把所有大值类型的其他表:

  • 能做的聚集索引的在线编制索引。 然后我不得不移动xml类型到 其他表。因为他们经常被质疑,其似乎并不合理。 (我期望分片,因为SomeID列将从客户端应用程序 。它不合理使其他代理键为 聚簇索引,因此SomeID将成为聚簇索引的关键)。
  • 可以将大数据移动到较慢的存储。 猜测可以实现 相同的表分区(慢文件组中的旧数据)+快速存储上的索引 。

在这种情况下,看不到很好的理由将大值数据类型移动到其他表。 我确实看到了设置“sp_tableoption N'MyTable','超出行数的大值类型','ON'”的理由。

您的建议是什么?我还有什么需要考虑的?

+1

随着SQL Server 2012中,你可以做[在线重建即使它的LOB(http://rusanu.com/2011/08/05/online -index-operations-for-indexes-containing-lob-columns /) – 2012-03-19 14:38:07

+0

是的,但我们使用的是2008 R2。 [PS在你的博客中看到了:)] – 2012-03-19 14:42:54

回答

1

我根据与其他同事的讨论做出决定:在其他表中将分离数据中的某些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数据 - 迈德特和MyOtherData VARBINARY(最大值)获取短的时间后静态的。它们足够大,所以我想将它们存储在磁盘上,并在某个时间点放在只读分区上。最近更多的是Date,因为我经常需要“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) 
    ) 
相关问题