我是否必须在单独的表中存储大值数据类型?

时间:2012-03-19 09:48:51

标签: sql-server sql-server-2008 sql-server-2008-r2

问题很老,我猜没有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”,“大值类型超出行”,“开启”。

你有什么建议?我还需要考虑什么?

1 个答案:

答案 0 :(得分: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数据 - MyData和MyOtherData varbinary(max)在短时间后变为静态。它们足够大,所以我想将它们存储在cheep磁盘上,并在某些时候放在只读分区上。最近的日期是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)
    )