我有一个在全球安装的应用程序,它使用从 SQL Server 2008 Express 到 SQL Server 2017 Enterprise 版的 SQL 版本。
我尝试了几种方法在一个大表上创建索引(3 列,包含 3 列),其中数据库通常处于简单恢复模式,但可以作为完整恢复模式......硬件可能因客户而异其他:
3 个中最快的是第一个选项(创建非聚集索引的传统方法),它花费了 1 小时 15 分钟来处理超过 1.06 亿条记录(该表有 200 列……不理想,但这是我正在使用的) ) 其他选项花费了三倍甚至更多的时间)
不幸的是,我无法使用在线功能,因为有多种 SQL Server 版本,并且在线仅适用于企业版。
在我的实验室中 1 小时 15 分钟太长了,我想尝试找到另一种方法来减少它,特别是在我们下一次应用程序更新中,我们将需要创建 23 个索引......而我没有' t 看到需要 5-6 小时的更新,客户也不想等待 5-6 小时来更新软件。
此外,更新过程中不需要对数据库进行任何活动。
我正在寻找的只是我可以尝试在合理的时间内创建索引的想法。没有代码!只需要理论的想法。
任何想法将不胜感激。
我将此作为答案,尽管它主要是扩展评论®。
您没有提及索引定义或您尝试索引的列的类型。您说该表有 200 列,但除非您要创建聚集索引,否则这无关紧要。除非您尝试在 200 列上创建非聚集索引。如果是这样,请重新考虑。
鉴于您在许多不同的版本中执行此操作,它们很可能也都在不同的硬件上。在创建索引的情况下,硬件和现有索引将对完成所需的时间产生巨大影响。这不像您可以调整索引创建背后的查询。同样,企业版并行索引创建的能力也是一个重要因素。
除了硬件之外,系统并发也可以通过阻塞或整体资源使用来发挥作用。你没有提到这些是否是问题,所以对于任何试图回答的人来说,这又是一个盲点。
在较新版本的 SQL Server 中,您可以选择对tempdb 中的索引创建进行排序。只要 tempdb 不是跨不同环境的 Full Metal Potato©,这会有所帮助。
最后,您没有提到数据库的恢复模型。由于CREATE INDEX 可以最低限度地记录,如果可能的话,可能值得切换到SIMPLE或BULK LOGGED恢复模式。这将取决于您的 RPO 和 RTO 目标,以及它们是否可以在创建索引的窗口中关闭。
对第 2 步的快速评论与上面的评论有点相关:如果您创建一个没有索引的表,然后加载数据并创建索引,它可能会更快。特别是在SIMPLEor 中BULK LOGGED,您可以使用TABLOCK 提示潜在地获得最少的插入日志记录以及索引创建。
您的问题可能会因为太宽泛而被关闭,但我希望您发现此扩展评论® 对您有所帮助。
| 归档时间: |
|
| 查看次数: |
4640 次 |
| 最近记录: |