表中每条记录的大小是一个性能参数。这意味着如果记录的大小很小,SQL Server 会在每次读取物理硬盘时获取更多记录。
在我们的大多数查询中,我们不会使用表的所有列,并且可能某些列仅在特定查询中使用。我们是否可以对每个表的列进行分区以获得更好的性能。
我使用 SQL Server 2008 R2。
谢谢你。
表中每条记录的大小是一个性能参数。这意味着如果记录的大小很小,SQL Server 会在每次读取物理硬盘时获取更多记录。
在我们的大多数查询中,我们不会使用表的所有列,并且可能某些列仅在特定查询中使用。我们是否可以对每个表的列进行分区以获得更好的性能。
我使用 SQL Server 2008 R2。
谢谢你。
真正的列级分区带有面向列的存储,请参阅SQL Server 2012 列存储索引内部,但这仅在 SQL Server 2012 中可用,用于解决特定的 BI 工作负载,而不是一般的 SQL Server 应用程序。
在面向行的存储中,垂直分区实际上是设计适当覆盖索引的另一个名称。如果引擎有一个替代的窄索引,它将尽可能使用它而不是基表。
最后一种选择,手动分割表并在查询中加入垂直“碎片”(或定义加入视图,同样的事情)通常是不明智的,而且很少有回报。
目前,使用 SQL Server 2008,您无法对表进行水平分区。如果您有大量列,则需要将其切分成共享公共键的水平块表,然后用可更新的视图对它们进行蒙皮,以产生一张非常宽的表的错觉。
如果只有几个大列(例如VARCHAR(1000)
),您可以将数据规范化为唯一值表。
无列分区规则的一个例外是声明为 max 的字符列(例如,varchar(max))。
这些存储在单独的数据页上。我相信除非在查询中引用了该列,否则不会读入此页面。如果我错了,我相信更多知识的人会纠正我。