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

最佳答案

我已经在sql server中加载了大量数据集,并在插入和添加索引时对其进行了一些性能测试。我发现到目前为止,在加载所有数据之后创建索引的效率要高得多。在我们的例子中,加载在末尾添加的索引需要1个小时,添加索引时仍然打开需要4个小时。
我认为关键是尽快移动数据,我不确定是否按顺序加载数据真的有帮助,你有关于加载时间和索引时间的统计数据吗?如果你这样做了,你可以开始在这方面做一些实验。

关于sql-server - 导入新数据库表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/225993/

10-15 20:55
查看更多