阅读 SQL Server 2014 中的聚集列存储索引,我想知道是否拥有一个包含大量列的表仍然是一种反模式。目前,为了缓解单个表包含大量列的问题,我正在使用垂直分区,但有可用的聚集列存储索引,这不应该是必需的。这是正确的还是我错过了什么?
示例: 让我们以性能计数器的日志为例,原始数据可能具有以下结构:
╔══════════════════╦═══════╦═══════╦═════╦═════╦══ ═══╦══════════╗ ║ 时间 ║ Perf1 ║ Perf2 ║ ... ║ ... ║ ... ║ Perf1000 ║ ╠══════════════════╬═══════╬═══════╬═════╬═════╬══ ═══╬══════════╣ ║ 2013-11-05 00:01 ║ 1 ║ 5 ║ ║ ║ ║ 9 ║ ║ 2013-11-05 00:01 ║ 2 ║ 9 ║ ║ ║ ║ 9 ║ ║ 2013-11-05 00:01 ║ 3 ║ 2 ║ ║ ║ ║ 9 ║ ║ 2013-11-05 00:01 ║ 4 ║ 3 ║ ║ ║ ║ 9 ║ ╚══════════════════╩═══════╩═══════╩═════╩═════╩══ ═══╩══════════╝
拥有这样一个具有 1000 列的表是邪恶的,因为一行很可能跨越一页以上,因为通常不太可能对所有措施感兴趣,但查询总是会产生 IO 成本等。 .. 解决这种垂直分区通常会有所帮助,例如,可以按类别(CPU、RAM 等)在不同表中对性能计数器进行分区。
相反,将这样的表作为聚集列存储索引不应该是这样的问题,因为数据将按列存储,并且每个查询所涉及的 IO 将仅涉及请求的列,无论在桌子。