----------在临时表上创建全文索引,这样就可以直接把表数据和索引数据同时交换到原表中,就不需要再在原表中创建索引---------
SQL> create index jack_temp_ind on jack_temp(name) indextype is ctxsys.context;
Index created.
SQL> select segment_name,bytes from user_segments where segment_type='TABLE' and segment_name like 'DR%' order by 1;
SEGMENT_NAME BYTES
------------------------------ ----------
DR#JACK_TEST_IND0001$I 65536
DR#JACK_TEST_IND0001$R 65536
DR#JACK_TEST_IND0002$I 65536
DR#JACK_TEST_IND0002$R 65536
DR#JACK_TEST_IND0003$I 65536
DR#JACK_TEST_IND0003$R 65536
DR$JACK_TEMP_IND$I 131072 -------从全文索引基表大小上可以看出临时表上的全文索引的基表里面有数据
DR$JACK_TEMP_IND$R 65536
8 rows selected.
-----------查看索引和表的对应关系--------------------------------
SQL> select index_name,table_name from user_indexes where table_name in('JACK_TEMP','JACK_TEST');
INDEX_NAME TABLE_NAME
------------------------------ ------------------------------
JACK_TEST_IND JACK_TEST
JACK_TEMP_IND JACK_TEMP
七、通过分区交换方式,将临时表中的数据和索引交换入原表
-------------开始进行数据交换----------------------------------------
SQL> alter table jack_test exchange partition p2011 with table jack_temp including indexes without validation;
Table altered.
---上面的语句是将jack_test表的分区p2011和jack_temp临时表进行数据交换,交换的数据同时包含索引信息。
---without validation的意思是,不对表中的数据是否和分区对应进行验证,因为验证工作是需要额外开销的。
---------查看交换后表的信息----------------
SQL> select count(*) from jack_temp;
COUNT(*)
----------
0
SQL> select count(*) from jack_test partition(p2011);
COUNT(*)
----------
27378
SQL> select segment_name,bytes from user_segments where segment_type='TABLE' and segment_name like 'DR%' order by 1;
SEGMENT_NAME BYTES
------------------------------ ----------
DR#JACK_TEST_IND0001$I 131072
DR#JACK_TEST_IND0001$R 65536
DR#JACK_TEST_IND0002$I 65536
DR#JACK_TEST_IND0002$R 65536
DR#JACK_TEST_IND0003$I 65536
DR#JACK_TEST_IND0003$R 65536
DR$JACK_TEMP_IND$I 65536
DR$JACK_TEMP_IND$R 65536
8 rows selected.