测试数据库版本: 19.27


1. 创建测试表my_part_tab

create table my_part_tab(
id number,
name varchar2(40),
birthday date)
PARTITION BY RANGE ("BIRTHDAY") INTERVAL (NUMTODSINTERVAL(1,'DAY'))
(PARTITION "P01" VALUES LESS THAN (TO_DATE('2025-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')));


2.插入数据,自动创建分区

set serverout on
declare
x number:=1;
begin
loop
--dbms_output.put_line(x);
insert into my_part_tab values (x, dbms_random.string('u',8), sysdate+x/14400);
x:=x+1;
exit when x>100000;
end loop;
commit;
end;
/


3.查看表分区

SQL> select table_name,partition_name,tablespace_name from user_tab_partitions where table_name='MY_PART_TAB';

TABLE_NAME           PARTITION_NAME       TABLESPACE_NAME
-------------------- -------------------- ------------------------------
MY_PART_TAB          P01                  USERS
MY_PART_TAB          SYS_P5289            USERS
MY_PART_TAB          SYS_P5290            USERS
MY_PART_TAB          SYS_P5291            USERS
MY_PART_TAB          SYS_P5292            USERS
MY_PART_TAB          SYS_P5293            USERS
MY_PART_TAB          SYS_P5294            USERS
MY_PART_TAB          SYS_P5295            USERS
MY_PART_TAB          SYS_P5296            USERS


4.创建全局所以,查看所以状态

SQL> create unique index pk_idx_id on my_part_tab(id);

Table altered.

SQL> alter table my_part_tab add primary key(id) using index pk_idx_id;

Table altered.

SQL> select owner, index_name, status, orphaned_entries from dba_indexes where table_name = 'MY_PART_TAB';

OWNER                INDEX_NAME           STATUS   ORP
-------------------- -------------------- -------- ---
SCOTT                PK_IDX_ID            VALID    NO


5. truncate 分区,再次查看全局索引状态

SQL> alter table my_part_tab truncate partition SYS_P5296 update global indexes;

Table truncated.


SQL> select owner, index_name, status, orphaned_entries from dba_indexes where table_name = 'MY_PART_TAB';

OWNER                INDEX_NAME           STATUS   ORP
-------------------- -------------------- -------- ---
SCOTT                PK_IDX_ID            VALID    YES


6.清理孤立索引

SQL> EXEC DBMS_PART.CLEANUP_GIDX(SCHEMA_NAME_IN=>'SCOTT', TABLE_NAME_IN=>'MY_PART_TAB');

PL/SQL procedure successfully completed.

SQL> select owner, index_name, status, orphaned_entries from dba_indexes where table_name = 'MY_PART_TAB';

OWNER                INDEX_NAME           STATUS   ORP
-------------------- -------------------- -------- ---
SCOTT                PK_IDX_ID            VALID    NO


或者:

SQL> ALTER INDEX PK_IDX_ID COALESCE CLEANUP;

Index altered.

SQL> select owner, index_name, status, orphaned_entries from dba_indexes where table_name = 'MY_PART_TAB';

OWNER                INDEX_NAME           STATUS   ORP
-------------------- -------------------- -------- ---
SCOTT                PK_IDX_ID            VALID    NO

 


使用隐含参数"_fast_index_maintenance"关闭异步全局索引维护特性, 再次truncate分区, 不再产生孤立索引

SQL> alter session set "_fast_index_maintenance" = false;

Session altered.

SQL> alter table my_part_tab truncate partition SYS_P5295 update global indexes;

Table truncated.

SQL> select owner, index_name, status, orphaned_entries from dba_indexes where table_name = 'MY_PART_TAB';

OWNER                INDEX_NAME           STATUS   ORP
-------------------- -------------------- -------- ---
SCOTT                PK_IDX_ID            VALID    NO

 

 

posted on 2025-05-23 10:19  颩~  阅读(32)  评论(0)    收藏  举报