SQL数据加载 - 需要建议

时间:2012-03-01 17:50:36

标签: sql ssis bulkinsert

大师,

我们正在设置SSIS包以将格式化文本文件加载到SQL Server中。它将有大约1亿行,文件大小(每个大约15 GB的多个文件)100 GB。文件格式与XML模式一致,如下所述...将此文件加载到SQL服务器表中需要将近72小时......

文件格式

EM | 123 | XYZ | 30 |销售人员| 20000 | AD | 1街1 | State1 | City1 | US | AD | 12Street 2 | state 2 | City2 | UK | CON | 2012689648 | CON | 42343435

EM | 113 | WYZ | 31 |销售等级| 200 | AD | 12街1 | State2 | City2 | US | AD | 1Street 22 | state 3 | City 3 | UK | CON | 201689648 | CON | 423435

EM | 143 | rYZ | 32 | Sales 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. 任何替代......

  4. 表上没有定义索引也没有触发器...我们甚至将defaultMaxbufferzie设置为100 MB

    期待回应。非常感谢任何帮助..

4 个答案:

答案 0 :(得分:0)

您说数据文件位于网络共享上。一个改进是添加硬盘驱动器并在SQL服务器上运行作业,因为您可以消除延迟。我认为即使连接USB驱动器来读取文件也比使用网络位置更好。我认为当然值得一点测试。

答案 1 :(得分:0)

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

  • 当您运行导入时,您每秒导入多少行(您可以在导入期间执行“SELECT COUNT(*)FROM yourtable WITH READUNCOMMITTED”以查看)此速率是保持不变,还是执行此操作在导入结束时放慢速度?
  • 正如其他人所说,您的目的地表上是否有任何索引或触发器?
  • 当您运行导入时,您的磁盘是什么样的?在perfmon中,磁盘队列是否像疯了一样尖峰,表明你的磁盘是瓶颈?在正常性能测试期间,这些磁盘的吞吐量是多少?我有过这样的经验:不正确配置的iSCSI或不正确对齐的SAN存储可以将我的磁盘从400MB / s降低到15MB / s - 在常规使用期间仍然很好,但是在批量上做任何事情都太慢了。

你也在谈论加载100GB的数据,这是不小的数量 - 加载不需要72小时,但它也不会在20分钟内加载,所以有合理的期望。请仔细考虑这些以及人们提出的其他瓶颈问题,我们可以帮助您解决问题。

答案 2 :(得分:0)

如果您可以控制创建文件的方式,我会放弃与|EM||AD|,{{1}的一对多关系并做这样的事情:

|CON|

|EM|EmpID|data|data|

|AD|EmpID|data|data|

此外,如果您可以将记录拆分为三个不同的文件,则可以使用具有固定规格的平面文件源组件来批量处理数据。

答案 3 :(得分:0)

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

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

3.删除目标表上的所有索引

4.如果您的源数据是防弹的,请通过以下方式禁用对表的约束:

ALTER TABLE [MyTable] NOCHECK CONSTRAINT ALL

5.)通过OLEDB Destination

加载数据

6。)重新启用约束

7.)重新创建索引