导入新的数据库表

时间:2008-10-22 14:31:16

标签: sql-server database performance indexing import

我所在的地方有一个在大型AIX大型机上运行的主系统。为了设备报告和操作,每晚从大型机转储到SQL Server,这样我们的每个50-ish客户端都在他们自己的数据库中,具有相同的模式。这个转储每晚需要大约7个小时才能完成,而且我们无法对此做任何事情:我们坚持使用应用程序供应商提供的内容。

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

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

目前,理念是从每个客户端数据库加载所有数据然后在一步中将其编入索引的速度更快。此外,为了避免在其运行时长时间停止其他重要系统的情况下,将一些较大的客户端设置为始终首先运行(表中的主索引是由一个clientid字段)。我们开始做的另一件事是一次并行地从几个客户端加载数据,而不是按顺序加载每个客户端。

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

更新
好吧,有些事情发生了。我能够在白天做一些基准测试,并且无论是在操作的开始还是在操作结束时创建索引,加载时间都没有差别,但是我们节省了构建索引本身的时间(它是课程几乎立即建立,表格中没有数据。)

4 个答案:

答案 0 :(得分:1)

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

我认为关键是尽可能快地移动数据,我不确定是否按顺序加载它真的有帮助,你有关于加载时间与索引时间的任何统计数据吗?如果你这样做,你可以开始尝试一些事情。

答案 1 :(得分:1)

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

通过使用bcp将数据加载到临时区域并并行运行多个任务(SSIS将执行此操作),您可以获得性能提升。为bcp编写一个通用的批处理文件包装器,它接受文件路径(如有必要,还有表名),并在SSIS中使用“执行进程”任务调用六个线程中的一系列作业。对于50个工作,可能不值得尝试编写数据驱动的负载控制器进程。将这些任务包装在序列容器中,这样您就不必明确地维护所有依赖项。

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

如果对50个源进行相同处理,请​​尝试将它们加载到公共表中或在登台表上构建分区视图。

答案 2 :(得分:1)

最后的索引,是的。还要考虑将日志级别设置设置为BULK LOGGED以最小化对事务日志的写入。记得在你完成后将它重新设置为FULL。

答案 3 :(得分:0)

据我所知,你是对的 - 最好一次添加记录然后在结尾处索引一次。