是否可以在SQL Server中进行列分区

时间:2012-06-07 12:23:37

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

表的每条记录的大小是性能参数。这意味着如果记录的大小很小,SQL Server会在每次从物理硬盘中读取更多记录。

在我们的大多数查询中,我们不使用表的所有列,并且可能仅在特定查询中使用某些列。我们是否可以对每个表的列进行分区以获得更好的性能。

我使用的是SQL Server 2008 R2。

谢谢。

3 个答案:

答案 0 :(得分:3)

真正的列级别分区带有面向列的存储,请参阅Inside the SQL Server 2012 Columnstore Indexes,但这仅在SQL Server 2012中可用,并且针对特定的BI工作负载,而不是一般的SQL Server应用程序。

在面向行的存储中,垂直分区实际上是设计适当覆盖索引的另一个名称。如果引擎有另一个窄索引,它将尽可能使用它而不是基表。

最后一种选择,手动夹板并在查询中连接垂直'分片'(或定义连接视图,同样的事情)通常是不明智的,很少有回报。

答案 1 :(得分:1)

目前在SQL Server 2008中,您无法水平分区表。如果您有大量列,则需要将其切割为共享公共密钥的水平块表,然后使用可更新的视图对其进行蒙皮,以给出一个非常宽的表的错觉。

如果只有几个大列(例如VARCHAR(1000)),您可以将数据规范化为唯一值表。

答案 2 :(得分:0)

no column partitioning rule的一个例外是声明为max(varchar(max)的字符列)。

这些存储在单独的数据页面上。我相信除非在查询中引用了列,否则不会读入此页面。如果我错了,我肯定会有更多知识让人纠正我。