本教程介绍如何使用二进制 XML 存储模型、XMLIndex、XQuery、SQL/XML 和许多其他 Oracle XML DB 的卓越功能来聚合并查询非结构化 XML 数据源。
大约 1 小时 30 分钟
本教程包括下列主题:
| 概述 | |
| 前提条件 | |
| 设置环境变量 | |
| 创建一个新用户并授予必要的权限 | |
| 创建一个表来存储有关 RSS 源的信息 | |
| 创建一个表来存储 RSS 新闻项 | |
| 针对新闻项创建 XMLIndex | |
| 使用来自不同新闻源的经过聚合和规范化的新闻项创建一个 RSS 视图 | |
| 使用 Firefox 2.0 浏览器阅读规范化的 RSS 源 | |
| 清理计算机 | |
| 总结 |
将鼠标置于此图标上可以加载和查看本教程的所有屏幕截图。(警告:因为此操作会同时加载所有屏幕截图,所以网速较慢时,响应时间可能会比较长。)
注:此外,您还可以在下列步骤中将鼠标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。可以通过单击各个屏幕截图来将其隐藏。
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 数据库 11g 中的新安全机制授予该用户访问互联网的权限。
| 1. |
以用户 system 的身份连接。
|
|
| 2. |
单击 Execute script 按钮,打开并执行 1_1_CreateUser.sql 脚本。在 Select connection 窗口中,选择 system 并单击 OK。
|
|
| 3. | 执行 1_2_httpAccessPriv.sql 创建一个新的互联网访问控制列表 (ACL),并将其分配给新用户。在 Select connection 窗口中,选择 system 并单击 OK。
|
|
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 格式使用不同的 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。
|
|
使用二进制 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。
|
|
有多种新闻阅读器可以处理 RSS 2.0 格式。本节使用 Firefox 2.0 浏览器来阅读规范化的 RSS 源。
| 1. |
使用以下详细信息创建一个 Sys 连接。 Connection Name:sys 测试并连接到 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
您将看到从多个新闻源聚合的新闻项列表。
注:
|
|
| 1. |
以用户 system 的身份执行脚本 cleanup.sql。
|
|
在本教程中,您了解了以下内容: