导入新的数据库表(Importing new database table)

2019-10-19 15:20发布

当我在那里是一个很大的AIX主机上运行的主系统。 要设施的报告和操作有从主机每晚转储到SQL Server,使得我们每一个50上下的客户在自己的数据库具有相同的模式。 这转储需要约7小时,每天晚上完成,真的有没有什么我们可以做些什么:我们坚持与应用程序供应商提供什么。

转储到SQL Server之后,我们用它来运行一些其他日常程序。 其中的一个方法是将数据导入到一种管理报表沙箱表的,它结合了记录从一个特别重要的表来自全国各地的不同的数据库到一个表,经理谁不知道SQL所以可以用它来运行特定的报告不冲水了系统的其余部分。 这又是一个企业的事情:管理者想要的话,他们有能力看到我们实现它。

此表的导入过程需要它自己的几个小时。 它可以过滤下来约40万条记录,分布在50个数据库为约4万条记录,然后索引他们对某些列进行搜索。 即使在coupld小时它仍然超过三分之一只要初始负荷少,但我们的时间不多了过夜的处理,我们不控制主机转储,我们做进行控制。 所以,我一直在负责寻找各种方法来改善一个现有的程序。

目前,该理念是,它的速度更快,从每一个客户数据库中加载的所有数据,然后建立索引后一步到位。 此外,在避免案件陷入停顿等重要系统的利益,它运行长,一对夫妇更多的客户机都设置为总是先运行(在表上的主要指标是由一个clientId场)。 我们开始做的另一件事是从一些客户的负载数据在并行一段时间,而不是每个客户端顺序。

所以我的问题是,什么是先装载此表中的最有效的方法是什么? 难道我们就在后认为索引是更好吗? 或者我们应该在导入数据之前创建索引? 我们应该加载表索引顺序,避免大量的页面重新排序,而不是大客户第一? 可以装载在并行使事情变得更糟造成多大的磁盘访问一次全部或删除我们的控制秩序的能力? 任何其他的想法?

更新
那么,什么是了。 我能够在白天做一些基准测试,并没有什么区别,在所有不管是在开头或操作结束创建索引的加载时间,但我们节省了时间建立索引本身(它的课程建立近即时与表中没有任何数据)。

Answer 1:

我曾与装载散装的数据集在SQL Server的工作相当多,做的一些指标性能测试上,同时插入和事后添加。 我发现,到目前为止,它是更为高效的所有数据被加载后创建索引。 在我们的情况下,它用了1个小时,在末尾添加索引,和4小时加载与指数仍然在添加它。

我认为,关键是要获得数据移动尽可能快,我不知道如果为了真正帮助加载它,你对加载时间对指数时间任何统计数据? 如果你这样做,你可以开始尝试在这方面的事情了一下。



Answer 2:

与索引加载掉线更好的生活指数将产生多个I / O对数据库中的每一行。 400万行是足够小,你不会指望得到表分区一个显著的好处。

您可以通过使用bcp将数据加载到临时区域和并行运行多个任务(SSIS会这么做)获得性能的胜利。 写BCP通用批处理文件封装(如有必要和表名),其采用的文件路径,并调用了一系列的工作在半打线程在SSIS“执行进程”任务。 对于50个作业它可能不是试图写一个数据驱动的负载控制器的过程值得。 在一个序列容器包装这些任务了,这样你就不必维护所有依赖的明确。

你一定要删除并重新创建索引,因为这将大大减少过程中的I / O量。

如果50个源被同等对待,尝试加载它们变成公用表或建立在临时表分区视图。



Answer 3:

指数在年底,是的。 也可以考虑设置日志级别设置到大容量日志记录,以尽量减少写入事务日志。 不过,别忘了把它设回FULL你完成之后。



Answer 4:

据我所知,你是正确的 - 这是好得多一下子在最后一次添加记录,然后指数。



文章来源: Importing new database table