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

标签 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'、'行外大值类型'、'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/

    相关文章:

    c# - EF 6.0 多对多插入这么多编码......为什么?

    sql-server - 如何在 SQL Server 2008 上调试 EXCEPTION_ACCESS_VIOLATION

    sql - 在 SQL Server 2008 中从一行设置多个标量变量?

    sql - MDF 文件大小比实际数据大得多

    sql - 根据 T-Sql 中的日期范围求列总和

    c# - 我可以使用什么构造来代替 Contains?

    c# - 在 C# 和 SQL Server 2008 R2 中使用 MD5

    c# - 不在 linq to sql 之间

    sql-server - Microsoft SQL Server 2008 中 JOIN 与 APPLY 的相对效率

    sql-server - 恢复备份访问被拒绝