在 1.06 亿行表上创建索引

Joh*_*hnG 2 index sql-server

我有一个在全球安装的应用程序,它使用从 SQL Server 2008 Express 到 SQL Server 2017 Enterprise 版的 SQL 版本。

我尝试了几种方法在一个大表上创建索引(3 列,包含 3 列),其中数据库通常处于简单恢复模式,但可以作为完整恢复模式......硬件可能因客户而异其他:

  1. 更改表创建索引...
  2. 使用新索引创建一个 tmp 表,并使用“插入”复制数据,然后复制原始表的删除表,并重命名 tmp 表以替换原始表。
  3. 使用新索引创建一个 tmp 表,并使用 PowerShell 脚本复制数据,然后是原始表的删除表,并重命名 tmp 表以替换原始表。

3 个中最快的是第一个选项(创建非聚集索引的传统方法),它花费了 1 小时 15 分钟来处理超过 1.06 亿条记录(该表有 200 列……不理想,但这是我正在使用的) ) 其他选项花费了三倍甚至更多的时间)

不幸的是,我无法使用在线功能,因为有多种 SQL Server 版本,并且在线仅适用于企业版。

在我的实验室中 1 小时 15 分钟太长了,我想尝试找到另一种方法来减少它,特别是在我们下一次应用程序更新中,我们将需要创建 23 个索引......而我没有' t 看到需要 5-6 小时的更新,客户也不想等待 5-6 小时来更新软件。

此外,更新过程中不需要对数据库进行任何活动。

我正在寻找的只是我可以尝试在合理的时间内创建索引的想法。没有代码!只需要理论的想法。

任何想法将不胜感激。

Eri*_*ing 7

我将此作为答案,尽管它主要是扩展评论®。

您没有提及索引定义或您尝试索引的列的类型。您说该表有 200 列,但除非您要创建聚集索引,否则这无关紧要。除非您尝试在 200 列上创建非聚集索引。如果是这样,请重新考虑。

鉴于您在许多不同的版本中执行此操作,它们很可能也都在不同的硬件上。在创建索引的情况下,硬件和现有索引将对完成所需的时间产生巨大影响。这不像您可以调整索引创建背后的查询。同样,企业版并行索引创建的能力也是一个重要因素。

除了硬件之外,系统并发也可以通过阻塞或整体资源使用来发挥作用。你没有提到这些是否是问题,所以对于任何试图回答的人来说,这又是一个盲点。

在较新版本的 SQL Server 中,您可以选择对tempdb 中的索引创建进行排序。只要 tempdb 不是跨不同环境的 Full Metal Potato©,这会有所帮助。

最后,您没有提到数据库的恢复模型。由于CREATE INDEX 可以最低限度地记录,如果可能的话,可能值得切换到SIMPLEBULK LOGGED恢复模式。这将取决于您的 RPO 和 RTO 目标,以及它们是否可以在创建索引的窗口中关闭。

对第 2 步的快速评论与上面的评论有点相关:如果您创建一个没有索引的表,然后加载数据并创建索引,它可能会更快。特别是SIMPLEor 中BULK LOGGED,您可以使用TABLOCK 提示潜在地获得最少的插入日志记录以及索引创建。

您的问题可能会因为太宽泛而被关闭,但我希望您发现此扩展评论® 对您有所帮助。