3. ITPub 电子杂志(总第四期) 第3页
目录
本期焦点
ORACLE9I 中全文检索的创建与使用 作者:玉面飞龙 .................................................. 4
9I 新特点:SPFILE 的使用 作者:盖国强 (ITPUB:EYGLE) ...........................................51
ORACLE9I RAC 概述方案 作者:谢伟(ORACLEXIE) ....................................................69
ORACLE RAC FOR HP 安装报告 作者:谢伟(ORACLEXIE)..............................................75
实际应用
高级数据迁移 作者:谢中辉 .......................................................................................81
备份策略 作者:WEBKING .......................................................................................87
论坛精华
关于 SGA 设置的一点总结 作者:BITI_RAINY............................................................93
TIPS
将 ORACLE 加为 SQL SERVER 的链接服务器 作者:谢中辉 .........................................96
DB ENGLISH
关系数据库之父:DR. EDGAR FRANK CODD ..............................................................97
LINKS
超链接 ....................................................................................................................99
Home: http://www.itpub.net Mail: epub@itpub.net
4. ITPub 电子杂志(总第四期) 第4页
本期焦点
Oracle9i 中全文检索的创建与使用
作者:玉面飞龙
1 前言
Oracle 从 7.3 开始支持全文检索,即用户可以使用 Oracle 服务器的上下文(ConText)选项
完成基于文本的查询。具体可以采用通配符查找、模糊匹配、相关分类、近似查找、条件加
权和词意扩充等方法。 Oracle8.0.x 中称为 ConText ; Oracle8i 中称为 interMedia Text ;
在 在
Oracle9i 中称为 Oracle Text。
本篇主要介绍 Oracle Text 的基本结构和简单应用。
Oracle Text 是 9i 标准版和企业版的一部分。Oracle9i 将全文检索功能做为内置功能提供给
用户,使得用户在创建数据库实例时自动安装全文检索。
Oracle Text 的应用领域有很多:
搜索文本 :需要快捷有效搜索文本数据的应用程序
管理多种文档:允许搜索各种混和文档格式的应用程序,包括 ord,excel,lotus 等
从多种数据源中检索文本:不仅来自 Oracle 数据库中的文本数据,而且可以来自 Internet
和文件系统的文本数据
搜索 XML 应用程序
1.1 搜索文本
不使用 Oracle text 功能,也有很多方法可以在 Oracle 数据库中搜索文本.可以使用标准的
INSTR 函数和 LIKE 操作符实现.
SELECT *
FROM mytext
WHERE INSTR (thetext, 'Oracle') > 0;
SELECT *
FROM mytext
WHERE thetext LIKE '%Oracle%';
Home: http://www.itpub.net Mail: epub@itpub.net
5. ITPub 电子杂志(总第四期) 第5页
有很多时候 使用 instr 和 like 是很理想的, 特别是搜索仅跨越很小的表的时候.然而通过这些
文本定位的方法将导致全表扫描,对资源来说消耗比较昂贵,而且实现的搜索功能也非常有
限.
利用 Oracle Text,你可以回答如“在存在单词‘Oracle’的行同时存在单词’Corporation’而且
两单词间距不超过 10 个单词的文本‘,’查询含有单词’Oracle’或者单词’ california’的文
本,并且将结果按准确度进行排序‘,’含有词根 train 的文本‘。以下的 sql 代码实现了
如上功能。我们且不管这些语法是如何使用的。
DROP INDEX index mytext_idx
/
CREATE INDEX mytext_idx
ON mytext( thetext )
INDEXTYPE is CTXSYS.CONTEXT
/
SELECT id
FROM mytext
WHERE contains (thetext, 'near((Oracle,Corporation),10)') > 0
/
SELECT score (1), id
FROM mytext
WHERE contains (thetext, 'Oracle or california', 1) > 0
ORDER BY score (1) DESC
/
SELECT id
FROM mytext
WHERE contains (thetext, '$train') > 0;
1.2 设置
首先检查数据库中是否有 CTXSYS 用户和 CTXAPP 脚色。如果没有这个用户和角色,意味
着你的数据库创建时未安装 intermedia 功能。你必须修改数据库以安装这项功能。
还可以检查服务器是否有对 PLSExtProc 服务的监听。
lsnrctl status
should give status
LSNRCTL for Solaris: Version
8.1.5.0.0 - Production on 31-MAR-99 18:57:49
Home: http://www.itpub.net Mail: epub@itpub.net
6. ITPub 电子杂志(总第四期) 第6页
(c) Copyright 1998 Oracle Corporation. All rights reserved.
Connecting to
(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Solaris: Version 8.1.5.0.0 - Production
Start Date 30-MAR-99 15:53:06
Uptime 1 days 3 hr. 4 min. 42 sec
Trace Level off
Security OFF
SNMP OFF
Listener Parameter File
/private7/Oracle/Oracle_home/network/admin/listener.ora
Listener Log File
/private7/Oracle/Oracle_home/network/log/listener.log
Services Summary...
PLSExtProc has 1 service handler(s)
oco815 has 3 service handler(s)
The command completed successfully
Oracle 是通过所谓的‘外部调用功能’(external procedure)来实现 intermedia 的。
B. Create a user/table/index/query thus: As SYS or SYSTEM:
----------------------------------------------------------
CREATE USER ctxtest IDENTIFIED BY ctxtest;
GRANT CONNECT, RESOURCE, ctxapp TO ctxtest;
----------------------------------------------------------
Do any other grants, quotas, tablespace etc. for the new user. As CTXTEST:
----------------------------------------------------------
CREATE TABLE quick (
quick_id NUMBER PRIMARY KEY,
text VARCHAR(80));
INSERT INTO quick
(quick_id, text)
VALUES (1, 'The cat sat on the mat');
INSERT INTO quick
Home: http://www.itpub.net Mail: epub@itpub.net
7. ITPub 电子杂志(总第四期) 第7页
(quick_id, text)
VALUES (2, 'The quick brown fox jumped over the lazy dog');
COMMIT ;
CREATE INDEX quick_text
ON quick ( text )
INDEXTYPE IS ctxsys.CONTEXT;
----------------------------------------------------------
此时如果监听没有配置好创建索引将会失败。
CREATE INDEX quick_text ON quick ( text );
*
ERROR at line 1:
ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-20000: ConText error:
DRG-50704: Net8 listener is not running or cannot start external
procedures
ORA-28575: unable to open RPC connection to external procedure agent
ORA-06512: at "CTXSYS.DRUE", line 122
ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 34
ORA-06512: at line 1
如果一切正常,你将得到:
Index created.
现在尝试写一些查询:
SQL> SELECT quick_id FROM quick WHERE contains (text, 'cat') > 0;
QUICK_ID
----------
1
SQL> SELECT quick_id FROM quick WHERE contains(text, 'fox') > 0;
QUICK_ID
----------
2
Home: http://www.itpub.net Mail: epub@itpub.net
9. ITPub 电子杂志(总第四期) 第9页
索引类型 描述 查询操作符
索引
CTXCAT 当使用混合查询语句的时候可以带来很好的效率。适合于查 CATSEARCH
询较小的具有一定结构的文本段。具有事务性,当更新主表
的时候自动同步索引。
The CTXCAT index does not support table and index
partitioning, documents services (highlighting, markup,
themes, and gists) or query services (explain, query
feedback, and browse words.)
CTXRULE Use to build a document classification application. You MATCHES
create this index on a table of queries, where each query
has a classification.
Single documents (plain text, HTML, or XML) can be
classified by using the MATCHES operator.
CTXXPATH Create this index when you need to speed up ExistsNode()
queries on an XMLType column.
Can only create this index on XMLType column.
在以上 4 种索引中,最常用的就是 CONTEXT 索引,使用最通用的 CONTAINS 操作符进行
查询。本篇主要针对的就是 Oracle Text ConText 的介绍。
2.1.2 权限和临时表空间
权限
用户不需要具有 CTXAPP 脚色便可以建立 Oracle Text 索引。你只需要对某一文本列
有创建 B 树索引的权限。查询用户,索引用户,表拥有者可以是不同的用户。
临时表空间要求
建立 Oracle Text 索引需要消耗 CTXSYS 用户默认的临时表空间空间。如果空间不够
的话将导致 ORA-01652 错误。你可以扩展 CTXSYS 的临时表空间,而不是发出命
令的用户默认的临时表空间。
对于索引全英文的文本列来说,需要临时表空间大小通常是其文本数据量的
50%-200%不等。而对索引包含中文文本列来说需要的表空间会更多。
2.2 CONTEXT 索引
Home: http://www.itpub.net Mail: epub@itpub.net
10. ITPub 电子杂志(总第四期) 第 10 页
2.2.1 CONTEXT 索引的结构
Oracle Text 索引将文本打碎分成很多的记号(token).例如文本‘I Love www.itpub.net’
将会被分成 I ,LOVE,WWW,ITPUB,NET 这样的记号(token)。
Oracle Text CONTEXT 索引是反向索引(inverted index)。每个记号 (token)都映射着
包含它自己的文本位置。在索引建立过程中,单词 Cat 会包括如下的条目入口:
Cat row1,row2,row3
表示 Cat 在行 row1、row2、row3 都出现过,这样通过查找单词所对应的行的 rowid 就可以
迅速找到文本记录。
在索引建好后,我们可以在该用户下查到 Oracle 自动产生了以下几个表:(假设索引名为
myindex):DR$myindex$I、DR$myindex$K、DR$myindex$R、DR$myindex$N 其中以 I
表最重要,可以查询一下该表,看看有什么内容:
SQL> CREATE TABLE mytext (text VARCHAR2(100));
SQL> INSERT INTO mytext
VALUES ('I Love www.itpub.net');
SQL> COMMIT;
SQL> CREATE INDEX mytext_idx ON mytext(text) INDEXTYPE IS ctxsys.CONTEXT;
SQL> SELECT token_text, token_count FROM dr$mytext_idx$i;
TOKEN_TEXT TOKEN_COUNT
I 1
ITPUB 1
LOVE 1
NET 1
WWW 1
注意 TOKEN_TEXT 里面字符全部是大写的,默认情况下全文索引是不区分大小写的.
SQL> DESC dr$mytext_idx$i;
名称 是否为空 类型
TOKEN_TEXT NOT NULL VARCHAR2(64)
TOKEN_TYPE NOT NULL NUMBER(3)
TOKEN_FIRST NOT NULL NUMBER(10)
TOKEN_LAST NOT NULL NUMBER(10)
TOKEN_COUNT NOT NULL NUMBER(10)
TOKEN_INFO BLOB
Home: http://www.itpub.net Mail: epub@itpub.net
12. ITPub 电子杂志(总第四期) 第 12 页
Default CONTEXT Index Example
建立索引时,系统默认文档存储在数据库的文本列中。如果不显示的指定索引参数,系统会
自动探测文本语言,数据类型和文档格式。
CREATE INDEX myindex ON docs(text) INDEXTYPE IS CTXSYS.CONTEXT;
如上命令建立了一个默认参数的 CONTEXT 索引 myindex.系统默认:
Home: http://www.itpub.net Mail: epub@itpub.net
13. ITPub 电子杂志(总第四期) 第 13 页
1. 文本存储在数据库中。可以是 CLOB, BLOB, BFILE, VARCHAR2, or CHAR 类型
的文本数据。
2. 文本列语言是数据库建立时的默认的字符集。
3. 使用数据库默认的终止目录 stoplist.stoplist 记录存在于文本列中但不对其索
引的词。
4. 允许模糊查询。
2.3 索引参数
2.3.1DataStore
指明你的文本是如何存储的。系统默认文档储存在数据库内的文本列(CHAR, VARCHAR,
VARCHAR2, BLOB, CLOB, BFILE, or XMLType)中。DataStore 对象在由过滤器处理之前从
数据库中的列摘录文本。你要索引的文档可以来自多种数据源。
Datastore Type Use When
DIRECT_DATASTORE Data is stored internally in the text column. Each row is
indexed as a single document.
MULTI_COLUMN_DATASTORE Data is stored in a text table in more than one column.
Home: http://www.itpub.net Mail: epub@itpub.net
14. ITPub 电子杂志(总第四期) 第 14 页
Datastore Type Use When
Columns are concatenated to create a virtual document,
one per row.
DETAIL_DATASTORE Data is stored internally in the text column. Document
consists of one or more rows stored in a text column in a
detail table, with header information stored in a master
table.
FILE_DATASTORE Data is stored externally in operating system files.
Filenames are stored in the text column, one per row.
NESTED_DATASTORE Data is stored in a nested table.
URL_DATASTORE Data is stored externally in files located on an intranet or
the Internet. Uniform Resource Locators (URLs) are
stored in the text column.
USER_DATASTORE Documents are synthesized at index time by a
user-defined stored procedure.
DataStore 参数应用.
问:我有一张表记录着雇员的名称和住址,我想在这两列中查找某个单词是否存在这两个列之一。
答:方法 1,在雇员名称和住址上建立两个 ConText 索引。查询:
SELECT *
FROM emp
WHERE contains (ename, 'biti') > 0
OR contains (address, 'biti') > 0;
方法 2, 定制
Only CTXSYS is allowed to create preferences for the MULTI_COLUMN_DATASTORE type.
Any other user who attempts to create a MULTI_COLUMN_DATASTORE preference
receives an error.so it run on ctxsys schema
CREATE TABLE mc(id NUMBER PRIMARY KEY, NAME VARCHAR2(10), address VARCHAR2(80))
/
INSERT INTO mc
VALUES (1, 'John Smith', '123 Main Street biti');
EXEC ctx_ddl.create_preference('mymds', 'MULTI_COLUMN_DATASTORE');
EXEC ctx_ddl.set_attibute('mymds', 'columns', 'name, address');
Home: http://www.itpub.net Mail: epub@itpub.net
15. ITPub 电子杂志(总第四期) 第 15 页
CREATE INDEX mc_idx ON mc(NAME) INDEXTYPE IS ctxsys.CONTEXT PARAMETERS('datastore
mymds')
/
SELECT *
FROM mc
WHERE contains (name, 'biti') > 0;
问:如何实现对主/从表的全文检索?
答:使用类 Detail_DataStore。这个类经过设计,供主/从表格使用,其中大量文本存储在从表
表格列中。在进行索引之前把多个从表行联接为一个文档,使用外来关键码识别行,外键关系必
须已逻辑的方式存在,但不必作为数据库约束条件。注意在不更改主表的情况下更改从表,不会
更新索引。解决这个的办法是更新主列的值,触发索引的重新构建,或者手工设置和重新构建索
引。否则,应该存在未使用的列,来保持 SQL 语法的完整性。如下面例子中的 purchase_order
表的 line_item_body 列。
------------------BEGIN---------------------
SET echo on
DROP TABLE purchase_order;
CREATE TABLE purchase_order
( id NUMBER PRIMARY KEY,
description VARCHAR2(100),
line_item_body CHAR(1)
)
/
DROP TABLE line_item;
CREATE TABLE line_item
( po_id NUMBER,
po_sequence NUMBER,
line_item_detail VARCHAR2(1000)
)
/
INSERT INTO purchase_order
(id, description)
VALUES (1, 'Many Office Items')
/
INSERT INTO line_item
(po_id, po_sequence, line_item_detail)
VALUES (1, 1, 'Paperclips to be used for many reports')
/
INSERT INTO line_item
(po_id, po_sequence, line_item_detail)
Home: http://www.itpub.net Mail: epub@itpub.net
16. ITPub 电子杂志(总第四期) 第 16 页
VALUES (1, 2, 'Some more Oracle letterhead')
/
INSERT INTO line_item
(po_id, po_sequence, line_item_detail)
VALUES (1, 3, 'Optical mouse')
/
COMMIT ;
BEGIN
ctx_ddl.create_preference ('po_pref', 'DETAIL_DATASTORE');
ctx_ddl.set_attribute ('po_pref', 'detail_table', 'line_item');
ctx_ddl.set_attribute ('po_pref', 'detail_key', 'po_id');
ctx_ddl.set_attribute ('po_pref', 'detail_lineno', 'po_sequence');
ctx_ddl.set_attribute ('po_pref', 'detail_text', 'line_item_detail');
END;
/
DROP INDEX po_index;
CREATE INDEX po_index ON purchase_order( line_item_body )
INDEXTYPE IS ctxsys.CONTEXT
PARAMETERS( 'datastore po_pref' )
/
SELECT id
FROM purchase_order
WHERE contains (line_item_body, 'Oracle') > 0
/
-------------------END----------------------
2.3.2 Filter 过滤
一旦汇编了文档,它就沿管道传递。接下来这个阶段是过滤(Filter).如果文档是一种外
来格式,就将它转换为可读取的文本,以便进行索引。默认是 NULL_FILTER,它简单的直接
传递文档,不作任何修改。
通常我们使用 NULL_FILTER 过滤普通文本和 HTML 文档。下面是一个索引 HTML 文档的例子。
CREATE INDEX myindex
ON docs(htmlfile)
INDEXTYPE IS ctxsys.CONTEXT PARAMETERS(
'filter ctxsys.null_filter section group ctxsys.html_section_group');
我们使用 null_filter 过滤类和 ctxsys 用户自带的 html_section_group 区段组类。我们会在
后面马上介绍区段组(Section Groups)的概念。
2.3.2 Section Groups 区分组
Home: http://www.itpub.net Mail: epub@itpub.net
17. ITPub 电子杂志(总第四期) 第 17 页
区分组(Section Groups)是与 interMedia 一起使用 XML 的关键。这些组处理 XML(或者
HTML)文档,输出两个数据流,即区段界限和文本内容。默认是 NULL_SECTION_GROUP,
它简单的直接传递文本,不执行任何修改和处理。HTML_SECTION_GROUP 是专门用来处
理 HTML 文档的。
下面的例子中显示如何处理 HTML 文档。
------------------BEGIN---------------------
SET echo on
DROP TABLE my_html_docs;
CREATE TABLE my_html_docs( id NUMBER PRIMARY KEY, html_text VARCHAR2(4000))
/
INSERT INTO my_html_docs
(id,
html_text)
VALUES (1,
'<html><title>Oracle Technology</title><body>This is about the
wonderful marvels of 8i and 9i</body></html>')
/
COMMIT ;
CREATE INDEX my_html_idx ON my_html_docs( html_text )INDEXTYPE IS ctxsys.CONTEXT
/
-- 默认使用 NULL_SECTION_GROUP 不对文档做任何数据流处理
SELECT id
FROM my_html_docs
WHERE contains (html_text, 'Oracle') > 0
/
-- 可以检索到区段界限之间的文本
SELECT id
FROM my_html_docs
WHERE contains (html_text, 'title') > 0
/
SELECT id
FROM my_html_docs
WHERE contains (html_text, 'html') > 0
Home: http://www.itpub.net Mail: epub@itpub.net
18. ITPub 电子杂志(总第四期) 第 18 页
/
/* 也可以检索到 区段界限内的文本。但由于 HTML 文件中的一些标记如<b> <body> <A
href=…..>等对我们没有提供有用的信息。而且在索引中还浪费了空间和 CPU。因此 HTML 标记
不应该被索引 */
--我们可以定制我们自己的区段标记。可以查询在某个区段出现的单词
BEGIN
ctx_ddl.create_section_group ('my_section_group', 'BASIC_SECTION_GROUP');
ctx_ddl.add_field_section (
group_name=> 'my_section_group',
section_name=> 'Title',
tag => 'title',
visible=> FALSE
);
END;
/
DROP INDEX my_html_idx;
CREATE INDEX my_html_idx ON my_html_docs( html_text )
INDEXTYPE IS ctxsys.CONTEXT
PARAMETERS( 'section group my_section_group' )
/
SELECT id
FROM my_html_docs
WHERE contains (html_text, 'Oracle within title') > 0;
------------------END---------------------
下面是如何检索 XML 文档的例子
InterMedia Text 支持索引 XML 文档通过指定区段组。区段组就是 XML 文档中预先定义的节点.
你可以用 WithIn 在指定检索某个节点,提高了检索的准确性。
1) 首先,创建一个表来存储我们的 XML 文档:
CREATE TABLE employee_xml(
id NUMBER PRIMARY KEY,
xmldoc CLOB )
/
Home: http://www.itpub.net Mail: epub@itpub.net
19. ITPub 电子杂志(总第四期) 第 19 页
2) 插入一个简单的文档(the DTD is not required)
INSERT INTO employee_xml
VALUES (1,
'<?xml version="1.0"?>
<!DOCTYPE employee [
<!ELEMENT employee (Name, Dept, Title)>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Dept (#PCDATA)>
<!ELEMENT Title (#PCDATA)>
]>
<employee>
<Name>Joel Kallman</Name>
<Dept>Oracle Service Industries Technology Group</Dept>
<Title>Technologist</Title>
</employee>');
3)创建一个叫'xmlgroup'的 interMedia Text section group , 添加 Name 和 Dept tag 到
section group 中。(Caution: in XML, tag names are case-sensitive, but
tag names in section groups are case-insensitive)
BEGIN
ctx_ddl.create_section_group ('xmlgroup', 'XML_SECTION_GROUP');
ctx_ddl.add_zone_section ('xmlgroup', 'Name', 'Name');
ctx_ddl.add_zone_section ('xmlgroup', 'Dept', 'Dept');
END;
4)Create our interMedia Text index, specifying the section group we created above.
Also, specify the null_filter, as the Inso filter is not required.
CREATE INDEX employee_xml_index
ON employee_xml( xmldoc )
INDEXTYPE IS ctxsys.CONTEXT PARAMETERS(
'filter ctxsys.null_filter section group xmlgroup' )
/
5) 现在,执行一个查询,搜寻特定 Section 中的 Name:
SELECT id
FROM employee_xml
WHERE contains (xmldoc, 'Joel within Name') > 0;
6)Only non-empty tags will be indexed, but not the tag names themselves.
Thus, the following queries will return zero rows.
Home: http://www.itpub.net Mail: epub@itpub.net
20. ITPub 电子杂志(总第四期) 第 20 页
SELECT id
FROM employee_xml
WHERE contains (xmldoc, 'title') > 0;
SELECT id
FROM employee_xml
WHERE contains (xmldoc, 'employee') > 0;
7) But the following query will locate our document, even though we have not defined
Title as a section.
SELECT id
FROM employee_xml
WHERE contains (xmldoc, 'Technologist') > 0;
Let's say you want to get going right away with indexing XML, and don't want to have to
specify sections for every element in your XML document collection. You can do this very
easily by using the predefined AUTO_SECTION_GROUP. This section group is exactly like
the XML section group, but the pre-definition of sections is not required. For all
non-empty tags in your document, a zone section will be created with the section name
the same as the tag name.
Use of the AUTO_SECTION_GROUP is also ideal when you may not know in advance all of
the tag names that will be a part of your XML document set.
8) Drop our existing interMedia Text index.
9)And this time, recreate it specifying the AUTO_SECTION_GROUP.
We do not need to predefine the sections of our group, it is handled for us Automatically.
DROP INDEX employee_xml_index
/
CREATE INDEX employee_xml_index ON employee_xml( xmldoc )
INDEXTYPE IS ctxsys.CONTEXT PARAMETERS( 'filter ctxsys.null_filter section group
ctxsys.auto_section_group' )
/
10) 再一次,我们使用 Section 查找定位我们的文档:
SELECT id
FROM employee_xml
WHERE contains (xmldoc, 'Technologist within Title') > 0;
Home: http://www.itpub.net Mail: epub@itpub.net
21. ITPub 电子杂志(总第四期) 第 21 页
2.3.3 Storage 类
Storage(存储空间)组的类只含有 BASIC_STORAGE.默认情况下,BASIC_STORAGE 对象的
属性是空的。 我们通常需要定制自己的 STORAGE 类, 来控制索引的存储参数以及存储空间。
建立全文索引的时候我们通常会考虑表段 dr$indexname$I,,dr$indexname$R,索引段
dr$indexname$X 的空间分配。
类型 描述
BASIC_STORAGE 为 CONTEXT 索引指定默认的存储参数
BASIC_STORAGE 有如下参数
属性 属性值
i_table_clause Parameter clause for dr$indexname$I table creation. Specify storage and
tablespace clauses to add to the end of the internal CREATE TABLE
statement.
The I table is the index data table.
k_table_clause Parameter clause for dr$indexname$K table creation. Specify storage and
tablespace clauses to add to the end of the internal CREATE TABLE
statement.
The K table is the keymap table.
r_table_clause Parameter clause for dr$indexname$R table creation. Specify storage and
tablespace clauses to add to the end of the internal CREATE TABLE
statement.
The R table is the rowid table.
The default clause is: 'LOB(DATA) STORE AS (CACHE)'
n_table_clause Parameter clause for dr$indexname$N table creation. Specify storage and
tablespace clauses to add to the end of the internal CREATE TABLE
statement.
The N table is the negative list table.
i_index_clause Parameter clause for dr$indexname$X index creation. Specify storage and
tablespace clauses to add to the end of the internal CREATE INDEX
statement. The default clause is: 'COMPRESS 2' which instructs Oracle to
compress this index table.
If you choose to override the default, Oracle recommends including
COMPRESS 2 in your parameter clause to compress this table, since such
Home: http://www.itpub.net Mail: epub@itpub.net
22. ITPub 电子杂志(总第四期) 第 22 页
属性 属性值
compression saves disk space and helps query performance.
p_table_clause Parameter clause for the substring index if you have enabled
SUBSTRING_INDEX in the BASIC_WORDLIST.
Specify storage and tablespace clauses to add to the end of the internal
CREATE INDEX statement. The P table is an index-organized table so the
storage clause you specify must be appropriate to this type of table.
默认情况下,4 个表段和 1 个索引段将会建立在拥有该表的用户的默认表空间下。如下:
CREATE INDEX iowner.idx ON towner.tab(b) INDEXTYPE IS ctxsys.CONTEXT;
索引将会建立在 IOWNER 用户的默认表空间下,而不管发出该语句的用户是否是 IOWNER。
Storage 范例
下面我们自己定制 CONTEXT 索引的存储选项。可以为各个段指定不同的表空间。
EXECUTE ctx_ddl.drop_preference('mystore');
BEGIN
ctx_ddl.create_preference ('mystore', 'BASIC_STORAGE');
ctx_ddl.set_attribute ('mystore', 'I_TABLE_CLAUSE', 'tablespace indx ');
ctx_ddl.set_attribute (
'mystore',
'I_INDEX_CLAUSE',
'tablespace users03 compress 2 '
);
END;
--ORACLE 推荐 DR$INDX$X 进行压缩 COMPRESS 2
CREATE INDEX html1_idx
ON html1(newsdescription)
INDEXTYPE IS ctxsys.CONTEXT PARAMETERS('storage mystore');
---查看段的存储参数,这样方便了以后数据容量的扩展。
SELECT segment_name, tablespace_name
FROM user_segments
WHERE segment_name LIKE '%HTML1%';
2.3.4 设置词法分析器(lexer)
Home: http://www.itpub.net Mail: epub@itpub.net
32. ITPub 电子杂志(总第四期) 第 32 页
WHERE contains (text, 'Oracle', 1) > 0;
得分 SCORE 是指查询结果的贴切程度。得分越高表示查询信息满意度越高。你可以根据 SCORE
进行排序。
SELECT score (1), title
FROM news
WHERE contains (text, 'Oracle', 1) > 0
ORDER BY score (1) DESC;
SELECT score (1), title, issue_date
FROM news
WHERE contains (text, 'Oracle', 1) > 0
AND issue_date >= ('01-OCT-97')
ORDER BY score (1) DESC;
A structured query, also called a mixed query。For example, the upper SELECT statement
returns all articles that contain the word Oracle that were written on or after October 1,
1997.
SELECT id,score(1),score (2),score (1)+ score (2) total, text
FROM mytable
WHERE contains (text, 'biti', 1) > 0
OR contains (text, 'hello', 2) > 0
ORDER BY total DESC;
根据 contains 中的不同数字标示各个 contains 返回的分数 Score。
PL/SQL 形式:
DECLARE
rowno NUMBER := 0;
BEGIN
FOR c1 IN ( SELECT score (1) score, title
FROM news
WHERE contains (text, 'Oracle', 1) > 0
ORDER BY score (1) DESC)
LOOP
rowno := rowno + 1;
DBMS_OUTPUT.put_line ( c1.title || ': ' || c1.score);
EXIT WHEN rowno = 10;
END LOOP;
END;
Home: http://www.itpub.net Mail: epub@itpub.net
33. ITPub 电子杂志(总第四期) 第 33 页
返回了得分最高的前 10 条记录.
5.2 Logical Operators
允许你组合搜索条件,通过使用 AND,OR 等逻辑。
操作符 符号 描述 例子表达式
AND & Use the AND operator to search 'cats AND dogs'
for documents that contain at 'cats & dogs'
least one occurrence of each of
the query terms.
Score returned is the minimum
of the operands.
OR | Use the OR operator to search 'cats | dogs'
for documents that contain at 'cats OR dogs'
least one occurrence of any of
the query terms.
Score returned is the maximum
of the operands.
NOT ~ Use the NOT operator to search To obtain the documents that
for documents that contain one contain the term animals but not
query term and not another. dogs, use the following
expression:
'animals ~ dogs'
ACCUM , Use the ACCUM operator to The following query returns all
search for documents that documents that contain the terms
contain at least one occurrence dogs, cats and puppies giving the
of any of the query terms. The highest scores to the documents
accumulate operator ranks that contain all three terms:
documents according to the
total term weight of a 'dogs, cats, puppies'
document.
EQUIV = Use the EQUIV operator to The following example returns all
specify an acceptable documents that contain either the
substitution for a word in a phrase alsatians are big dogs or
query. German shepherds are big dogs:
'German
Home: http://www.itpub.net Mail: epub@itpub.net
34. ITPub 电子杂志(总第四期) 第 34 页
操作符 符号 描述 例子表达式
shepherds=alsatians are
big dogs'
在 Oracle Text Reference Release 9.2 可以查看更多的选项。
5.3 如何优化查询
5.3.1 收集统计信息
By collecting statistics on the Text domain index, the Oracle cost-based optimizer is able to
do the following:
• estimate the selectivity of the CONTAINS predicate
• estimate the I/O and CPU costs of using the Text index, that is, the cost of
processing the CONTAINS predicate using the domain index
• estimate the I/O and CPU costs of each invocation of CONTAINS
5.3.2 使用 FIRST_ROWS(n) for ORDER BY Queries
With the FIRST_ROWS hint, Oracle instructs the Text index to return rowids in
score-sorted order, if possible.
Without the hint, Oracle sorts the rowids after the Text index has returned all the rows in
unsorted order that satisfy the CONTAINS predicate. Retrieving the entire result set as
such takes time.
Since only the first 10 hits are needed in this query, using the hint results in better
performance.
Note: Use the FIRST_ROWS(n) hint when you need only the first few
hits of a query. When you need the entire result set, do not use this hint
as it might result in poor performance.
6.分区
Home: http://www.itpub.net Mail: epub@itpub.net
35. ITPub 电子杂志(总第四期) 第 35 页
CONTEXT 索引支持在分区表山建立本地分区索引,但仍然有一些限制。如下:
分区表必须是按范围分区,不支持 HASH 分区和复合分区。
你应该为每个分区指定索引分区名称。 如果不指定, 系统默认为每个分区表指
定。分区索引列表的顺序必须和分区表的顺序一致。
可以为每个分区分别指定 PRAMETERS 参数,但是 PARAMETERS 只允许包括
STORAGE 和 MEMEROY 参数。
不能指定 ONLINE 建立索引。
可以查询 CTX_INDEX_PARTITIONS 或者 CTX_USER_INDEX_PARTITIONS 获得更多信息。
6.1 创建一个本地分区索引:
------------------------BEGIN---------------------------
PROMPT create partitioned table and populate it
CREATE TABLE part_tab (a int, b varchar2(40)) PARTITION BY RANGE(a)
(partition p_tab1 values less than (10),
partition p_tab2 values less than (20),
partition p_tab3 values less than (30));
PROMPT create customer storage preference assigned each partition
Execute ctx_ddl.drop_preference('mystore1');
BEGIN
ctx_ddl.create_preference ('mystore1', 'BASIC_STORAGE');
ctx_ddl.set_attribute ('mystore1', 'I_TABLE_CLAUSE', 'tablespace indx ');
ctx_ddl.set_attribute (
'mystore1',
'I_INDEX_CLAUSE',
'tablespace users03 compress 2 '
);
END;
PROMPT create partitioned index
CREATE INDEX part_idx on part_tab(b) INDEXTYPE IS CTXSYS.CONTEXT
LOCAL (partition p_idx1 parameters(‘storage mystore1’), partition p_idx2
parameters(‘storage mystore2’), partition p_idx3 parameters(‘storage
mystore3’));
-------------------------END----------------------------
Home: http://www.itpub.net Mail: epub@itpub.net
36. ITPub 电子杂志(总第四期) 第 36 页
6.2 并行的创建一个本地分区索引
可以并行的建立分区索引,加快建立索引速度。但是建立索引不能“一步到位“。我们必须
先建立一个 unusable 索引,然后利 DBMS_PCLXUTIL.BUILD_PART_INDEX 并行建立索引。
------------------------BEGIN---------------------------
PROMPT the base table has three partitions.
PROMPT We create a local partitioned unusable index first
CREATE INDEX tdrbip02bx ON tdrbip02b(text)
indextype is ctxsys.context local (partition tdrbip02bx1,
partition tdrbip02bx2,
partition tdrbip02bx3)
unusable;
PROMPT run the DBMS_PCLUTIL.BUILD_PART_INDEX,which builds the 3 partitions in
parallel (inter-partition parallelism). Also inside each partition, index creation
is done in parallel (intra-partition parallelism) with a parallel degree of 2.
BEGIN
DBMS_PCLXUTIL.build_part_index (3, 2, 'TDRBIP02B', 'TDRBIP02BX', TRUE);
END;
-------------------------END----------------------------
6.3 查询分区索引
你可以在单个表分区上进行全文检索。
SELECT *
FROM part_tab PARTITION (p_tab4)
WHERE contains (b, 'Oracle') > 0
ORDER BY score;
7.Oracle Text 支持对本地文件的检索
它的实现是依靠参数 datastore 和 filter 的组合。在数据库的文本列中只保存指向硬盘文件
的指针。建立索引的时候,Oracle 读取硬盘上的文件并且将索引存储在 Oracle 数据库中。
Oracle 支持对很多格式的文件的文本检索,包括文本文件 Txt, Html 文件, Word 文档,
Excel 表格, PowerPoint 的文本检索,也支持 PDF(pdf 版本 1.4 目前还不支持)。
Home: http://www.itpub.net Mail: epub@itpub.net
39. ITPub 电子杂志(总第四期) 第 39 页
URL_DATASTORE 参数
URL_DATASTORE 的一些参数,其中 timeout,proxy 是经常用到的:
属性 属性值
timeout Specify the timeout in seconds. The valid range is 15 to 3600 seconds.
The default is 30.这个参数根据网络性能调整。
maxthreads Specify the maximum number of threads that can be running
simultaneously. Use a number between 1and 1024. The default is 8.
Urlsize Specify the maximum length of URL string in bytes. Use a number
between 32 and 65535. The default is 256.
maxurls Specify maximum size of URL buffer. Use a number between 32 and
65535. The defaults is 256.
maxdocsize Specify the maximum document size. Use a number between 256 and
2,147,483,647 bytes (2 gigabytes). The defaults is 2,000,000.
http_proxy Specify the host name of http proxy server. Optionally specify port
number with a colon in the form hostname:port
ftp_proxy Specify the host name of ftp proxy server. Optionally specify port number
with a colon in the form hostname:port.
no_proxy Specify the domain for no proxy server. Use a comma separated string of
up to 16 domain names.
索引建立过程:
首先建立自己的 URL_DATASTORE 选项。如下指定了代理,Timeout 时间。
BEGIN
ctx_ddl.create_preference ('URL_PREF', 'URL_DATASTORE');
ctx_ddl.set_attribute ('URL_PREF', 'Timeout', '300');
END;
建立存储 Url 路径的表:
CREATE TABLE urls(id NUMBER PRIMARY KEY, url VARCHAR2(2000));
INSERT INTO urls
VALUES (1, 'http:// http://intranet-center/');
INSERT INTO urls
VALUES (2, 'http://founderweb:9080/default.jsp');
COMMIT ;
Home: http://www.itpub.net Mail: epub@itpub.net
40. ITPub 电子杂志(总第四期) 第 40 页
建立索引,索引 Html 文件可以使用 HTML_SECTION_GROUP:
CREATE INDEX datastores_text ON urls ( url )
INDEXTYPE IS ctxsys.CONTEXT PARAMETERS (
'Datastore URL_PREF Lexer my_lexer Section group ctxsys.HTML_SECTION_GROUP' );
SELECT token_text
FROM dr$datastore_text$i;
关于建立以及同步索引的时候发生的错误信息可以从 ctx_user_index_errors 用户视图
中查看。
9. 常见错误
下面就一些常见的错误信息给出解释和解决办法:
1.sync 失败
DRG-10595: ALTER INDEX T_DOC6_CT 失败
DRG-50857: Oracle error in drsxsopen
ORA-01480: STR 赋值变量缺少空后缀
解决:这是 8i 的一个 bug, 但可以避免它,方法是在同步之前先发一个语句:
ALTER SESSION SET nls_language=american;
2.create index 失败
ORA-29855: 执行 ODCIINDEXCREATE 例行程序时出错
ORA-20000: interMedia Text 错误:
ORA-06512: 在"CTXSYS.DRUE", line 126
ORA-06512: 在"CTXSYS.TEXTINDEXMETHODS", line 54
ORA-06512: 在 line 1
解决:这是 8.1.6.3 之前的版本的一个 bug, 在处理中文时, 某个特殊字符造成的。 Oracle
向
索取补丁,或者自己去 metalink.Oracle.com 下载(需要 CSI 号码)。
3.create index 失败
RA-29855: 执行 ODCIINDEXCREATE 例行程序时出错
ORA-20000: interMedia Text 错误:
DRG-50704: Net8 监听器没有运行或无法启动外部过程
ORA-28575: 无法打开与外部过程代理程序的 RPC 连接
ORA-06512: 在"CTXSYS.DRUE", line 126
Home: http://www.itpub.net Mail: epub@itpub.net
41. ITPub 电子杂志(总第四期) 第 41 页
ORA-06512: 在"CTXSYS.TEXTINDEXMETHODS", line 54
ORA-06512: 在 line 1
解决:明显的 extproc 配置不当。仔细阅读本文基本设置的第二步。
4.访问建有索引的表时失败
ora-29861: 域索引标记为 loading/failed/unusable
解决:这是该表的一个 intermedia 索引有问题,该索引要么没有正确建立,要么是某次同
步失败导致它状态异常。先查到是哪个索引:
SELECT idx_name, idx_status
FROM ctxsys.ctx_indexes;
然后同步该索引或者强制删除它:
重建:ALTER INDEX myindex REBUILD ONLINE PARAMETERS('sync');
删除:DROP INDEX myindex FORCE;
5.使用 chinese_lexer 失败
ERROR at row 1:
ORA-29855: err on ODCIINDEXCREATE
ORA-20000: interMedia Text err:
DRG-10502: index 1386 is not existing.
DRG-11102: the lexer cann't analyze as SIMPLIFIED CHINESE_CHINA.ZHS16GBK
ORA-06512: 在"CTXSYS.DRUE", line 126
ORA-06512: 在"CTXSYS.TEXTINDEXMETHODS", line 54
ORA-06512: 在 line 1
解决:chinese_lexer 只支持 utf8 字符集。现在你面临抉择:忍受 chinese vgram lexer 的
愚蠢,或者将数据库字符集改到 utf8, 但面对可能引起你的应用不能正确处理中文的风险
(先咨询 Oracle support, 并且与你的应用软件提供商联系)。
6.升级或应用 patch 后失败
ORA-29856: err when execute ODCIINDEXDROP
ORA-20000: interMedia Texterr
ORA-06508: PL/SQL: can not find program unit beingcalled
ORA-06512: at "CTXSYS.DRUE", line 126
ORA-06512: at"CTXSYS.TEXTINDEXMETHODS", line 229
ORA-06512: at line 1
Home: http://www.itpub.net Mail: epub@itpub.net
42. ITPub 电子杂志(总第四期) 第 42 页
解决:这是 intermedia 的某个 object 没有正确产生或者编译。用 ctxsys 用户登录后,运行:
$Oracle_home/ctx/admin/dr0pkh.sql
和
$Oracle_home/ctx/admin/dr0plb.sql 以重新产生所有的 package.你也可以直接察看
dba_objects 视图,找出那些属于 ctxsys 用户并且 status 为 invalid 的东西,重新产生或者
重新编译。(你可能会发现有许多这种东西,不要惊讶,Oracle 不会因此而崩溃)。
7.create index 失败
ERROR 位于第 1 行:
ORA-29855: 执行 ODCIINDEXCREATE 例行程序时出错
ORA-20000: interMedia Text 错误:
DRG-50857: Oracle error in driddl.IndexResume
ORA-04030: 在尝试分配 524288 字节 (cursor work he,QERHJ Bit vector)时进程内存不足
ORA-06512: 在"CTXSYS.DRUE", line 126
ORA-06512: 在"CTXSYS.TEXTINDEXMETHODS", line 214
ORA-06512: 在 line 1
解决:引起这个问题可以有多种原因,首先你可以将 sort_area_size 这个参数减小到不多于
2M,这可以防止 Oracle 在创建索引时分配太多的 sort 内存而耗尽资源。但如果这不起作用,
而且你是 8.1.7, 则恭喜,你 hit 了 bug 1391737. 该 bug 在你要建索引的字段,如果某条
记录的长度超过 2000 字符时引起 Oracle 耗尽内存资源。别无它法,除了打 8.1.7.1B 的补
丁。
10.附录
10.1 ORACLE TEXT 资源:
Oracle Text Application Developer's Guide Release 9.2
Oracle Text Reference Release 9.2
Oracle Text (formerly interMedia Text)
Oracle Technology Network (OTN) discuss forum
10.2 关于索引性能的 FAQ
This section answers some of the frequently asked questions about indexing performance.
How long should indexing take?
Answer: Indexing text is a resource-intensive process. Obviously, the speed of indexing
will depend on the power of the hardware involved.
Home: http://www.itpub.net Mail: epub@itpub.net
43. ITPub 电子杂志(总第四期) 第 43 页
As a benchmark, with an average document size of 5K, Oracle Text can index
approximately 200 documents per second with the following hardware and parallel
configuration:
• 4x400Mhz Sun Sparc CPUs
• 4 gig of RAM
• EMC symmetrix (24 disks striped)
• Parallel degree of 5 with 5 partitions
• Index memory of 600MB per index process
• XML news documents that averaged 5K in size
• USER_DATASTORE
Other factors such as your document format, location of your data, and the calls to
user-defined datastores, filters, and lexers can have an impact on your indexing speed.
Which index memory settings should I use?
Answer: You can set your index memory with the system parameters
DEFAULT_INDEX_MEMORY and MAX_INDEX_MEMORY. You can also set your index
memory at run time with the CREATE INDEX memory parameter in the parameter string.
You should aim to set the DEFAULT_INDEX_MEMORY value as high as possible, without
causing paging.
You can also improve Indexing performance by increasing the SORT_AREA_SIZE system
parameter.
Experience has shown that using a large index memory setting, even into hundreds of
megabytes, will improve the speed of indexing and reduce the fragmentation of the final
indexes. However, if set too high, then the memory paging that occurs will cripple indexing
speed.
With parallel indexing, each stream requires its own index memory. When dealing with
very large tables, you can tune your database system global area (SGA) differently for
indexing and retrieval. For querying, you are hoping to get as much information cached in
the system global area's (SGA) block buffer cache as possible. So you should be allocating
a large amount of memory to the block buffer cache. But this will not make any difference
to indexing, so you would be better off reducing the size of the SGA to make more room for
a large index memory settings during indexing.
You set the size of SGA in your Oracle initialization file.
See Also:
Home: http://www.itpub.net Mail: epub@itpub.net
44. ITPub 电子杂志(总第四期) 第 44 页
Oracle Text Reference to learn more about Oracle Text system
parameters.
Oracle9i Database Administrator's Guide for more information on setting
SGA related parameters.
Oracle9i Database Performance Guide and Reference for more
information on memory allocation and setting the SORT_AREA_SIZE
parameter.
How much disk overhead will indexing require?
Answer: The overhead, the amount of space needed for the index tables, varies between
about 50% of the original text volume and 200%. Generally, the larger the total amount of
text, the smaller the overhead, but many small records will use more overhead than fewer
large records. Also, clean data (such as published text) will require less overhead than dirty
data such as emails or discussion notes, since the dirty data is likely to include many
unique words from mis-spellings and abbreviations.
A text-only index is smaller than a combined text and theme index. A prefix and substring
index makes the index significantly larger.
How does the format of my data affect indexing?
Answer: You can expect much lower storage overhead for formatted documents such as
Microsoft Word files since such documents tend to be very large compared to the actual
text held in them. So 1GB of Word documents might only require 50MB of index space,
whereas 1GB of plain text might require 500MB, since there is ten times as much plain text
in the latter set.
Indexing time is less clear-cut. Although the reduction in the amount of text to be indexed
will have an obvious effect, you must balance this out against the cost of filtering the
documents with the INSO filter or other user-defined filters.
Can I index in parallel?
Answer: Yes, you can index in parallel. Parallel indexing can improve index performance
when you have a large amount of data, and have multiple CPUs.
You use the PARALLEL keyword when creating the index:
CREATE INDEX index_name ON table_name (column_name)
INDEXTYPE IS ctxsys.context PARAMETERS ('...') PARALLEL 3;
Home: http://www.itpub.net Mail: epub@itpub.net
45. ITPub 电子杂志(总第四期) 第 45 页
This will create the index with up to three separate indexing processes depending on your
resources.
Note:
It is no longer necessary to create a partitioned table to index in parallel
as was the case in earlier releases.
Note:
When you create a local index in parallel as such (which is actually run in
serial), subsequent queries are processed in parallel by default. Creating
a non-partitioned index in parallel does not turn on parallel query
processing.
Parallel querying degrades query throughput especially on heavily
loaded systems. Because of this, Oracle recommends that you disable
parallel querying after indexing. To do so, use ALTER INDEX
NOPARALLEL.
How do I create a local partitioned index in parallel?
Answer: You can improve indexing performance by creating a local index in parallel.
However, currently you cannot create a local partitioned index in parallel using the
PARALLEL parameter with CREATE INDEX. In such cases the parameter is ignored and
indexing proceeds serially.
To create a local index in parallel, create an unusable index first, then run the
DBMS_PCLXUTIL.BUILD_PART_INDEX utility.
In this example, the base table has three partitions. We create a local partitioned unusable
index first, the run the DBMS_PCLUTIL.BUILD_PART_INDEX, which builds the 3 partitions
in parallel (inter-partition parallelism). Also inside each partition, index creation is done in
parallel (intra-partition parallelism) with a parallel degree of 2.
CREATE INDEX tdrbip02bx ON tdrbip02b(text)
indextype is ctxsys.context local (partition tdrbip02bx1,
partition tdrbip02bx2,
partition tdrbip02bx3)
Home: http://www.itpub.net Mail: epub@itpub.net
46. ITPub 电子杂志(总第四期) 第 46 页
unusable;
exec dbms_pclxutil.build_part_index(3,2,'TDRBIP02B','TDRBIP02BX',TRUE);
How can I tell how far my indexing has got?
Answer: You can use the CTX_OUTPUT.START_LOG procedure to log output from the
indexing process. Filename will normally be written to $ORACLE_HOME/ctx/log, but you
can change the directory using the LOG_DIRECTORY parameter in
CTX_ADM.SET_PARAMETER.
See Also:
Oracle Text Reference to learn more about using this procedure.
8.3Frequently Asked Questions About Updating the Index
This section answers some of the frequently asked questions about updating your index
and related performance issues.
How often should I index new or updated records?
Answer: How often do you need to? The less often you run reindexing with
CTX_DLL.SYNC_INDEX then the less fragmented your indexes will be, and the less you will
need to optimize them.
However, this means that your data will become progressively more out of date, which
may be unacceptable for your users.
Many systems are OK with overnight indexing. This means data that is less than a day old
is not searchable. Other systems use hourly, ten minute, or five minute updates.
See Also:
Oracle Text Reference to learn more about using
CTX_DDL.SYNC_INDEX.
"Managing DML Operations for a CONTEXT Index" in Chapter 2,
"Indexing"
How can I tell when my indexes are getting fragmented?
Home: http://www.itpub.net Mail: epub@itpub.net
47. ITPub 电子杂志(总第四期) 第 47 页
Answer: The best way is to time some queries, run index optimization, then time the
same queries (restarting the database to clear the SGA each time, of course). If the queries
speed up significantly, then optimization was worthwhile. If they don't, you can wait longer
next time.
You can also use CTX_REPORT.INDEX_STATS to analyze index fragmentation.
See Also:
Oracle Text Reference to learn more about using the CTX_REPORT
package.
"Index Optimization" in Chapter 2, "Indexing".
Does memory allocation affect index synchronization?
Answer: Yes, the same way as for normal indexing. But of course, there are often far
fewer records to be indexed during a synchronize operation, so it is not usually necessary
to provide hundreds of megabytes of indexing memory
10.4 示例 JSP 代码
This section describes the JSP web application.
Web Application Prerequisites
This application has the following requirements:
• Your Oracle database (version 8.1.6 or higher) is up and running.
• You have a web server such as Apache up and running and correctly configured
to send requests to the Oracle9i server.
JSP Sample Code: search_html.jsp
<%@ page import="java.sql.* , Oracle.jsp.dbutil.*" %>
<jsp:useBean id="name" class="Oracle.jsp.jml.JmlString" scope="request" >
<jsp:setProperty name="name" property="value" param="query" />
</jsp:useBean>
<%
Home: http://www.itpub.net Mail: epub@itpub.net
54. ITPub 电子杂志(总第四期) 第 54 页
三. 使用 pfile/spfile 启动数据库
如果你想使用 pfile 启动数据库,你可以在启动时指定 pfile 或者删除 spfile.
SQL> startup pfile='E:Oracleadmineyglenpfileinit.ora';
你不能以同样的方式指定 spfile,但是可以创建一个包含 spfile 参数的 pfile 文件,指向 spfile.
SPFILE 是一个自 Oracle9i 引入的初始化参数,类似于 IFILE 参数。 SPFILE 参数用于定义非
缺省路径的 spfile 文件。
你可以在 PFILE 链接到 SPFILE 文件,同时在 PFILE 中定义其他参数,如果参数重复设置,后
读取的参数将取代先前的设置。
PFILE 参数的使用,例如:
这是我们使用 SPFILE 启动的情况,
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> SHOW parameter log_archive_start
NAME TYPE VALUE
------------------------------------ ------------ --------
log_archive_start boolean TRUE
SQL> SHOW parameter spfile
NAME TYPE VALUE
-------------------- --------- -------------------------------
spfile string %ORACLE_HOME%DATABASESPFILE%ORACLE_SID%.ORA
Home: http://www.itpub.net Mail: epub@itpub.net
55. ITPub 电子杂志(总第四期) 第 55 页
SQL>
我们修改 PFILE 文件内容如下:
#Pfile link to SPFILE
SPFILE= 'E:OracleOra9iR2databaseSPFILEEYGLEN.ORA'
log_archive_start = false
可以预见这个 log_archive_start 参数设置将会代替 SPFILE 中的设置:
SQL> startup pfile='e:initeyglen.ora'
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> show parameter spfile
NAME TYPE VALUE
---------------- ------- --------- ----------------------
spfile string E:OracleOra9iR2databaseSPFLEEYGLEN.ORA
SQL> SHOW parameter log_archive_start
NAME TYPE VALUE
------------------------------------ -------- -----------
log_archive_start boolean FALSE
然后我们可以使用 ALTER SYSTEM 方式将修改固定到 SPFILE.
SQL> ALTER SYSTEM SET log_archive_start=FALSE SCOPE=spfile;
Home: http://www.itpub.net Mail: epub@itpub.net
57. ITPub 电子杂志(总第四期) 第 57 页
四. 修改参数
可以通过 ALTER SYSTEM 或者导入导出来更改 SPFILE 的内容。
ALTER SYSTEM 增加了一个新选项:SCOPE。SCOPE 参数有三个可选值:MEMORY 、
SPFILE 、BOTH。
MEMORY:只改变当前实例运行
SPFILE:只改变 SPFILE 的设置
BOTH:改变实例及 SPFILE
1. SCOPE=MEMORY
SQL> SHOW parameter timed_statistics
NAME TYPE VALUE
------------------------------------ ------ --------------
timed_statistics boolean TRUE
SQL> ALTER SYSTEM SET timed_statistics=FALSE SCOPE=MEMORY;
系统已更改。
SQL> SHOW parameter timed_statistics
NAME TYPE VALUE
------------------------------------ ------ --------------
timed_statistics boolean FALSE
SQL> SHUTDOWN immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
Home: http://www.itpub.net Mail: epub@itpub.net
58. ITPub 电子杂志(总第四期) 第 58 页
SQL> show parameter timed_statistics
NAME TYPE VALUE
------------------------------------ ------- ------------
timed_statistics boolean TRUE
2. SCOPE=SPFILE
SQL> show parameter timed_statistics
NAME TYPE VALUE
------------------------------------ ------- ------------
timed_statistics boolean TRUE
SQL> ALTER SYSTEM SET timed_statistics=FALSE SCOPE=SPFILE;
系统已更改。
SQL> show parameter timed_statistics
NAME TYPE VALUE
------------------------------------ ------- ------------
timed_statistics boolean TRUE
SQL> SHUTDOWN immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> STARTUP
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> SHOW parameter timed_statistics
NAME TYPE VALUE
------------------------------------ ------- ------------
Home: http://www.itpub.net Mail: epub@itpub.net
59. ITPub 电子杂志(总第四期) 第 59 页
timed_statistics boolean FALSE
SQL>
3. SCOPE = BOTH
使用 BOTH 选项实际上等同于不带参数的 ALTER SYSTEM 语句。
注意:如果修改静态参数,那么需要指定 SPFILE 参数,否则将会报错。
SQL> SHOW parameter timed_statistics
NAME TYPE VALUE
----------------------------------- -------- -----------
timed_statistics boolean FALSE
SQL> ALTER SYSTEM SET timed_statistics=TRUE SCOPE=BOTH;
系统已更改。
SQL> SHOW parameter timed_statistics
NAME TYPE VALUE
------------------------------------ -------- ----------
timed_statistics boolean TRUE
SQL> SHUTDOWN immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>STARTUP
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
Home: http://www.itpub.net Mail: epub@itpub.net
60. ITPub 电子杂志(总第四期) 第 60 页
SQL> SHOW parameter timed_statistics
NAME TYPE ALUE
------------------------------------ -------- ----------
timed_statistics boolean TRUE
SQL> ALTER SYSTEM SET sql_trace=FALSE SCOPE=BOTH;
ALTER SYSTEM SET sql_trace=FALSE SCOPE=BOTH
*
ERROR 位于第 1 行:
ORA-02095: 无法修改指定的初始化参数
SQL> ALTER SYSTEM SET sql_trace=FALSE SCOPE=SPFILE;
系统已更改。
4.你也可以在数据库 shutdown 时创建和修改 spfile,例如:
SQL> show sga
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
SQL> SHUTDOWN immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> create pfile from spfile;
文件已创建。
SQL> create spfile from pfile;
文件已创建。
SQL>
Home: http://www.itpub.net Mail: epub@itpub.net