Oracle 全文索引的表空间转移

本文详细介绍了在Oracle数据库中进行全文索引表空间迁移的方法。包括通过更改默认表空间和设置preference来实现索引对象的重新定位,以及涉及的索引类型和表空间名称的具体变化。

   工作中经常会转移表空间,表和一般的索引都没有什么问题,如果表有全文索引的话就需要做特别的处理,不能将全文索引和普通索引一样通过rebuild index来处理,需要将此全文索引先删除然后重建。具体方法如下:

1.如果没有建立preference的话,那么Oracle会将这些对象存放到默认表空间中,并根据默认表空间的存储参数设置这些对象的存储参数。

CONTEXT索引生成表的规则是DR$+索引名+$+表用途标识。

DR$IND_T_DOCS$I存储的是索引数据表(Index data table);

DR$IND_T_DOCS$K存储的是键值映射表(Keymap table);

DR$IND_T_DOCS$R是ROWID表(Rowid table);

DR$IND_T_DOCS$N是负键值链表(Negative list table);

DR$IND_T_DOCS$P这个表只有在CONTEXT索引中设置BASIC_WORDLIST的SUBSTRING_INDEX属性后才会生成,用来保存单词的部分内容。

用户tnsh的默认表空间是TNS2008,所以这些索引对象都放在了TNS2008.

SQL> select default_tablespace from dba_users where username='TNSH';

DEFAULT_TABLESPACE
------------------------------
TNS2008

SQL> drop index TNSH.I_PRODUCT_NAME_3;

Index dropped.

SQL> CREATE INDEX TNSH.I_PRODUCT_NAME_3 ON TNSH.PRODUCT_NAME
  2  (PRODUCT_NAME)
  3  INDEXTYPE IS CTXSYS.CONTEXT
  4  PARAMETERS('SYNC ( ON COMMIT)')
  5  NOPARALLEL;

SQL> select owner,index_name,index_type,table_name,tablespace_name
  2  from dba_indexes where owner='TNSH' and table_name  like '%PRODUCT_NAME_3%';

OWNER  INDEX_NAME                     INDEX_TYPE      TABLE_NAME                               TABLESPACE
------ ------------------------------ --------------- ---------------------------------------- ----------
TNSH   SYS_IOT_TOP_494187             IOT - TOP       DR$I_PRODUCT_NAME_3$N                    TNS2008
TNSH   SYS_IOT_TOP_494182             IOT - TOP       DR$I_PRODUCT_NAME_3$K                    TNS2008
TNSH   SYS_IL0000494184C00002$$       LOB             DR$I_PRODUCT_NAME_3$R                    TNS2008
TNSH   SYS_IL0000494179C00006$$       LOB             DR$I_PRODUCT_NAME_3$I                    TNS2008
TNSH   DR$I_PRODUCT_NAME_3$X          NORMAL          DR$I_PRODUCT_NAME_3$I                    TNS2008

由于这个索引 没有使用BASIC_WORDLIST的SUBSTRING_INDEX,所以没有DR$IND_T_DOCS$P的表。

更改默认表空间后试一下:

SQL> alter user tnsh default tablespace  tns2008_TMP;

User altered.

SQL> drop index TNSH.I_PRODUCT_NAME_3;

Index dropped.

SQL> CREATE INDEX TNSH.I_PRODUCT_NAME_3 ON TNSH.PRODUCT_NAME
  2  (PRODUCT_NAME)
  3  INDEXTYPE IS CTXSYS.CONTEXT
  4  PARAMETERS('SYNC ( ON COMMIT)')
  5  NOPARALLEL;

Index created.

SQL> select owner,index_name,index_type,table_name,tablespace_name
  2  from dba_indexes where owner='TNSH' and table_name  like '%PRODUCT_NAME_3%';

OWNER  INDEX_NAME                     INDEX_TYPE      TABLE_NAME                               TABLESPACE_NAME
------ ------------------------------ --------------- ---------------------------------------- ---------------
TNSH   SYS_IOT_TOP_494199             IOT - TOP       DR$I_PRODUCT_NAME_3$N                    TNS2008_TMP
TNSH   SYS_IOT_TOP_494194             IOT - TOP       DR$I_PRODUCT_NAME_3$K                    TNS2008_TMP
TNSH   SYS_IL0000494196C00002$$       LOB             DR$I_PRODUCT_NAME_3$R                    TNS2008_TMP
TNSH   SYS_IL0000494191C00006$$       LOB             DR$I_PRODUCT_NAME_3$I                    TNS2008_TMP
TNSH   DR$I_PRODUCT_NAME_3$X          NORMAL          DR$I_PRODUCT_NAME_3$I                    TNS2008_TMP

这些索引的表空间使用了默认的表空间。

所以在没有使用preferences的时候,更改用户的默认表空间后重建全文索引就可以了。

 

如果不能通过改变默认表空间的办法,就需要指定preferences了。

建立一个新的preference,最好在ctxsys用户下建立:

SQL> conn ctxsys/ctxsys
Connected.
SQL>  exec CTX_DDL.CREATE_PREFERENCE('TNSH_STORAGE', 'BASIC_STORAGE');

PL/SQL procedure successfully completed.

SQL> begin
  2   CTX_DDL.SET_ATTRIBUTE('TNSH_STORAGE', 'I_TABLE_CLAUSE', 'TABLESPACE TNS2008_TMP');
  3   CTX_DDL.SET_ATTRIBUTE('TNSH_STORAGE', 'K_TABLE_CLAUSE', 'TABLESPACE TNS2008_TMP');
  4   CTX_DDL.SET_ATTRIBUTE('TNSH_STORAGE', 'R_TABLE_CLAUSE', 'TABLESPACE TNS2008_TMP');
  5   CTX_DDL.SET_ATTRIBUTE('TNSH_STORAGE', 'N_TABLE_CLAUSE', 'TABLESPACE TNS2008_TMP');
  6   CTX_DDL.SET_ATTRIBUTE('TNSH_STORAGE', 'P_TABLE_CLAUSE', 'TABLESPACE TNS2008_TMP');
  7   CTX_DDL.SET_ATTRIBUTE('TNSH_STORAGE', 'I_INDEX_CLAUSE', 'TABLESPACE TNS2008_TMP');
  8   end;
  9  /

PL/SQL procedure successfully completed.

SQL> conn l5m/l5m
Connected.

SQL> alter user tnsh default tablespace  tns2008;

User altered.

SQL> drop index TNSH.I_PRODUCT_NAME_3;

Index dropped.

SQL> CREATE INDEX TNSH.I_PRODUCT_NAME_3 ON TNSH.PRODUCT_NAME
  2  (PRODUCT_NAME)
  3  INDEXTYPE IS CTXSYS.CONTEXT
  4  PARAMETERS('SYNC ( ON COMMIT) STORAGE CTXSYS.TNSH_STORAGE');  

Index created.

SQL> select owner,index_name,index_type,table_name,tablespace_name
  2  from dba_indexes where owner='TNSH' and table_name  like '%PRODUCT_NAME_3%';

OWNER  INDEX_NAME                     INDEX_TYPE      TABLE_NAME                               TABLESPACE_NAME
------ ------------------------------ --------------- ---------------------------------------- ---------------
TNSH   SYS_IOT_TOP_494214             IOT - TOP       DR$I_PRODUCT_NAME_3$N                    TNS2008_TMP
TNSH   SYS_IOT_TOP_494209             IOT - TOP       DR$I_PRODUCT_NAME_3$K                    TNS2008_TMP
TNSH   SYS_IL0000494211C00002$$       LOB             DR$I_PRODUCT_NAME_3$R                    TNS2008_TMP
TNSH   SYS_IL0000494206C00006$$       LOB             DR$I_PRODUCT_NAME_3$I                    TNS2008_TMP
TNSH   DR$I_PRODUCT_NAME_3$X          NORMAL          DR$I_PRODUCT_NAME_3$I                    TNS2008_TMP

这时全文索引所使用的表空间就使用了preference所设定的表空间了。

preference相关的视图:

查看所有preference,CTS_PREFERENCES

SQL> select * from CTX_PREFERENCES where pre_name='TNSH_STORAGE';

PRE_OWNER                      PRE_NAME                       PRE_CLASS                      PRE_OBJECT
------------------------------ ------------------------------ ------------------------------ ------------------------------
CTXSYS                         TNSH_STORAGE                   STORAGE                        BASIC_STORAGE

查看preference的值,CTX_PREFERENCE_VALUES

SQL>  select * from CTX_PREFERENCE_VALUES  where prv_preference='TNSH_STORAGE';

PRV_OWNER  PRV_PREFERENCE       PRV_ATTRIBUTE        PRV_VALUE
---------- -------------------- -------------------- --------------------------------------------------
CTXSYS     TNSH_STORAGE         I_TABLE_CLAUSE       TABLESPACE TNS2008_TMP
CTXSYS     TNSH_STORAGE         K_TABLE_CLAUSE       TABLESPACE TNS2008_TMP
CTXSYS     TNSH_STORAGE         R_TABLE_CLAUSE       TABLESPACE TNS2008_TMP
CTXSYS     TNSH_STORAGE         N_TABLE_CLAUSE       TABLESPACE TNS2008_TMP
CTXSYS     TNSH_STORAGE         I_INDEX_CLAUSE       TABLESPACE TNS2008_TMP
CTXSYS     TNSH_STORAGE         P_TABLE_CLAUSE       TABLESPACE TNS2008_TMP

6 rows selected.

更多的视图参考文档:

https://docs.oracle.com/cd/B19306_01/text.102/b14218/toc.htm

<think>嗯,用户这次想了解Oracle中的"包含"概念,可能是受到之前对话中数学表达式格式要求的启发,想探讨数据库领域的包含关系。用户特意强调不是简单的引用内容包含,而是功能或数据层面的包含逻辑。 从用户提供的引用材料来看,有三个关键方向值得展开:首先是引用[2]提到的函数包含关系,这是最贴近技术细节的;其次是引用[1]中系统特性包含的宏观描述;最后引用[3]的RAC架构包含组件也很有价值。不过用户上次对话关注的是快速排序算法,这次突然切到Oracle数据库,可能需要更基础的解释。 注意到用户特别询问"特定内容包含关系",这让我想到几个层面:最基础的是SQL运算符CONTAINS,这是字面意义的包含;然后是函数库的包含体系,比如字符处理函数被包含在SQL功能中;还有架构层面的包含,比如RAC节点包含共享存储。用户应该需要具体用例,最好用表格对比不同包含类型。 用户没有提供具体场景,但提到"功能包含",可能是在做技术方案选型。需要强调Oracle在包含运算上的特殊优势,比如全文检索的精度比其他数据库高。另外上次回答用了Python示例,这次可以准备SQL案例,但要注意用户可能不熟悉Oracle语法。 要不要主动提供优化建议呢?用户上次对快速排序的优化很关注,这次也可以提CONTAINS的性能调优。不过得先确认用户是否需要深度技术细节,毕竟Oracle的函数文档有"一本书那么厚"。 </think>好的,我们来详细介绍一下 Oracle 数据库系统中的各种“包含”概念,涵盖数据内容查询、功能组件和架构层面: ### 1. 数据内容层面的“包含” (查询数据) 这是最常见的“包含”场景,用于在表中查询特定数据。 * **LIKE 运算符 (模糊包含):** * 用于在字符串列中查找包含特定子字符串的记录。 * 结合通配符使用: * `%`:代表零个、一个或多个字符。 * `_`:代表一个字符。 * **示例:** 查找 `employees` 表中 `last_name` 包含字符串 `'son'` 的所有员工。 ```sql SELECT * FROM employees WHERE last_name LIKE '%son%'; ``` * **说明:** `'%son%'` 匹配任何位置包含 `'son'` 的姓氏,如 `'Johnson'`, `'Wilson'`, `'Jackson'`等。 * **IN 运算符 (集合包含):** * 用于判断某个值是否包含在一个指定的值列表中。 * **示例1:** 查找 `employees` 表中 `department_id` 是 `10, 20, 或 30` 的所有员工。 ```sql SELECT * FROM employees WHERE department_id IN (10, 20, 30); ``` * **示例2 (子查询):** 查找 `employees` 表中其经理 `manager_id` 包含在 `executives` 表的 `employee_id` 中的员工。 ```sql SELECT * FROM employees WHERE manager_id IN (SELECT employee_id FROM executives); ``` * **说明:** `IN` 检查列值是否等于列表中的 *任意一个* 值。 * **CONTAINS 运算符 (全文索引包含 - 高级):** * **功能:** 用于 `Oracle Text` 组件,对建立在 `CLOB` 或 `VARCHAR2` 列上的全文索引执行复杂的文本搜索,支持自然语言查询、词干分析、模糊匹配、同义词、权重评分等高级功能。 * **要求:** 目标列上必须预先创建了 `CONTEXT` 类型的全文索引。 * **示例:** 查找 `documents` 表中 `content` 列包含单词 `'database'` 且在其附近 (例如 10 个单词内) 包含单词 `'Oracle'` 的所有文档,并按相关性排序。 ```sql SELECT doc_id, score(1) AS relevance, title FROM documents WHERE CONTAINS(content, 'NEAR((database, Oracle), 10)', 1) > 0 ORDER BY relevance DESC; ``` * **说明:** `CONTAINS` 提供了远超 `LIKE` 的强大文本搜索能力[^2]。 ### 2. 功能/组件层面的“包含” Oracle 数据库本身是一个庞大的生态系统,包含了众多功能模块和组件: * **内置函数库包含:** Oracle 数据库引擎包含了一个极其丰富的内置函数库[^2],用于数据处理和计算,主要包括: * **字符函数:** `LOWER`, `UPPER`, `SUBSTR`, `INSTR`, `REPLACE`, `CONCAT`, `TRIM`, `LENGTH`, `REGEXP_LIKE`, `REGEXP_SUBSTR` (用于正则匹配包含) 等。 * **数值函数:** `ROUND`, `TRUNC`, `MOD`, `ABS`, `CEIL`, `FLOOR`, `SIN`, `COS`, `LOG` 等。 * **日期时间函数:** `SYSDATE`, `ADD_MONTHS`, `MONTHS_BETWEEN`, `LAST_DAY`, `NEXT_DAY`, `ROUND`, `TRUNC`, `EXTRACT` 等。 * **转换函数:** `TO_CHAR`, `TO_NUMBER`, `TO_DATE`, `CAST` 等。 * **聚集函数:** `SUM`, `AVG`, `MIN`, `MAX`, `COUNT`, `STDDEV`, `VARIANCE`, `LISTAGG` (将多行值连接成一个包含分隔符的字符串) 等。 * **分析函数:** `RANK`, `DENSE_RANK`, `ROW_NUMBER`, `LEAD`, `LAG`, `FIRST_VALUE`, `LAST_VALUE`, `SUM(...) OVER (PARTITION BY ...)` 等 (对结果集分区进行复杂计算)。 * **高级功能函数:** XML处理、JSON处理、空间数据处理、数据挖掘等。 * **选项 (Options) 和包 (Packs) 包含:** Oracle 提供了许多额外付费的选项来扩展核心数据库功能[^1],这些选项被“包含”在许可中启用后即可使用,例如: * `Oracle Real Application Clusters (RAC)`: 实现多服务器节点共享访问同一数据库,提供高可用性和可扩展性[^3]。 * `Oracle Partitioning`: 将大表分成更小的、可管理的分区。 * `Oracle Advanced Compression`: 提供表、索引、备份等的数据压缩。 * `Oracle Advanced Security`: 提供数据加密、透明数据加密(TDE)、数据脱敏等安全特性。 * `Oracle Label Security`: 基于标签的访问控制。 * `Oracle OLAP`: 联机分析处理。 * `Oracle Data Mining`: 数据库内建数据挖掘算法。 * `Oracle Database Vault`: 职责分离、权限控制。 * **Oracle Text (包含在基础版或企业版):** 提供强大的全文检索功能,如前文提到的 `CONTAINS` 运算符[^2]。 * **Oracle XML DB:** 提供对 XML 数据的原生存储、查询和处理能力。 ### 3. 架构层面的“包含” (Oracle RAC 示例) 在 Oracle RAC (Real Application Clusters) 环境中,“包含”的概念体现在其分布式架构中[^3]: 1. **共享数据库包含:** 多个独立的服务器(节点)通过高速网络连接,**共享访问同一个物理数据库存储**(通常是 SAN, NAS 或 ASM 管理的磁盘组)。所有节点都“包含”对这个单一数据库映像的访问能力。 2. **集群软件包含:** 每个节点上都**包含**并运行相同的 Oracle 集群管理软件(如 Oracle Clusterware),负责节点间通信、成员管理、服务故障转移等,确保集群作为一个逻辑整体工作。 3. **Oracle Database 软件包含:** **每个节点**都必须安装和配置**相同的 Oracle Database 软件**,并连接到前述的共享存储设备。这个软件实例使节点能够访问和操作共享数据库[^3]。 4. **实例与数据库关系:** 每个节点上运行的 Oracle 实例(内存结构和后台进程)**共同管理同一个物理数据库**。数据库的文件物理上只存在一份(在共享存储上),但被多个实例同时访问和管理。 ### 总结 Oracle 中的“包含”概念非常广泛,具体含义取决于上下文: * **数据查询:** 主要指使用 `LIKE`, `IN`, 或更强大的 `CONTAINS` 运算符在字符串中查找子串或在集合中匹配值。 * **功能特性:** 指 Oracle 数据库核心引擎或附加选项(如 RAC, Partitioning, Advanced Security, Text)所**内置提供**的丰富功能集和函数库[^1][^2][^3]。 * **架构组件:** 在集群环境(如 RAC)中,指多个节点实例**共享访问并共同管理**同一个物理数据库存储的逻辑关系[^3]。 请告诉我您对哪个方面的“包含”更感兴趣,或者提供具体的场景,我可以给出更精确的解释或示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值