2012-03-01 76 views
1

大师,SQL数据加载 - 建议需要

我们正在设置一个SSIS包来加载格式化文本文件到SQL服务器。它将有大约1亿行和文件大小(每个大约15 GB的多个文件)100 GB。文件格式与XML架构一致类似下面......它需要近72小时,在加载该文件到SQL Server表...

文件格式

EM | 123 | XYZ | 30 |销售管理| 20000 |广告| 1街1 | State | City1 | US | AD | 12Street 2 | state 2 | City2 | UK | CON | 2012689648 | CON | 42343435

EM | 113 | WYZ | 31 | Sales grade | 200 | AD | 12 Street 1 | State2 | City2 | US | AD | 1Street 22 | state 3 | City 3 | UK | CON | 201689648 | CON | 423435

EM | 143 | rYZ | 32 |销售Egr | 2000 | AD | 113Street 1 | State3 | City3 | US | AD | 12Street 21 | state 4 | City 5 | UK | CON | 201269648 | CON | 443435

数据将以上述格式显示。这意味着“EM”直到“AD”是员工详细信息,如代码,姓名,年龄,名称,工资和“AD”是街道,州,城市,国家的详细地址。地址数据对于同一个员工可以是多个...类似地,“CON”是具有也可以是多个的电话号码的联系细节。

因此,我们需要在其他两个表中的员工详细信息和引用密钥中将代码作为主键加载到单独表中的地址详细信息中,单独表中的地址详细信息和单独表中的联系人详细信息。

我们设计了一个包,像脚本组件一样,使用.NET脚本逐行解析,并为每个表创建多个输出缓冲区,并在脚本中添加该行。将脚本组件输出映射到3个OLE DB目标(SQL Server表)。

我们的服务器是四核,具有48 GB RAM虚拟化,我们有2个核心,24 GB专用于数据库。我们的SQL服务器数据库(简单恢复模式)在SAN存储的网络共享位置中包含数据文件。为了提高性能,我们创建了不同数据文件(主要和次要)中的每个表格,但仍需要大约72小时。

需要关于以下几点的指导。

  1. 是否有可能使用BCP,如果是任何指针。(希望BCP将有更好的表现)

  2. 任何建议上指定的解决方案。

  3. 任何候补......

没有在表中定义还没有触发指标......我们甚至已经架设defaultMaxbufferzie为100 MB

期待着response..Any非常感谢帮助..

+1

有什么问题吗?如何使这个更快?加载前是否禁用了索引? – 2012-03-01 17:53:10

+0

绝对检查索引是否打开,以及是否在目标表上有一些时髦的触发器或其他对象。 – wergeld 2012-03-01 18:10:21

+0

第1步,扔掉你的源脚本,除非你确信你的团队编写的代码比开箱即用的平面文件组件更严格。如果需要发送到多个目的地,请使用多播。你能澄清你的意思吗?“在脚本中添加了这一行。”给出所提供的输入数据可能是您的3个表的预期结果的例子将是有益的。 – billinkc 2012-03-01 19:05:12

回答

0

1)如果有必要,简化/ XSLT通过扁平化XML文件如下所示: http://blogs.msdn.com/b/mattm/archive/2007/12/15/xml-source-making-things-easier-with-xslt.aspx

2)使用XML源代码如下所示: http://blogs.msdn.com/b/mattm/archive/2007/12/11/using-xml-source.aspx

3)删除任何索引在目标表

4.)如果源数据是防弹,禁用经由在表上的约束:

ALTER TABLE [MyTable] NOCHECK CONSTRAINT ALL 

5)通过OLEDB目标

6)加载数据重新启用约束

7)重新创建索引

0

你说数据文件在网络共享。一种改进是添加硬盘驱动器并在SQL服务器上运行作业,因为您可以消除延迟。我想即使连接USB驱动器来读取文件将比使用网络位置更好。在我看来,肯定值得一试。

0

SSIS在执行批量加载时非常快速,所以我怀疑这个瓶颈不是SSIS本身,而是关于数据库/服务器配置的方式。几点建议:

  • 当你正在运行的进口,有多少行,你导入每秒(你可以导入,看看在做一个“SELECT COUNT(*)从READUNCOMMITTED yourtable”)请问这速度保持不变,还是减缓到最后导入?
  • 正如其他人所说,你有目标表上的任何索引或触发器?
  • 当您运行导入时,您的磁盘是什么样的?在perfmon中,磁盘队列是否疯狂跳动,表明你的磁盘是瓶颈?正常性能测试期间,这些磁盘上的吞吐量是多少?我有过不适当配置iSCSI或不正确对齐SAN存储的经验,可能会将我的磁盘从400MB /秒降至15MB /秒 - 在正常使用情况下仍然很好,但速度太慢,无法进行批量操作。

你也在谈论加载100GB的数据,这是不小的数量 - 它不应该花72小时加载,但它不会在20分钟内加载它,所以有合理的期望。请权衡这些以及人们询问的其他瓶颈,我们可能会帮助您分辨问题。

0

如果你有过这样的文件被创建,开始与任何控制,我会远离你与|EM||AD||CON|的一个一对多的关系,移动,做这样的事情:

|EM|EmpID|data|data|

|AD|EmpID|data|data|

|CON|EmpID|data|data|

而且,如果你可以分割记录到三个不同的文件中,您将能够使用具有固定规格的平面文件源组件来为每个源批量处理数据。