我们的其中一个自定义日志表大小为 3TB。我们需要创建一个新索引。磁盘本身的读取速度为 10mbyte/sec。
这是否意味着索引创建过程将是 3.000.000/10 = 86 小时?索引被写入快速磁盘上的另一个文件组,因此写入时间不是一个因素。
我们的其中一个自定义日志表大小为 3TB。我们需要创建一个新索引。磁盘本身的读取速度为 10mbyte/sec。
这是否意味着索引创建过程将是 3.000.000/10 = 86 小时?索引被写入快速磁盘上的另一个文件组,因此写入时间不是一个因素。
比这更复杂。当您创建索引(B-Tree)时,不仅需要读取索引所针对的所有数据,而且其中一些数据在转换为 B-Tree 时会被多次读取。这是因为 SQL Server 专门使用平衡B 树。我不确定是否有任何关于 Microsoft 的确切算法的文档,但本文讨论了一种将无序数据集转换为平衡B-Tree 的实用方法,这是一个两步过程。
此外,如果在创建过程中发生任何重新排序,也会增加创建索引的时间。可能发生这种情况的一个示例是,如果您在 SQL Server 中执行联机索引构建操作,并且在操作期间将新行添加到表中。
正如其他人所指出的,10MB/s 的硬盘速度非常慢。作为参考,目前AWS 上最慢的 EBS 存储平均约为 65 MB/s(上一代 - 在 40–90 MiB/s 之间),我认为自 90 年代以来普通硬盘驱动器不会像 10 MB/s 一样慢(虽然我找不到任何来源)。
根据索引的目的,如果您不需要索引所有行,过滤索引可能对您有用。它理论上应该创建得更快,因为它只根据定义中应用的过滤器索引数据的子集。这在您主要只查询数据子集的情况下很有用,例如自 2015 年以来的所有内容或您想在过滤器中定义的任何静态标准。它还节省了空间,因为索引的数据更少。但也请注意限制,Brent Ozar 在What You Can (and Can't) Do With Filtered Indexes中讨论了这些限制。