需要帮助设计大数据库更新过程

时间:2009-06-19 16:40:45

标签: sql-server architecture ado.net

我们有一个包含~100K业务对象的数据库。每个对象具有大约40个属性,这些属性存储在15个表中。我必须获取这些对象,对它们执行一些转换,然后将它们写入不同的数据库(使用相同的模式)。 这是ADO.Net 3.5,SQL Server 2005。

我们有一个库方法来编写单个属性。它确定属性进入的15个表中的哪一个,创建并打开连接,确定属性是否已存在并相应地插入或更新,并关闭连接。

我在程序中的第一步是从源DB读取对象,执行转换,并在其40个属性中的每一个上调用库例程,以将对象写入目标DB。重复100,000次。显然,这是非常无能为力的。

处理此类问题有哪些好的设计?

由于

5 个答案:

答案 0 :(得分:6)

这正是SQL Server Integration Services(SSIS)的优点所在。它在联机丛书中有记录,与SQL Server相同。

答案 1 :(得分:1)

不幸的是,我会说你需要忘记你的客户端库,并在SQL中完成所有这些。

答案 2 :(得分:1)

您需要多少次这样做?如果只有一次,它可以无人值守运行,我认为没有理由不重用现有的客户端代码。自动化人类的工作是计算机的用途。如果它效率低下,我知道这很糟糕,但是如果你要做一周的工作来设置一个SSIS包,那也是效率低下的。此外,您的客户端解决方案可能包含业务逻辑或验证代码,您必须记住这些代码转移到SQL。

您可能希望研究Create_Assembly,将您的客户端代码移动到网络上以驻留在SQL框中。这样可以避免网络延迟,但可能会破坏SQL Server的稳定性。

答案 3 :(得分:1)

坏消息:你有很多选择

使用flatfile转换:将所有数据提取到flatfiles中,使用grep,awk,sed,c,perl将它们操作到所需的insert / update语句中,并针对目标数据库执行这些操作

PRO:快; CON:非常丑陋...对于维护的噩梦,如果你需要这个超过一周的时间,不要这样做。还有几十次执行

使用纯sql:我对sql server知之甚少,但我认为它已经无法从另一个内部访问一个数据库,所以其中一个方法就是把它写成''的集合'插入/更新/合并使用select语句的语句。

PRO:快速,仅限一项技术; CON:需要数据库之间的直接连接您可能会很快达到SQL的限制或可用的SQL知识,具体取决于转换的类型。

使用t-sql,或者数据库提供的任何迭代语言,其他一切都与纯sql aproach类似。

PRO:非常快,因为你没有离开数据库CON:我不知道t-sql,但如果它像PL / SQL那样,它不是进行复杂转换的最好的语言。

使用高级语言(Java,C#,VB ......):您可以将数据加载到正确的业务对象中,然后对其进行操作并将其存储在数据库中。几乎就是你现在正在做的事情,虽然听起来有更好的ORM可用,例如NHibernate的

使用ETL工具:有一些用于提取,转换和加载数据的特殊工具。他们经常支持各种数据库。并且有许多策略可用于决定是否有更新或插入。

PRO:对不起,你不得不问其他人,我到目前为止对这些工具的经验不足。

CON:您需要掌握的高度专业化的工具。我个人的经验:实现和执行转换然后手写SQL更慢。可维护性的噩梦,因为所有内容都隐藏在专有存储库中,因此对于IDE,版本控制,CI,测试,如果有任何工具提供商提供给你的话,你就会陷入困境。

PRO:即使是复杂的操作也可以以干净的可维护方式实现,您可以使用所有精美的工具,如优秀的IDE,测试框架,CI系统,在开发转换时为您提供支持。

CON:它增加了很多开销(从数据库中检索数据,实例化对象,并将对象编组回目标数据库。如果这是一个进程,我会这样做好久不见。

在最后一个选项的基础上,您可以通过使用消息传递和Web服务进一步美化架构,如果您有多个源数据库或多个目标数据库,这可能是相关的。或者你可以手动实现一个多线程变压器,以获得通过。但我想我会离开你问题的范围。

答案 4 :(得分:1)

我和John在一起,SSIS是任何可重复进程导入大量数据的方法。它应该比你目前获得的30小时快得多。如果两个数据库位于同一服务器或链接服务器上,您也可以编写纯t-sql代码来执行此操作。如果你去t-sql路由,你可能需要做一个基于集合和循环代码的混合来批量运行(一次说2000条记录),而不是锁定表格一次大插入将取。