将多个索引一个接一个地应用于 table 还是使用多个单独的查询会更快

Is it faster to apply multiple indexes to a table one after the other or with multiple individual queries

这与多列索引(复合)与单列索引无关。这是关于性能而不是功能。

我有一个场景,我需要将多个索引应用到同一个 table。现在我让它检查它们是否存在,然后一个接一个地应用它们。

我的问题是,从开始到结束的总时间,应用它们需要几个小时以上。我想尽可能地减少总时间(减少应用它们的时间 window)

一个接着一个

index1 => index2 = index3 =>...indexN

全部同时应用于 table

index1 
index2 
index3 
...
indexN

一些table的索引数是10+,有多个table,这将应用于多个数据库(几百个)我没有任何控制权这里的数据存储或 SQL 服务器用于 SAN 魔术类型的东西。我有 16 个处理器和一个企业服务器,但所有数据库中所有 table 的总数是非常重要的。考虑在将近 3000 table 秒内所有这些的多 GB 行数 table 计数和多 TB 存储大小。这些都是聚集索引,大多数是复合索引

虽然似乎不存在实现此目的的简单方法,但如果通过针对相当大的 table 的测试发现,则应用 10 个具有单独查询和配置的新索引 同时处理(几乎同时开始,分别)确实比单个脚本快,后者以串行方式应用索引,速度快得多。如果 SQL 服务器有足够的资源来处理影响,这似乎也没有可以检测到的负面影响。

这里只是为了更新范围和比例而不是太具体:

  • 针对多个 table 进行了测试,规模从微不足道(360 万行)到更大
  • 针对具有 30 多个索引(200M-500M 行)的集合进行测试
  • 针对 tables 进行了 1.6B 到 1.9B 行的测试
  • 索引计数在 3-30+ 之间变化,具体取决于 table
  • tempdb 大小为 1TB
  • 从 0 行到近 2B 行的总范围在 2800+ tables
  • 服务器基本上加载到它可以处理的最大点并使用自动化保持在那里

实际结果示例与 9 到 14 小时的完成时间一致,减少到不到 43 分钟,同时在单个 table 和多个 table 索引上应用所有索引在一个数据库以及 200 多个独立的数据库中。多 TB 级别的数据大小。

我使用 Powershell 在不同的 table 上一次提交了数百个 运行 的索引添加,其中包括在多个 table 上的 30 多个。