将多个索引一个接一个地应用到一个表还是使用多个单独的查询来更快?

时间:2019-05-23 17:35:43

标签: sql performance sql-server-2008 indexing

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

我有一种情况,我需要将多个索引应用于同一张表。现在,我要检查它们是否存在,然后一个接一个地应用它们。

我的问题是,从头到尾的总时间要花全部几个小时才能全部应用。我想尽可能减少总时间(减少应用它们的时间窗口)

一个接一个地

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

所有元素同时应用于表

index1 
index2 
index3 
...
indexN

某些表上的索引计数为10+,有多个表,这将应用于多个数据库(几百个)我对数据存储或SQL Server的SAN魔术类型没有任何控制权东西。我有16个处理器和一个Enterprise服务器,但是所有数据库中所有表的总数都是不小的。考虑多个GB行表计数和多个TB存储大小(将近3000个表中的所有行)。这些都是聚集索引,大多数都是复合索引

1 个答案:

答案 0 :(得分:0)

虽然似乎没有一种简单的方法可以完成此任务,但是如果通过对一个相当大的表进行测试发现,该表应用了10个具有单独查询和配置的新索引,并同时同时处理(所有操作均始于确实比单个脚本快,在单个脚本中,索引是以串行方式应用的。如果SQL Server有足够的资源来处理这种影响,那么这似乎也不会产生负面影响。

只需在这里更新范围和规模而不必太具体:

  • 针对多个表进行了测试,这些表的规模从琐碎(360万行)到更大
  • 针对具有30多个索引(200M-500M行)的集合进行了测试
  • 针对具有1.6B至1.9B行的表进行了测试
  • 根据表的不同,索引计数从3-30 +不等
  • tempdb的大小为1TB
  • 2800多个表中的范围从0行到近2B行
  • 服务器基本上已加载到可以处理的最高点,并使用自动化将其保存在此处

实际结果示例与将9到14小时的完成时间减少到少于43分钟一致,所有索引同时应用于一个表,并且在一个数据库以及200多个单独的数据库中对多个表建立索引。数TB的数据大小。