聚集列存储索引表通常对大型表很有用。理想情况下有数百万行。对查询也很有用,它只选择此类表中可用列的子集。
如果我们打破这两个“规则”/最佳实践会发生什么?
- 就像拥有一个聚集列存储索引表,它最多只能存储几千或几十万行。
- 并针对需要所有列的那些聚集列存储表运行查询。
与行存储聚集索引表相比,我的测试没有显示任何性能下降。这对我们来说很棒。
是否存在违反这两条规则的“长期”影响?还是任何尚未出现的隐藏陷阱?
上下文为什么需要它:我设计了一个数据库模型,它将用于不同供应商数据库的许多实例。每个数据库中的模式都保持不变,但不同的供应商有不同的数据量。因此,很少有小型供应商最终可能会在其表中包含少量数据(<1 000 000)。我不能让自己为行存储和列存储模型保留两个不同的数据库。
列存储索引在压缩数据大小方面有很大的优势。Columnstore 索引的总体目标是由于其压缩而快速读取一堆数据。
CCI是Columnstore聚集索引,Clusted是聚集索引
列存储索引将数据大小从 4MB 压缩到 2MB。
我们可以分两表三部分来看表现。
第一个是最小
SELECT
操作:结果:这里有一个
Columnstore Scan
错误的估计。此外,逻辑读取差异。你可以说这对你没有关系,但是,如果你使用最小的 SELECT 查询,可能会使用数千次。它会影响整体性能。第二个是最小
UPDATE
操作:结果:如我们所见,存在读取、CPU 和时间差异。
第三个是
REBUILD
操作:如果我为索引碎片重建和更新所有行,我将看到比聚集索引更碎片化的聚集列存储索引。而且我没有显示,但是
Clustered Columnstore Index
重建过程产生的事务日志超过Clustered Index
.就像文件说的
如果你有一个小表,你不需要列存储索引。
@YunusUYANIK 指出设计模式仅满足一方面的潜在缺陷,为什么不在表上创建适合这两种情况的行存储和列存储索引呢?当然,您最终可能会以两种方式索引相同的字段,但主要缺点只是增加了存储空间的使用,这在规划性能时通常不太关心。
这将取决于您的架构和每个供应商的表中的数据量,因此您必须进行测试以确保您的索引设计用于基于供应商谓词的不同数据量的适当查询. 在最坏的情况下,您有时也可能不得不使用索引提示,但我觉得如果您正确设计这两种类型的索引,那不太可能。