暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 在全局临时表 (GTT) 上创建的索引 (SYS_IL000012340034 $ $) 使用系统表空间,索引类型 = LOB

askTom 2017-05-03
1270

问题描述

1.我们可以在LOB列的GTT (全局临时表) 上创建唯一索引吗?我们可以看到这些索引正在使用系统表空间。

SQL> 从dba_index_index_name,INDEX_TYPE,table_owner,table_name,TABLESPACE_NAME,临时,其中index_name = '& INAME';
输入1的值: SYS_IL000 $ $
旧1: 从dba_index_index_name,INDEX_TYPE,table_owner,table_name,TABLESPACE_NAME,临时,其中index_name = '& INAME'
新1: 从dba_index_name中选择所有者,index_name,INDEX_TYPE,table_owner,table_name,TABLESPACE_NAME,临时,其中index_name = 'sys_il000 $ $'

所有者索引 _ 名称索引 _ 类型表 _ 所有者表 _ 名称表空间 _ 名称临时
-
风险系统 _ il000 $ $ LOB风险阶段abletext系统


SQL> 从dba_tables中选择所有者,TABLE_NAME,TABLESPACE_NAME,临时,其中TABLE_NAME = '& TNAME';
输入1的值: 阶段摘要文本
旧1: 从dba_tables中选择所有者,TABLE_NAME,TABLESPACE_NAME,临时,其中TABLE_NAME = '& TNAME'
新1: 从dba_tables中选择所有者、表名、临时表名,其中表名 = 'STAGETABLETEXT'

所有者表名称表空间名称临时
-
风险阶段abletext Y

SQL> 从dba_objects中选择所有者、对象名称、对象类型、临时对象,其中对象名称 = '& 名称';
输入名称的值: 阶段 _ teradata _ tabletext
旧1: 从dba_objects中选择所有者、对象名称、对象类型、临时对象,其中对象名称 = '& 名称'
新1: 从dba_objects中选择所有者、对象名称、对象类型、临时对象,其中对象名称 = 'STAGETABLETEXT'

所有者对象 _ 名称对象 _ 类型临时
-
风险阶段表Y
文本



2.如何查找在哪些列上创建索引?使用下面的代码,无法获得完整的代码。

SQL> 设置长90000000
SQL> 从对偶中选择dbms_metaada.get_ddl ('INDEX','sys_il000 $ $ ','RISK');

Dbms_metaada.get_ddl ('索引','系统 _ il000 $ $','风险')
-

在 “风险” 上创建唯一的索引 “RISK”。“SYS_IL000 $ $”。“STAGETABLETEXT” (


3.当我尝试通过创建GTT和唯一索引来复制时,我遇到了错误。

SQL> 在STAGETABLETEXT (REQ) 上创建唯一索引indxtest;
在STAGETABLETEXT (REQ) 上创建唯一索引indxtest
*
第1行的错误:
ORA-02327: 无法在带有数据类型LOB的表达式上创建索引

Oracle documentation中的注释: 请注意,LOB列仅支持域和基于函数的索引。Lob不支持其他类型的索引,例如唯一索引。

https://docs.oracle.com/cd/B28359_01/appdev.111/b28393/adlob_tables.htm#i1014821


专家解答

1) 任何东西都不应进入系统表空间。

执行此操作:

从dba_users中选择用户名,default_tablespace;

如果有人有系统,那么就相应地改变它们。


2) 您不能在LOB上具有唯一索引,但是可以采用LOB内容的哈希值并在其上具有唯一索引。

SQL> create table t ( c clob, hashval raw(255) generated always as ( cast(dbms_crypto.hash(c,4) as raw(255) ))  );

Table created.

SQL>
SQL> alter table t add constraint UQ unique ( hashval );

Table altered.

SQL>
SQL> insert into t (c) values ('Hello There Connor');

1 row created.

SQL> insert into t (c) values ('Hello There Chris');

1 row created.

SQL> insert into t (c) values ('Hello There Maria');

1 row created.

SQL> insert into t (c) values ('Hello There Connor');
insert into t (c) values ('Hello There Connor')
*
ERROR at line 1:
ORA-00001: unique constraint (MCDONAC.UQ) violated


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论