【问题标题】:Do i have to store large value data types in separate table?我必须将大值数据类型存储在单独的表中吗?
【发布时间】:2012-03-19 09:48:51
【问题描述】:

问题很老,我想没有 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'、'large value types out of row'、'ON'”的理由。

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

【问题讨论】:

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


【解决方案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) 在短时间内变为静态。它们足够大,所以我想将它们存储在廉价磁盘上并在某个时间点放在只读分区上。日期越近,我就越需要“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)
    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-18
    • 2019-06-12
    • 1970-01-01
    • 2012-07-05
    • 2016-09-05
    • 2015-09-12
    • 2014-06-28
    • 1970-01-01
    相关资源
    最近更新 更多