Microsoft 建议不要费心重建少于 1,000 页的索引(从内存我认为这是因为它们太小以至于它们将保存在 RAM 中)。
如果我不重建它们,那么它们将变得支离破碎。在那种情况下,拥有它们还有什么意义吗?我在想象一本电话簿,其中每一个条目都在错误的位置——这将毫无用处!
为了澄清,我主要谈论非聚集索引,但我很想知道聚集索引的答案是否不同。
这个问题的答案表明索引可以帮助避免行锁背后的阻塞问题,如果它是正确的并且适用于 SQL Server,这将是索引可能仍然有用的原因。
Microsoft 建议不要费心重建少于 1,000 页的索引(从内存我认为这是因为它们太小以至于它们将保存在 RAM 中)。
如果我不重建它们,那么它们将变得支离破碎。在那种情况下,拥有它们还有什么意义吗?我在想象一本电话簿,其中每一个条目都在错误的位置——这将毫无用处!
为了澄清,我主要谈论非聚集索引,但我很想知道聚集索引的答案是否不同。
这个问题的答案表明索引可以帮助避免行锁背后的阻塞问题,如果它是正确的并且适用于 SQL Server,这将是索引可能仍然有用的原因。
仅仅因为索引不需要重建并不意味着它是无用的。一个 99999% 的碎片索引在查找键时仍然比堆好 9999 倍。在流行的 DBA 文化中,碎片化的负面影响被严重、严重、严重、严重地高估了。
锁定是一个有效点(没有索引,所有读写操作都保证会发生冲突),但不是唯一的。即使数据是只读的,所以锁定从来都不是问题,它仍然需要一个索引来进行查找和范围扫描操作。
这是对什么是碎片化及其影响的非常误导的解释。支离破碎的电话簿中的所有条目仍然井然有序。查找条目仍然需要翻 2-3 页,它会是这样的:
所以是的,你来回翻转 2-3 次。零散的电话簿也可能每一页都是半空白的,因此它的重量是新制作的电话簿的两倍。
将其与堆进行比较:
唯一真正不需要索引的数据/工作负载是列存储/数据仓库。列存储访问和处理是完全不同的,并且可以在没有索引的情况下摆脱困境,因为每个查询都应该扫描所有数据。段消除、每列 IO 和其他因素有助于保持这些始终端到端的扫描具有竞争力。