代码之家  ›  专栏  ›  技术社区  ›  Sisiutl

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

  •  3
  • Sisiutl  · 技术社区  · 17 年前

    我们有一个数据库,里面有大约10万个业务对象。每个对象有大约40个属性,存储在15个表中。我必须获取这些对象,对它们执行一些转换,然后将它们写入不同的数据库(使用相同的模式) 这是ADO.Net3.5版,SQL Server 2005。

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

    我在程序中的第一步是从源数据库中读取一个对象,执行转换,并对其40个属性中的每个属性调用库例程,将对象写入目标数据库。重复100000次。显然,这是极其低效的。

    有什么好的设计来处理这类问题?

    谢谢

    5 回复  |  直到 17 年前
        1
  •  6
  •   John Saunders    17 年前

    这正是SQL Server集成服务(SSIS)的优点。它记录在联机丛书中,与SQL Server相同。

        2
  •  1
  •   Cade Roux    17 年前

    不幸的是,我要说的是,您需要忘记您的客户端库,并在SQL中完成这一切。

        3
  •  1
  •   Chris McCall    17 年前

    你需要做多少次?如果只有一次,而且它可以在无人值守的情况下运行,我看不出为什么不应该重用现有的客户机代码。计算机是用来实现人类工作自动化的。如果效率不高,我知道这很糟糕,但如果你要做一周的工作来建立一个SSIS包,那么效率也很低。另外,您的客户端解决方案可能包含业务逻辑或验证代码,您必须记住这些代码才能传递到SQL。

    你可能想研究一下 Create_Assembly ,通过网络移动客户端代码以驻留在SQL框中。这将避免网络延迟,但可能会破坏SQL服务器的稳定性。

        4
  •  1
  •   Jens Schauder    17 年前

    坏消息:你有很多选择

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

    赞成:快;反对:非常丑陋。。。维护的噩梦,如果你需要一周以上的时间,不要这样做。还有几十次处决

    使用纯sql:我对sql server了解不多,但我认为它可以从另一个数据库中访问一个数据库,所以最快的方法之一是将它编写为一个“insert/update/merge语句的集合,其中包含select语句。

    PRO:Fast,只有一种技术;CON:requiresdirectconnectionbetween databases您可能很快就达到SQL或可用SQL知识的极限,这取决于转换的类型。

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

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

    使用高级语言(Java、C#、VB…):您可以将数据加载到适当的业务对象中,操作这些对象并将它们存储在数据库中。你现在看起来正在做的事情,虽然听起来有更好的ORMs可用,例如nhibernate

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

    专家:对不起,你得向别人要这个,到目前为止,我对这些工具只有不好的经验。

    骗局:一个高度专业化的工具,你需要掌握。我个人的经验是:转换的实现和执行速度比手写的SQL慢。可维护性的噩梦,因为所有东西都隐藏在专有的存储库中,所以对于IDE、版本控制、CI、测试来说,无论工具提供者提供给您什么,如果有的话,您都会陷入困境。

    PRO:即使复杂的操作也可以以一种干净的、可维护的方式实现,您可以在开发转换时使用所有花哨的工具,如良好的ide、测试框架、CI系统来支持您。

    CON:这增加了很多开销(从数据库中检索数据、实例化对象并将对象封送回目标数据库)。如果这是一个长期存在的过程,我会走这条路。

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

        5
  •  1
  •   HLGEM    17 年前

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