2008-10-22 36 views
1

我在那里有一个运行在AIX大型机上的主系统。为了便于报告和操作,每晚从大型机转储到SQL Server中,以便我们的每个50个ish客户端都拥有相同的架构,并拥有自己的数据库。这个转储大约需要7个小时才能完成,而且我们没有任何可以做的事情:我们被应用程序供应商提供的东西卡住了。导入新的数据库表

转储到SQL Server后,我们使用它来运行其他日常程序。其中一个过程就是将数据导入到一种管理报告沙箱表中,该表将来自不同数据库的特别重要的表中的记录合并到一张表中,那些不知道sql的管理员可以使用它来运行临时报告而不用软管系统的其余部分。这又是一件商业事情:管理者想要它,他们有能力看到我们实施它。

此表的导入过程需要几个小时。它将跨越50个数据库的大约4000万条记录过滤到大约400万条记录中,然后将它们索引在某些列上进行搜索。即使在coupld小时,它仍然不到初始负载的三分之一,但是我们没有时间进行过夜处理,我们不控制大型机转储,我们确实控制了这一点。所以我一直负责寻找改善现有程序的方法。

目前,其理念是从每个客户端数据库加载所有数据,然后一步完成索引。另外,为了避免其他重要系统在长时间运行时陷入困境,一些较大的客户端被设置为始终运行(表中的主索引由一个clientid字段组成)。我们正在开始做的另一件事是同时加载来自少数客户端的数据,而不是每个客户端的数据。

所以我的问题是,什么是最有效的方式来加载此表?我们是否认为后来的索引更好?或者我们应该在导入数据之前创建索引?我们是否应该按索引顺序加载表格,以避免大量重新排序页面,而不是首先大客户?并行加载可以通过一次造成多次磁盘访问或取消我们控制订单的能力,让事情变得更糟?任何其他想法?

更新
好吧,有些事情已经结束。我可以在白天做一些基准测试,在加载时间里,索引是在操作的开始还是结束时创建的,但是我们节省了构建索引本身的时间(它的课程几乎立即建立,表中没有数据)。

回答

0

据我所知,你是正确的 - 最好一次添加记录,然后在最后索引一次。

1

我已经在SQL Server中大量加载数据集,并且在插入和添加之后对索引进行了一些性能测试。我发现BY FAR在加载所有数据后创建索引效率更高。在我们的例子中,最后加载索引需要1小时,而索引仍然是4小时。

我认为关键是要尽可能快地移动数据,我不确定是否按顺序加载数据确实有帮助,您是否有加载时间和索引时间的统计数据?如果你这样做,你可以开始在这方面尝试一下。

1

使用索引删除加载更好,因为活动索引会为数据库中的每一行生成多个I/O。 400万行足够小,您不希望从表分区获得显着的优势。

通过使用bcp将数据加载到暂存区并同时运行多个任务(SSIS将执行此操作),您可以获得性能优势。为bcp编写一个通用的批处理文件包装器,它接受文件路径(如果需要,还需要表名),并在SSIS中使用'执行进程'任务在半打线程中调用一系列作业。对于50个工作,可能不值得尝试编写一个数据驱动的负载控制器过程。将这些任务包装在一个顺序容器中,这样你就不必显式维护所有的依赖关系。

您应该删除并重新创建索引,因为这将大大减少过程中的I/O数量。

如果50个来源的处理方式相同,请尝试将它们加载到公用表中或在分段表上构建分区视图。

1

索引在最后,是的。还要考虑将日志级别设置设置为BULK LOGGED,以尽量减少对事务日志的写入。请记住在完成之后将其重新设置为FULL。