我正在开发一个项目来处理三个文件......两个CSV和一个XML。使用BizTalk将这些文件从文件共享移动到SQL Server数据库表。使用SSIS中的C#组件将xml文件转换为与两个平面文件相同的平面文件格式。然后,这些平面文件由SSIS包处理。 SSIS转换中有很多业务逻辑。 SSIS包还使用链接服务器进行多次查找。所有查找和转换都是逐行完成的(这很慢)。此外,发生的任何错误都会放在一个单独的数据库表中,具体取决于导致错误的业务对象(即BusObj1_error,BusObj2_error,BusObj3_error)。 基本上,我希望有人可以建议一个更好的架构来提高性能,允许可扩展性和灵活性,并允许许多开发人员作为一个团队在相同的功能上工作。 例如。 - 将验证规则放在数据库中,而不是硬编码到SSIS中 - 使用带有errorTypeId FK的错误表到ErrorType表,而不是使用不同的错误表。 - 从SSIS C#迁移所有转换,以便多个开发人员可以同时处理不同的业务逻辑类。
由于
答案 0 :(得分:3)
我对BizTalk一无所知。所以,我不知道它能做什么或不能做什么。关于SSIS,我的建议如下:
如果您在脚本任务/脚本组件中嵌入了大量业务逻辑代码。我建议您创建一个C#类库项目并在GAC中注册DLL以在SSIS包中引用它。使DLL通用,以便在SSIS包中实现它所需的代码非常少。这样您也可以重用逻辑。
关于使用链接服务器查找,我希望我能正确理解这一点。你是说你有链接服务器指向其他实例而你的查找指向这些链接服务器?如果数据库位于SQL Server实例上,为什么不创建直接指向数据库的连接字符串并进行查找?这会加速很多事情。
您是否在包中使用了大量OLE DB命令转换?如果是直接插入,请尝试使用OLE DB Destination以加快速度。
看看这个SO答案How can I load a large flat file into a database table using SSIS?,我已经解释了如何将行转换拆分到多个目的地以加快处理速度。
由于您正在编写自定义设计数据库的错误,我认为最好有一个header-detail表结构来存储错误消息,而不必创建多个错误表。我更喜欢保持它更通用,因此逻辑可以适应未来的范围变化。
希望能给你一些想法。
修改1:
我有一种感觉,你会说查找数据库是DB2。但是,链接服务器可能会减慢程序包的速度。查找转换支持直接查询DB2数据库以及SQL Server和Oracle(MSDN)。您可以通过链接服务器避免查找。
将C#类库项目编译为dll后,您也可以从VB.NET引用它。只要您的DLL针对.NET Framework 2.0,我认为您应该善于在SSIS 2005中引用它。
此外,还有其他方法可以改进,具体取决于.NET代码中嵌入的逻辑。这个逻辑是否可以在存储过程中编写?在这种情况下,将数据加载到临时表中,运行在舞台数据上应用逻辑的存储过程,然后将数据传输到目标表。
答案 1 :(得分:0)
如果这些数据的性质是实时的,那么你应该在BizTalk中尽可能多地做。
例如,XSL转换可以在管道中动态应用,这意味着超快速,基于流的处理。
您可以通过水平缩放轻松提高吞吐量,允许您同时处理许多10个甚至100个项目。
答案 2 :(得分:0)
一些建议......
如果您只是使用BizTalk将文件从文件共享移动到SQL Server数据库表,那么我建议您将BizTalk完全取出并仅使用SSIS。如果您不需要BizTalk提供的任何功能,那么请不要使用BizTalk。保持简单。
此外,您将使用BCP获得最佳性能。使用SSIS准备数据,然后使用BCP将其加载到目标数据库。