为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:03134284058-20230726-197096-20046
【操作系统】:centos7
【CPU】:intel
【问题描述】*:
问题背景如下:
全局本地索引的命名规则为:INDEX+全局本地索引 ID_全局索引ID ,索引数据存储在全局索引上 ; 子表局部索引的命名规则为:INDEX+子表局部索引 ID_局部索引ID ,索引数据存储在子表局部索引上。下面创建一个测试表:
drop table if exists "SYSDBA"."T_PART1";
CREATE TABLE "SYSDBA"."T_PART1"
(
"ID" BIGINT,
"DATES" TIMESTAMP(6),
"NBR" DEC)
PARTITION BY RANGE("DATES")
(
PARTITION "T_PART1_202310" VALUES LESS THAN(DATETIME'2023-10-21 00:00:00') STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION "T_PART1_202311" VALUES LESS THAN(DATETIME'2023-11-21 00:00:00') STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION "T_PART1_202312" VALUES LESS THAN(DATETIME'2023-12-21 00:00:00') STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION "T_PART1_202401" VALUES LESS THAN(DATETIME'2024-01-21 00:00:00') STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION "T_PART1_202402" VALUES LESS THAN(DATETIME'2024-02-21 00:00:00') STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION "P_MAX" VALUES LESS THAN(MAXVALUE) STORAGE(ON "MAIN", CLUSTERBTR)
) STORAGE(ON "MAIN", CLUSTERBTR) ;
DROP INDEX if exists SYSDBA.idx_t_part1_id_sysdba;
DROP INDEX if exists SYSDBA.idx_t_part1_nbr_sysdba;
CREATE INDEX SYSDBA.idx_t_part1_id_sysdba ON sysdba.t_part1(id) global;
CREATE INDEX SYSDBA.idx_t_part1_nbr_sysdba ON sysdba.t_part1(nbr) ;
DBMS_STATS.GATHER_SCHEMA_STATS('SYSDBA',0.0001,TRUE,'FOR ALL COLUMNS SIZE AUTO');
收集统计信息之后,需要查出哪些索引未被收集。由于全局本地索引和子表局部索引不支持用dbms方式收集统计信息的(可以用stat语句或者存储过程收集),因此如下语句查出来会有全局本地索引和子表局部索引的信息:
select owner,index_name,index_type,table_owner,table_name,last_analyzed,status from dba_indexes
where index_type not in('DOMAIN','CLUSTER','BITMAP','VIRTUAL')
and status='VALID'
and owner in('SYSDBA')
and ( last_analyzed< sysdate-100 or last_analyzed is null);
问题如下:
查dba_indexes或者联合其他视图 ,如何在过滤条件中排除全局本地索引和子表局部索引的信息?
这样可以排开分区表及其子表的索引;
select a.owner,a.index_name,a.index_type,a.table_owner,a.table_name,a.last_analyzed,a.status from dba_indexes a
left JOIN
dba_tables b
on a.table_name=b.table_name
where a.index_type not in('DOMAIN','CLUSTER','BITMAP','VIRTUAL')
and a.status='VALID'
and a.owner in('SYSDBA')
and ( a.last_analyzed< sysdate-5 or a.last_analyzed is null)
and b.PARTITIONED='NO';
过滤视图SYSOBJECTS里面的INFO4字段不为空的试试看呢