使用二进制 XML 和 XMLIndex 来聚合并查询非结构化 XML 数据源

本教程介绍如何使用二进制 XML 存储模型、XMLIndex、XQuery、SQL/XML 和许多其他 Oracle XML DB 的卓越功能来聚合并查询非结构化 XML 数据源。

大约 1 小时 30 分钟

主题

本教程包括下列主题:

将鼠标置于此图标上可以加载和查看本教程的所有屏幕截图。(警告:因为此操作会同时加载所有屏幕截图,所以网速较慢时,响应时间可能会比较长。)

注:此外,您还可以在下列步骤中将鼠标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。可以通过单击各个屏幕截图来将其隐藏。

概述

Oracle 数据库 11g XML DB 引入了一个新的二进制 XML 存储模型、新的 XMLIndex 索引和许多其他实现高性能存储以及检索结构化和非结构化 XML 文档的卓越新功能。本教程使用了一个 RSS 源聚合器的真实用例来演示这些全面的高性能功能。

二进制 XML 存储模型:
二进制 XML 是一个针对抽象数据类型 XMLType 的新存储模型,用以联接结构化(对象关系)和非结构化 (CLOB) 存储的现有本机存储模型。二进制 XML 存储提供比非结构化存储更高效的数据库存储、更新、索引和片段提取。它可以提供比非结构化存储更好的查询性能 — 它不会受制于 XML 分析瓶颈(它是一个分析后持久性模型)。与结构化存储类似,二进制 XML 存储了解 XML 模式数据类型并可以利用本机数据库数据类型。与非结构化存储类似,数据库插入或检索过程中无需数据转换。与结构化存储类似,二进制 XML 存储允许分段更新。由于二进制数据还可以用在数据库的外部,因此它可以作为高效的 XML 交换媒介,大多数情况下您可以从数据库卸载工作以提高整体性能。与非结构化存储类似,二进制 XML 数据按文档顺序保存。与结构化存储类似,数据和元数据可通过二进制存储在数据库级别分离,以提高效率。然而,与非结构化存储类似,二进制存储允许混合的数据和元数据,这允许实例结构产生变化。二进制 XML 存储允许非常复杂和可变的数据,这些数据在结构化存储模型中肯定会使用大量数据库表和联接。与其他 XMLType 存储模型不同的是,即使 XML 模式事先是未知的,您也可以针对基于 XML 模式的数据使用二进制存储,而且您可以将多个 XML 模式存储在同一表中并跨常见元素查询。

二进制 XML 和非结构化 XML 存储模型的 XMLIndex 索引:
B 树索引可以方便地用于结构化存储。它们通过直接针对基础对象来提供焦点。然而,在解决存储在二进制 XML 或 CLOB 实例中的 XML 文档的详细结构(元素和属性)时,它们通常效率低下。这是 XMLIndex 的特殊领域:二进制 XML 和非结构化存储模型。与 B 树索引(您为表示单个 XML 元素或属性的特定列定义索引)不同,XMLIndex 索引非常通用:使用 XMLIndex 编制索引适用于 XML 数据的所有可能的 XPath 表达式。较之其他索引编制方法,XMLIndex 索引具有以下优势:

XMLIndex 索引可用于 SQL/XML 函数 XMLExists()XMLTable()XMLQuery(),而且它在查询的任何部分都有效;它并不限于用在 WHERE 子句中。而您可能用于 XML 数据的其他任何索引都无法做到这一点。
XMLIndex 因此可提高对 SELECT 列表数据和 FROM 列表数据的访问速度,对 XML 片段提取尤为有用。基于函数的索引和 CTXXPath 索引
您无需预先了解将在查询中使用的 XPath 表达式。XMLIndex 完全是通用的,而基于函数的索引则不同。
可将 XMLIndex 索引用于基于 XML 模式或非基于模式的数据。它可用于二进制 XML 和非结构化存储模型。B 树索引仅适用于以对象关系方式存储(结构化存储)的基于模式的数据;它对于存储在二进制 XML 或 CLOB 实例中的基于 XML 模式的数据效率低下。
可使用 XMLIndex 索引通过 XPath 表达式进行搜索,这些表达式的目标是集合(即文档中出现多次的节点)。而函数索引则不然。

Oracle 数据库自带的 XQuery:
由于 XQuery 目前是一个 W3C 标准,因此 IT 社区已经开始接受 XML 和 XQuery 的商业使用。作为商用数据库技术的创新领导者,Oracle 数据库 11g 提供了一个与传统 Oracle 数据库服务器集成的全功能自带 XQuery 引擎。在 SQL 方面,SQL/XML 标准定义了一种将 XML 封装在 SQL 中并使用 XQuery 集成 XML 查询的方法。通过引入新的 SQL 函数,即将完成这项工作:XMLQuery()XMLTable()XMLExists()XMLCast()(使用 XQuery 操作 XML 和 SQL 值)。Oracle 数据库 11g 通过这些 SQL 标准函数在数据库服务器中实现了 XQuery 支持。还在 SQL*Plus 中实现了新的 XQUERY 命令,以允许用户在命令行中输入 XQuery 表达式。通过 Oracle 数据库 11g 中 XQuery 基于标准的实现,应用程序开发人员可以使用喜好的 API(例如 JDBC、ODP.NET 和 Web 服务)来利用 Oracle 数据库 XQuery 功能。

Oracle XQuery 的好处:
通过对结构化、非结构化和二进制 XML 存储模型使用 SQL/XML XQuery 函数和索引模式,XML DB 可以使用超过基于 DOM 的 XML 查询功能评估几个数量级的性能来跨不同存储模型执行统一 XML 查询。此外,XML 查询可以无缝地与 SQL 关系查询进行合并,来处理所有查询情况。最后,Oracle XML DB 的 XML 查询功能建立在业界最好的关系型数据库基础之上,具有高度的可靠性、可用性、可伸缩性和安全性。简而言之,Oracle 数据库 11g 中的 XML DB 查询功能为通用、可伸缩、并发以及高性能的 XML 应用程序提供了最全面、最高效的功能。

返回主题列表

开始本教程之前,您应该:

1. 安装 Oracle 数据库 11g
2.

此处下载并安装最新的 Firefox 浏览器(2.0 版或更高版本)

:由于缺少一个 DLL 文件,用于 Linux 的 Firefox 3.0 安装后无法打开。

3.

OTN 下载并安装 SQL Developer。

4.

下载 BinaryXML.zip 文件并将其解压缩到您的工作目录中(即 wkdir)

返回主题列表

设置环境变量

如果在 Linux 上执行该 OBE,则通过执行以下操作设置环境变量:

1. 打开一个终端窗口

2.

设置环境变量:LD_LIBRARY_PATH。例如,如果 ORACLE_HOME/u01/app/oracle/product/11.1.0/db_1,则执行以下操作:

ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=$ORACLE_BASE/product/11.1.0/db_1
ORACLE_SID=orcl
PATH=$ORACLE_HOME/bin:$PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib

返回主题列表

创建一个新用户并授予必要的权限

执行以下步骤,创建一个新用户,并使用 Oracle 数据库 11g 中的新安全机制授予该用户访问互联网的权限。

1.

以用户 system 的身份连接。

  1. 打开 SQL Developer。
  2. 在 Connections 选项卡中,选择 New Connection。

  1. 使用以下详细信息创建一个新连接 system

    Connection Name:system
    Username:system
    Password:oracle
    选中 Save Password 复选框
    Role:default

    测试并连接到 system

2.

单击 Execute script 按钮,打开并执行 1_1_CreateUser.sql 脚本。在 Select connection 窗口中,选择 system 并单击 OK

3. 执行 1_2_httpAccessPriv.sql 创建一个新的互联网访问控制列表 (ACL),并将其分配给新用户。在 Select connection 窗口中,选择 system 并单击 OK

返回主题列表

创建一个表来存储有关 RSS 源的信息

RSS(真正简单的联合)源是指向一个 XML 文档的 URL,XML 文档采用的 RSS 格式有多种变体。RSS 格式的 XML 文档包含新闻项。本节将创建一个表来存储有关订阅的 RSS 源的信息。

1.

执行 2_1_CreateFeedsTable.sql 脚本创建新的 rssfeeds 表。在 Select connection 窗口中,选择 system 并单击 OK

2.

打开并执行 2_2_InsertFeeds.sql 脚本将新闻源列表插入到 rssfeeds 表。在 Select connection 窗口中,选择 system 并单击 OK

3.

打开并执行 2_3_VerifyFeeds.sql 脚本来验证已插入新闻源列表。在 Select connection 窗口中,选择 system 并单击 OK

返回主题列表

创建一个表来存储 RSS 新闻项

不同的 RSS 格式使用不同的 XML 结构来代表新闻项。这种高度可变的 XML 结构最适于用二进制 XML 存储模型来存储。配合使用二进制 XML 存储模型和 SECUREFILE LOB 存储格式可以在增强性能的同时降低存储空间。

1.

执行 3_1_CreateRSSItemsTable.sql 脚本创建新的 newsItemsTable。在 Select connection 窗口中,选择 system 并单击 OK

注意,创建了“虚拟列”来强制实施唯一性约束。另请注意 Oracle XML DB 如何能够处理采用不同 RSS 格式定义的不同命名空间。

2.

打开 3_2_InsertRSSItems.sql。根据是否通过代理服务器访问互联网来修改脚本,以更改 utl_http.set_proxy() 调用的参数。在 Select connection 窗口中,选择 system 并单击 OK

3.

现在,可以执行 3_2_InsertRSSItems.sql 将新闻项插入 newsItemsTable 中。在 Select connection 窗口中,选择 system 并单击 OK

注意脚本如何使用 XMLTable() 函数提取新闻项并将其插入 newItemsTable 中。

4.

在新闻项标题的虚拟列上使用唯一性约束后,Oracle XML DB 可以强调新闻项标题的唯一性。可以执行 3_3_InsertTestItems.sql 通过插入标题重复的新闻项来确认新闻项标题上存在唯一性约束。在 Select connection 窗口中,选择 system 并单击 OK

返回主题列表

针对新闻项创建 XMLIndex

使用二进制 XML 存储模型存储新闻项后,针对新闻项标题创建 XMLIndex 将大幅提升查询性能。要对新闻项标题进行全文搜索,可以在 XMLIndex 的路径表上创建一个辅助文本索引。

1.

以用户 RSS 身份执行 4_CreateIndexes.sql 脚本,使用指向新闻项标题的 XPath 子集创建一个 XMLIndex。在 Select connection 窗口中,选择 system 并单击 OK

还将创建一个辅助文本索引。注意 Oracle XML DB 是如何处理不同 RSS 格式使用的多个命名空间的。

返回主题列表

RSS(真正简单的联合)聚合器的主要功能是聚合并规范来自不同源使用不同 RSS 格式的新闻项。本节将介绍如何创建规范化各种 RSS 格式的 RSS 视图。

1.

执行 5_1_CreateRSSViews.sql 脚本创建一个关系视图 newsItemsRelView 以规范化使用不同 RSS 格式的新闻项。在 Select connection 窗口中,选择 system 并单击 OK

注意用于创建该视图的 SQL 语句中的 UNION ALL 子句。另请注意使用了 ora:contains() XQuery 函数来实现对新闻项标题的全文搜索。还创建了 XMLType 视图 newsItemsRSSView 将不同的新闻源 RSS 格式规范化为单一的 RSS 2.0 格式。

2.

打开并执行 5_2_ExplainRSSViews.sql,查看在使用 XMLIndex 和辅助文本索引后,规范化视图中的 SQL/XML 查询性能是否得到改进。在 Select connection 窗口中,选择 system 并单击 OK

3.

打开并执行 5_3_CreateRSSResource.sql,创建一个 Oracle XMLDB 信息库资源,用以表示一个规范化的 RSS 源,对来自不同 RSS 源的新闻项进行聚合和规范化。在 Select connection 窗口中,选择 system 并单击 OK

返回主题列表

使用 Firefox 2.0 浏览器阅读规范化的 RSS 源

有多种新闻阅读器可以处理 RSS 2.0 格式。本节使用 Firefox 2.0 浏览器来阅读规范化的 RSS 源。

1.

使用以下详细信息创建一个 Sys 连接。

Connection Name:sys
Username:sys
Password:sys 的口令
选中 Save Password 复选框
Role:sysdba

测试并连接到 sys

2.

右键单击 sys 连接并选择 Open SQL Worksheet。单击 Run Script 图标执行以下命令。在 Select connection 窗口中,选择 sys 并单击 OK

exec dbms_xdb.sethttpport(8080);

select dbms_xdb.gethttpport() from dual;

3.

可以打开 Firefox 2.0 浏览器并指向 URL http://localhost:8080/home/RSS/news2007.xml出现提示后,输入以下详细信息。

Username:system
Password:oracle

您将看到从多个新闻源聚合的新闻项列表。

注:

  • 屏幕截图因新闻而异。
  • Firefox 2.0 包含的内置功能可以自动将文件转换为 RSS 格式。如果没有安装 Firefox 2.0,输出会以 XML 文档的形式显示。

返回主题列表

清理

1.

以用户 system 的身份执行脚本 cleanup.sql

返回主题列表

在本教程中,您了解了以下内容:

返回主题列表

将鼠标置于该图标上可以隐藏所有的屏幕截图。