MOVE相关知识
2015-09-09 21:54
357 查看
一、移动普通表和索引
索引生效
move 表之后,索引失效了
move 表后,索引的位置还是没变
move索引,则使用rebuild语法:
二:move分区表及索引和普通表一样,索引会失效,区别的仅仅是语法而已。
分区基本语法:特别提醒注意,如果是单级分区,则使用关键字PARTITION,如果是多级分区,则使用SUBPARTITION替代PARTITION。
如果分区或分区索引比较大,可以使用并行move或rebuild,PARALLEL (DEGREE 2);如:
ALTER TABLE PART_ALARMTEXTDATA move SUBPARTITION ALARMTEXTDATA_050910_ATD01 TABLESPACE users PARALLEL (DEGREE 2);
ALTER INDEX GLOBAL_ALARMTEXTDATA REBUILD tablespace users PARALLEL (DEGREE 2);
ALTER INDEX LOCAL_ALARMTEXTDATA REBUILD SUBPARTITION ALARMTEXTDATA_050910_ATD01 TABLESPACE users PARALLEL (DEGREE 2);
三 、移动 LONG/ CLOB类型
II:LOB类型在建立含有lob字段的表时,oracle会自动为lob字段建立两个单独的segment,一个用来存放数据(segment_type=LOBSEGMENT),另一个用来存放索引(segment_type=LOBINDEX)。默认它们会存储在和表一起的表空间。我们对表MOVE时,LOG类型字段和该字段的索引不会跟着MOVE,必须要单独来进行MOVE,语法如下如:
alter table t321 move tablespace users;
select 'alter table '||t.table_name || ' move tablespace tabespace_name
lob('||t.columm_name||') store as (tablespace tablespace_name);' from user_lobs t
SQL> create table test as select * from dba_objects;
SQL> ALTER TABLE TEST ADD CONSTRAInt idx_id primary key (object_id); Table altered. SQL> select INDEX_NAME from dba_indexes where TABLE_NAME='TEST'; INDEX_NAME ------------------------------------------------------------ IDX_ID SQL> SQL> set autot explain Usage: SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]] SQL> set autot on explain SQL> select object_name from test where object_id=1000; OBJECT_NAME -------------------------------------------------------------------------------- EXPACT$ Execution Plan ---------------------------------------------------------- Plan hash value: 1754687132 -------------------------------------------------------------------------------- ------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------- ------ | 0 | SELECT STATEMENT | | 1 | 79 | 2 (0)| 00:0 0:01 | | 1 | TABLE ACCESS BY INDEX ROWID| TEST | 1 | 79 | 2 (0)| 00:0 0:01 | |* 2 | INDEX UNIQUE SCAN | IDX_ID | 1 | | 1 (0)| 00:0 0:01 | -------------------------------------------------------------------------------- ------ Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("OBJECT_ID"=1000) SQL>
索引生效
SQL> alter table test move tablespace users; Table altered. SQL> SQL> select object_name from test where object_id=1000; OBJECT_NAME -------------------------------------------------------------------------------- EXPACT$ Execution Plan ---------------------------------------------------------- Plan hash value: 1357081020 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 864 | 68256 | 289 (1)| 00:00:04 | |* 1 | TABLE ACCESS FULL| TEST | 864 | 68256 | 289 (1)| 00:00:04 | -------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("OBJECT_ID"=1000)
SQL> select INDEX_NAME,STATUS from dba_indexes where table_name='TEST'; INDEX_NAME STATUS ------------------------------------------------------------ ---------------- IDX_ID UNUSABLE
move 表之后,索引失效了
SQL> select SEGMENT_NAME,TABLESPACE_NAME from dba_segments where SEGMENT_NAME='IDX_ID'; SEGMENT_NAME -------------------------------------------------------------------------------- TABLESPACE_NAME ------------------------------------------------------------ IDX_ID SYSTEM
move 表后,索引的位置还是没变
move索引,则使用rebuild语法:
SQL> alter index idx_id rebuild tablespace users; Index altered. SQL> select INDEX_NAME,STATUS from dba_indexes where table_name='TEST'; INDEX_NAME STATUS ------------------------------------------------------------ ---------------- IDX_ID VALID
二:move分区表及索引和普通表一样,索引会失效,区别的仅仅是语法而已。
分区基本语法:特别提醒注意,如果是单级分区,则使用关键字PARTITION,如果是多级分区,则使用SUBPARTITION替代PARTITION。
如果分区或分区索引比较大,可以使用并行move或rebuild,PARALLEL (DEGREE 2);如:
ALTER TABLE PART_ALARMTEXTDATA move SUBPARTITION ALARMTEXTDATA_050910_ATD01 TABLESPACE users PARALLEL (DEGREE 2);
ALTER INDEX GLOBAL_ALARMTEXTDATA REBUILD tablespace users PARALLEL (DEGREE 2);
ALTER INDEX LOCAL_ALARMTEXTDATA REBUILD SUBPARTITION ALARMTEXTDATA_050910_ATD01 TABLESPACE users PARALLEL (DEGREE 2);
三 、移动 LONG/ CLOB类型
SQL> create table test1 (id int,en long); Table created. SQL> insert into test1(id,en) select * from test1; insert into test1(id,en) select * from test1 * ERROR at line 1: ORA-00997: illegal use of LONG datatype
对有LONG类型字段的表的转移,可以使用: create新表的方法。 * create一个新的表,存储在需要转移的表空间。 * 创建新的索引(使用tablespace 子句指定新的表空间)。 * 把数据转移过来 方法一:用COPY的方法: 1 copy from bigboar/bigboar@bigboar_sid insert t123(id,en) using select id,en from t123; 方法二:PL/SQL(如上) 方法三:直接就把LONG转换成CLOB类型 1 2 create table t321(id int,en clob) tablespace users; insert into t321(id,en) select id,to_lob(en) from t123; 方法四:exp/imp 1 2 exp bigboar/bigboar file=a.dat tables=t123 imp bigboar/bigboar file=a.dat full=y IGNORE =y * drop掉旧表。 * rename 新表为旧表表名。
II:LOB类型在建立含有lob字段的表时,oracle会自动为lob字段建立两个单独的segment,一个用来存放数据(segment_type=LOBSEGMENT),另一个用来存放索引(segment_type=LOBINDEX)。默认它们会存储在和表一起的表空间。我们对表MOVE时,LOG类型字段和该字段的索引不会跟着MOVE,必须要单独来进行MOVE,语法如下如:
alter table t321 move tablespace users;
select 'alter table '||t.table_name || ' move tablespace tabespace_name
lob('||t.columm_name||') store as (tablespace tablespace_name);' from user_lobs t
相关文章推荐
- 好东西要分享一下
- JavaScript随笔(二):函数只是一种对象
- C++用法的学习心得
- 改进一致性hash算法
- android获取设备屏幕大小的方法
- Android NDK 开发入门例子
- k链表翻转
- MySQL字符串函数、日期时间函数
- MySQL字符串函数、日期时间函数
- C#面向对象的三大特征
- 多线程实现多客户端同时登陆
- mysql_proxy实现读写分离
- stm32的推挽输出与开漏输出
- 腾讯2016编程笔试题
- hdu 1085 Holding Bin-Laden Captive!(Java)
- HDU 4968 等级估计 暴力枚举技巧的使用
- String to Integer (atoi)
- 【leetcode】Single Number III --C++
- BZOJ 1257 余数之和sum(分块优化)
- 设计模式笔记