【问题标题】:SQL -> MongoDB Export Performance IssuesSQL -> MongoDB 导出性能问题
【发布时间】:2011-04-01 20:46:47
【问题描述】:

我正在尝试设置一个自动化流程来定期转换大型 MS SQL 2008 数据库并将其导出到 MongoDB。

SQL 中的表和 MongoDB 中的集合之间不是一一对应的——例如 SQL 中的 Address 表被翻译成嵌入在 Mongo 中每个客户记录中的数组等等。

现在我有一个 3 步流程:

  1. 使用 FOR XML 查询将数据库的所有相关部分导出为 XML。
  2. 使用 XSLT 将 XML 转换为 mongoimport 友好的 JSON
  3. 使用 mongoimport 导入到 mongo

现在的瓶颈似乎是#2。使用 libxslt 对 300 万条客户记录(每条都包含人口统计信息和嵌入的地址和订单数组)进行 XML->JSON 转换需要数小时。

似乎很难相信目前还没有某种预先构建的方法可以做到这一点,但我似乎在任何地方都找不到。

问题:

A) 是否有任何预先存在的实用程序可以用来执行此操作?
B) 如果没有,有什么方法可以加快我的进程吗?
C)我是否以错误的方式处理整个问题?

【问题讨论】:

  • 更新:为 mongodb 友好的 JSON 创建一个 SSIS 目标组件。转入和转出 XML 似乎是额外的步骤。我希望能够使组件足够灵活,以进行必要的转换/非规范化/无论你怎么称呼它。

标签: sql sql-server mongodb database


【解决方案1】:

另一种方法是遍历每个表,逐条记录地向 mongo 添加信息,然后让 Mongo 进行反规范化!例如,要添加每个电话号码,只需浏览电话号码表并为记录中的每个电话号码执行“$addToSet”。

您也可以并行执行此操作并单独执行表格。这可能会加快速度,但可能会使 mongo 数据库更加“碎片化”。

您可能希望在开始之前添加任何所需的索引,否则在最后添加索引可能会延迟很大。

【讨论】:

  • 我喜欢这个主意!根据您的建议,我正在创建一个 SSIS 目标组件,该组件创建适用于使用 mongoimport 进行更新插入的 JSON(我假设使用 $addToSet)。这个想法是,要更新一个集合(例如客户集合),我最终会得到几个 json 文件(用于电话号码、地址、人口统计信息),然后 mongo 将它们一一导入。
  • Mongoimport 不会使用 $addToSet。那是一个更新运算符。您将不得不编写自定义代码来执行此操作。我的方法的缺点是它需要自定义代码。但这应该很容易。我建议使用您最喜欢的编程语言并简单地浏览每个表并使用 upsert 进行更新。因此,您可以对每条记录使用 $addToSet 进行更新插入。老实说,我不知道这是否会节省时间。如果它是自动化的,你会只做差异吗?你可以做某种触发。
  • 我做了一个自定义导入器,给定一个 JSON 文件,$addToSet 的每个集合和 $set 的每个属性(使用 $findToModify)。完全未优化的初始版本在使用 4,000,000 条记录进行测试时非常慢(整个过程大约需要一个小时(!))。我想我肯定只需要同步差异(可能使用触发器和时间戳字段。)在确定任何事情之前,我需要优化所有这些。有趣的是,当前的瓶颈似乎是 CPU(运行时为 100%)......让我很确定我的代码中有一些问题,呵呵。
  • 什么是 $findToModify?这只是一个标准的更新权限,您可以只使用 ID 作为查询对象进行更新。我们也有一些缓慢的过程。我们每个月修改一次 600 万条记录,耗时 18 小时。因为时间不重要,所以我刚刚留给 Mongo 有很多逐个字段的逻辑。如果您正在做差异,您可能不需要进行太多优化。你也应该接受这个问题的答案。
  • 哦,网站新手抱歉——现在接受答案。我认为 findToModify 是底层的数据库操作。我正在使用一个 C# 库,它没有明确支持更新修饰符(我可以看到)。不过,它将允许您手动发送命令。命令最终成为 findToModify { "collection" : "customer", { "_id" : 2 }, { $addToSet : { $each : [ {address fields...},...] }}} 我希望那只是更新记录。即使进行了一些细微的调整,它已经运行得更快了——而且由于差异,总记录会很小。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2012-11-07
  • 2013-01-07
  • 2011-06-30
  • 2019-10-16
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
相关资源
最近更新 更多