使用此关系模式(具有DB2 9 中新的注释模式分解)分解 100,000 个文档的速度比将相同的 XML 文档插入 XML 列慢了 1.75 倍(参见 图 10)。此操作在每个文档之后执行,这是 OLTP 应用程序的典型操作。
图 10:比较 pureXML 插入和 DB2 9 分解(在每个文档之后执行)

如果降低执行的频率,就能提高 XML 列相当于分解的性能优势。每隔一个文档执行可使 XML 插入比分解快 2.56 倍(在我们的场景和配置中)。对于大量的插入或导入操作来说,如果每隔 50 或 100 个文档执行一次,可使 XML 列插入比分解快 4 到 5 倍(参见 图 11)。XML 列插入能够从较大的间隔中获得比分解(每个日志 I/O 请求有更多的日志页面)更多的益处。
图 11:比较 pureXML 插入和 DB2 9 分解(不同的执行间隔)

在执行间隔为 50 的情况下,图 12 比较了 DB2 9 中新的注释模式分解与 V8 中的 XML Extender 分解和 pureXML 插入。在我们的测试中,新的分解比 XML Extender 分解快 7 倍,pureXML 插入甚至比 V8 分解快 30 倍。
图 12:比较 DB2 V8 XML Extender 分解和 DB2 9 技术(执行间隔 = 50)

比较分解数据上和 pureXML 列上的 XML 查询
假设您需要为面向 XML 的应用程序和 web 服务(需要 XML 格式的查询结果)提供服务。如果 XML 数据被分解到关系表,那么关系查询结果必须被转换回 XML。为了实现此目的,可在 SQL 查询的 select 从句中使用 SQL/XML 发布函数来构建结果集所需的 XML 标签。
图 9 中定义了关系模式的 5 个 SQL 查询,它们逻辑上等效于 XML 列的 5 个 XQueries。这些 SQL 查查询使用传统关系谓词,结合一些或全部表,并使用 SQL/XML 发布函数来返回和 XQueries 相同的 XML 结果。图 13 中显示了相关的性能结果。
Query Q2 (1Pred1Doc) 基于一个帐号查找仅返回一个文档。在两种情况下(pureXML 和发布)都具有帐号的索引来改进查询性能。虽然 SQL/XML 查询速度很快,但是仍然比 XML 列的 XQuery 慢 75 倍。这是因为 XQuery 仅需通过索引定位文档然后串行化文档,而 SQL/XML 发布必须结合全部 12 个关系表并构建 XML 文档。
Queries Q1 (Select*) 和 Q3 (5PredSome) 返回许多文档,因此增加了从关系数据构建 SQL/XML 文档的成本。Query Q4 (PartialAll) 从每个 XML 文档读取几个值,并根据这些值构建全新的文档。当使用 pureXML 存储上的 XQuery 时,值从 XML 列中读取,构建使用 XQuery 来完成。当使用分解式数据的 SQL/XML 发布时,值从关系列中读取,构建使用 SQL/XML 来完成。两种情况下的瓶颈都是构建操作。这就是两种版本的 Q4 执行结果类似的原因。
图 13:比较 pureXML XQuery 和分解式数据的 SQL/XML 发布

Q5 (PartialSome) 使用多个谓词来返回仅具有一个元素的少量 XML 文档。在这种情况下,使用 SQL/XML 的成本不太高,因为它仅针对每个结果行构建一个因素,仅结合 12 个表中的 3个。因为关系数据搜索从某种程度上比 XML 数据搜索速度快,所以其性能比分解式数据好(在我们的设置中比 XQuery 速度快 20 倍)。
结束语
虽然对于单用户工作负载来说,CLOB 插入的速度可能快于 pureXML 插入的速度,但是典型业务场景下的密集并发插入可使 CLOB 插入速度比插入到 XML 列的速度慢 2 或 2.5 倍。如果在每个文档后执行插入操作,那么 pureXML 插入速度约比 DB2 9 中的新分解解决方案快 60% 到 70%。 对于执行频率低的大量插入或导入来说,pureXML 获取 XML 数据的速度比分解甚至快了 4 到 5 倍。这些测试使用了 DB2 9 中的新分解解决方案,此解决方案的速度比 V8 中的 XML Extender 分解速度快了 7 到 8 倍。
XML 类型列中 XML 数据的 XQuery 速度比 CLOB 的对应查询(需要在查询时进行 XML 解析)速度快了 40 倍。“pureXML 查询”和“CLOB 查询”之间的绝对性能差异,随查询数据量的增加而(线性)增加。
分解式数据的 pureXML XQuery 和 SQL/XML Publishing 之间的相对性能差异主要取决于需要标记为 XML 的关系数据量,以及所需要的连接(JOIN)操作数。当必须检索复杂的数据时,XQuery 明显优于发布查询。在我们的一些测试中,从 DB2 pureXML 存储检索 XML 数据能够比从关系表中构建 XML 数据快 50 到 100 倍。然而,无需复杂结合的简单搜索查询(返回的结果带有少量或没有 XML 标签)在 SQL 中速度更快。应用程序仍然需要在查询性能和插入性能之间权衡,并评估两者的混合使用。图 14 中总结了 XML 插入的性能。
图 14:XML 插入性能总结 (commitcount =1)

请注意:本文中的全部性能结果都是在隔离的实验室环境(具有特定硬件、操作和数据库配置)下获得的。在不同的环境下进行的不同测试所获得的结果可能和本文获得的结果有或多或少的性能差异。
虽然我们的全部测量仅使用了 DB2,但是许多与 CLOB 和分解式 XML 存储有关的性能问题,是其各自的一般概念(将 XML 存储为文本或将其转换为关系数据模型)所固有的。因此,您可在支持这些概念的其他 DBMS 环境下发现类似的性能特征。对此类问题感兴趣的读者可以在自己的环境下探索此类问题,并可将本文中的材料用作开发自己的测试的基础。



