您的位置:首页 > 其它

MOVE相关知识

2015-09-09 21:54 357 查看
一、移动普通表和索引

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: