分区表的分区键和分区类型都可以通过获取创建该分区表的DDL定义语句来了解,那么可不可以直接查询字典视图来获取这些信息呢?常用的dba_tab_partitions视图并没有包含我们想要的分区属性信息;这里我们可以用到dba_part_key_columns(describes the partitioning key columns for all partitioned objects in the database. Its columns are the same as those in
ALL_PART_KEY_COLUMNS)和
dba_part_tables(displays the object-level partitioning information for all partitioned tables in the database. Its columns are the same as those in
ALL_PART_TABLES
)这2个视图:
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
CORE 11.2.0.2.0 Production
TNS for Linux: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production
SQL> desc dba_part_tables;
Name Null? Type
----------------------------------------- -------- ----------------------------
OWNER VARCHAR2(30)
TABLE_NAME VARCHAR2(30)
PARTITIONING_TYPE VARCHAR2(9)
SUBPARTITIONING_TYPE VARCHAR2(9)
PARTITION_COUNT NUMBER
DEF_SUBPARTITION_COUNT NUMBER
PARTITIONING_KEY_COUNT NUMBER
SUBPARTITIONING_KEY_COUNT NUMBER
STATUS VARCHAR2(8)
DEF_TABLESPACE_NAME VARCHAR2(30)
DEF_PCT_FREE NUMBER
DEF_PCT_USED NUMBER
DEF_INI_TRANS NUMBER
DEF_MAX_TRANS NUMBER
DEF_INITIAL_EXTENT VARCHAR2(40)
DEF_NEXT_EXTENT VARCHAR2(40)
DEF_MIN_EXTENTS VARCHAR2(40)
DEF_MAX_EXTENTS VARCHAR2(40)
DEF_MAX_SIZE VARCHAR2(40)
DEF_PCT_INCREASE VARCHAR2(40)
DEF_FREELISTS NUMBER
DEF_FREELIST_GROUPS NUMBER
DEF_LOGGING VARCHAR2(7)
DEF_COMPRESSION VARCHAR2(8)
DEF_COMPRESS_FOR VARCHAR2(12)
DEF_BUFFER_POOL VARCHAR2(7)
DEF_FLASH_CACHE VARCHAR2(7)
DEF_CELL_FLASH_CACHE VARCHAR2(7)
REF_PTN_CONSTRAINT_NAME VARCHAR2(30)
INTERVAL VARCHAR2(1000)
IS_NESTED VARCHAR2(3)
DEF_SEGMENT_CREATION VARCHAR2(4)
SQL> desc dba_part_key_columns;
Name Null? Type
----------------------------------------- -------- ----------------------------
OWNER VARCHAR2(30)
NAME VARCHAR2(30)
OBJECT_TYPE CHAR(5)
COLUMN_NAME VARCHAR2(4000)
COLUMN_POSITION NUMBER
SQL> col table_name for a20
SQL> col column_name for a20
SQL> col partition for a20
SQL> select t.table_name, kc.column_name, t.partitioning_type
2 from dba_part_key_columns kc, dba_part_tables t
3 where kc.owner = t.owner
4 and kc.name = t.table_name
5 and t.table_name='COSTS';
TABLE_NAME COLUMN_NAME PARTITION
-------------------- -------------------- ---------
COSTS TIME_ID RANGE
/* 针对存在子分区的表,需要用到dba_subpart_key_columns视图 */
SQL> select t.table_name, kc.column_name, t.partitioning_type
2 from dba_part_key_columns kc, dba_part_tables t
3 where kc.owner = t.owner
4 and kc.name = t.table_name
5 and t.table_name='PRODUCTS'
6 union all
7 select u.table_name,skc.column_name,u.subpartitioning_type
8 from dba_subpart_key_columns skc,dba_part_tables u
9 where skc.owner=u.owner
10 and skc.name=u.table_name
11 and u.subpartitioning_type!='NONE'
12 and u.table_name='PRODUCTS';
TABLE_NAME COLUMN_NAME PARTITION
-------------------- -------------------- ---------
PRODUCTS T1 RANGE
PRODUCTS T2 HASH
Script:
select t.table_name, kc.column_name, t.partitioning_type
from dba_part_key_columns kc, dba_part_tables t
where kc.owner = t.owner
and kc.name = t.table_name
and t.table_name = '&TABNAME'
and t.owner = '&OWNAME'
union all
select u.table_name, skc.column_name, u.subpartitioning_type
from dba_subpart_key_columns skc, dba_part_tables u
where skc.owner = u.owner
and skc.name = u.table_name
and u.subpartitioning_type != 'NONE'
and u.table_name = '&TABNAME'
and u.owner = '&OWNAME';