MapForce 支持 SQL 合并操作,但只有在它是最合适的工具时才应使用
大型数据库表可以轻松包含数百万,甚至数亿条数据。负责维护这些大型数据集的数据库管理员和其他人员,总是关注 ETL(提取、转换和加载)操作、更新以及其他 SQL 查询的执行时间。为了提高这些操作的效率,一些(但并非所有)数据库供应商实现了 SQL 合并语句,该语句可以将数据批量插入或更新现有表的行,而无需为每一行都使用单独的语句。
Altova MapForce 能够自动支持 SQL 关联功能,前提是该功能适用于当前的数据源 目标数据库. 我们来看一个例子。

插入与更新 - 如果
以下图片展示了从 XML 文件中的元素到数据库表的“数据映射”关系。

默认情况下,MapForce 会为源文件中每个 "Person" 元素生成一个 SQL 插入语句,这对于向一个全新的、空数据库表中填充数据是合适的。但在其他情况下,例如同步备份副本与实时数据集时,插入语句并不适用。MapForce 允许您方便地为每个数据库映射指定正确的 SQL 操作。
只需点击目标数据库表旁边的“操作”图标,例如,在上面的示例中,点击“Person”表旁边的“操作”图标,即可打开“MapForce 数据库表操作”对话框。下图展示了下拉菜单功能,该功能允许您将 SQL 插入语句更改为“更新-如果”。

更新:如果需要设置条件。在这个映射中,我们希望更新数据库中的记录,条件是源数据包含已存在的键。同时,我们希望插入新行,条件是源数据中的键在数据库中不存在。
这通常被称为“如果...则更新/插入”操作。
“数据库表操作”对话框允许我们定义用于更新的条件,并在条件不成立时执行备选操作。以下展示了完整的操作集合,该集合定义了“如果...则更新,否则插入”的逻辑:

增量更新与批量合并
到目前为止,我们甚至还没有提到用于目标表的数据库供应商。这是因为,无论使用哪种流行的数据库,MapForce 的映射配置都是以相同的方式进行的。 无论目标数据库是否支持 SQL 合并功能,我们都不需要进行任何不同的操作。
当我们在数据库映射设计下方点击“MapForce 输出”选项卡时,MapForce 会生成一个针对特定数据库类型的 SQL 脚本。该脚本随后会显示在 MapForce 的输出窗口中,供用户查看。请注意,该脚本不会自动执行。
如果目标数据库支持 SQL Merge 语句,您会在脚本的开头附近看到一个 MERGE 语句。

如果目标数据库不支持 SQL Merge 语句,您将看到针对源数据每一行分别对应的 UPDATE...WHERE 语句。

您可以在 MapForce 中直接执行脚本,方法是从“MapForce 输出”菜单中选择“运行 SQL 脚本”选项。或者,您可以将映射关系保存为可执行文件,然后在 MapForce Server 中自动执行它,并在运行时指定输入文件名。
如果目标数据库支持SQL Merge功能,无论映射是否直接由MapForce执行,或者通过MapForce Server进行自动化,都会生成合并语句。MapForce 2017支持SQL Server 2008及更高版本、Oracle、IBM DB2和Firebird数据库的SQL Merge语句。
在Altova的内部测试中,我们发现使用MapForce Server批量执行SQL Merge操作,其效率可以比之前的技术提高高达15倍。*
*注:此处为Altova内部测试结果,具体效果可能因实际应用场景而异
点击此处 了解更多关于使用 MapForce 进行数据库映射的信息,包括支持的数据库的完整列表,这些数据库可以用作数据映射的源或目标。或者,点击此处 下载一个免费的、功能齐全的 30 天试用版。 本博客文章中使用的映射文件以 MapForce 示例的形式提供,详细的重现映射步骤请参考 MapForce 帮助文档。
- 性能结果基于 Altova 内部测试得出。您的实际结果可能有所不同。