我所在的地方有一个运行在大型 AIX 大型机上的主系统。为了方便报告和操作,每晚都会从大型机转储到 SQL Server,这样我们的 50 多个客户端中的每一个都在具有相同架构的自己的数据库中。这个转储每晚大约需要 7 个小时才能完成,而且我们真的无能为力:我们被应用程序供应商提供的东西所困扰。
转储到 sql server 后,我们使用它来运行许多其他日常程序。其中一个过程是将数据导入一种管理报告沙箱表,该表将来自不同数据库的一个特别重要的表中的记录组合到一个表中,不了解 sql 的管理人员可以使用该表来运行临时报告无需冲洗系统的其余部分。这又是一个商业问题:经理们想要它,他们有权看到我们实施它。
此表的导入过程本身需要几个小时。它将分布在 50 个数据库中的大约 4000 万条记录过滤成大约 400 万条记录,然后在某些列上对它们进行索引以进行搜索。即使在几个小时内,它仍然不到初始负载的三分之一,但是我们已经没有时间进行夜间处理了,我们无法控制大型机转储,我们可以控制它。所以我的任务是寻找改进现有程序的方法。
目前,理念是从每个客户端数据库加载所有数据,然后一步索引它会更快。此外,为了避免在运行时间过长时使其他重要系统陷入困境,一些较大的客户端被设置为始终首先运行(表上的主索引由 clientid 字段组成)。我们开始做的另一件事是一次从几个客户端并行加载数据,而不是顺序加载每个客户端。
所以我的问题是,加载此表的最有效方法是什么?我们是否认为稍后索引更好?还是我们应该在导入数据之前创建索引?我们是否应该按索引顺序加载表,以避免大量重新排序页面,而不是首先加载大客户?并行加载是否会因为一次导致大量磁盘访问或消除我们控制顺序的能力而使事情变得更糟?还有其他想法吗?
更新
嗯,有事。白天我可以做一些基准测试,无论是在操作开始时创建索引还是在操作结束时创建索引,加载时间都没有区别,但是我们节省了构建索引本身的时间(它的课程几乎立即构建,表中没有数据)。