oracle_分区表的索引类型以及是否带分区键索引的区别
(2015-04-08 23:24:02)
标签:
partitionindexprefixkeyit |
分类: oracleops |
One.
介绍一下分区表的索引类型,以及简述各个类型的适用场景。
Two.
验证一下组合分区索引带不带分区键的区别,用数据来说话。
1.
本地索引和全局索引
2.
验证带分区键本地分区索引的区别。
SQL> SELECT * FROM
v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition
Release 11.2.0.3.0 - 64bit Production
SQL>
create table parttest(
) partition by list(owner)
(
)
/
DROP TABLE parttest;
insert into parttest select
owner,object_id,object_name,created from DBA_OBJECTS;
commit;
--索引不包含分区键
create index idx_nopartkey on
parttest(created) local nologging;
-- 索引包含分区键
create index idx_partkey on
parttest(created,owner) local nologging;
create index idx_partkey2 on
parttest(object_NAME,owner) local nologging;
create index idx_partkey3 on
parttest(owner,object_NAME) local nologging;
create index idx_nopartkey2 on
parttest(object_NAME) local nologging;
--收集统计信息
SQL> exec
dbms_stats.gather_table_stats('SUN','PARTTEST',cascade=>true,no_invalidate=>false,method_opt=>'for
all columns size
1',estimate_percent=>dbms_stats.auto_sample_size,degree=>24)
;
PL/SQL procedure successfully completed.
分析过程分如下几个方面
1.用带分区键值的索引进行查询,但在where条件中不加分区条件
2.用带分区键值的索引进行查询,但在where条件中加分区条件
3.用不带分区键值的索引进行查询,但在where条件中不加分区条件
4.用不带分区键值的索引进行查询,但在where条件中加分区条
5.用带分区键值的索引进行查询,但在where条件中加分区条(与4的索引键相同,只是带索引键值)
6.用带分区键值的索引进行查询,但在where条件中加分区条(与4的索引键相同,只是带前导索引键值)
7.用带分区键值的索引进行跨分区查询,但在where条件中加分区条件(与4的索引键相同,只是带索引前导键值)
8.用带分区键值的索引进行跨分区查询,但在where条件中加分区条(与4的索引键相同,只是带后导索引键值)
9.用带分区键值的索引进行跨分区查询,但在where条件中加分区条件(与4的索引键相同,只是带索引键值)
第一种情况:用带分区键值的索引进行查询,但是where条件中不加分区条件
set autotrace traceonly
SELECT object_name FROM parttest WHERE object_name LIKE
'OR%';
Execution Plan
----------------------------------------------------------
Plan hash value: 3693814982
---------------------------------------------------------------------------------------------------
| Id | Operation
| Name
| Rows |
Bytes | Cost (%CPU)| Time |
Pstart| Pstop |
---------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT |
| 3 |
57 |
12 (0)| 00:00:01 |
|
|
| 1 | PARTITION LIST ALL|
| 3 |
57 |
12 (0)| 00:00:01 |
1 |
11 |
|* 2 | INDEX RANGE SCAN |
IDX_PARTKEY2 | 3 |
57 |
12 (0)| 00:00:01 |
1 |
11 |
---------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
Statistics
----------------------------------------------------------
第二种情况:用带分区键值的索引进行查询,但是where条件中加分区条件
set autotrace traceonly
SELECT object_name FROM parttest WHERE object_name LIKE 'OR%'
AND owner='SYS';
Execution Plan
----------------------------------------------------------
Plan hash value: 2753556796
------------------------------------------------------------------------------------------------------
| Id | Operation
| Name
| Rows
| Bytes | Cost (%CPU)| Time
| Pstart| Pstop |
------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
|
|
2 |
46 | 2
(0)| 00:00:01 |
|
|
| 1 | PARTITION LIST
SINGLE|
| 2 |
46 |
2 (0)| 00:00:01 |
KEY | KEY |
|* 2 | INDEX RANGE SCAN
| IDX_PARTKEY2 |
2 |
46 | 2
(0)| 00:00:01 |
1 | 1
|
------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
Statistics
----------------------------------------------------------
第三种情况:用不带分区键值的索引进行查询,但是where条件中不加分区条件
set autotrace traceonly
SELECT object_name FROM parttest WHERE
created=to_date('2014-12-15 22:29:22','YYYY-MM-DD
HH24:MI:SS');
Execution Plan
----------------------------------------------------------
Plan hash value: 646636157
--------------------------------------------------------------------------------------------------------------------
| Id | Operation
| Name
| Rows |
Bytes | Cost (%CPU)| Time |
Pstart| Pstop |
--------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
|
|
35 | 945 |
13 (0)|
00:00:01 |
| |
| 1 | PARTITION LIST ALL
|
|
35 | 945 |
13 (0)|
00:00:01 | 1 |
11 |
| 2 | TABLE ACCESS BY
LOCAL INDEX ROWID| PARTTEST
| 35 |
945 | 13
(0)| 00:00:01 |
1 | 11
|
|* 3 |
INDEX RANGE SCAN
| IDX_NOPARTKEY |
35 |
| 12
(0)| 00:00:01 |
1 | 11
|
--------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
Statistics
----------------------------------------------------------
第四种情况:用不带分区键值的索引进行查询,但是where条件中加分区条件
set autotrace traceonly
SELECT object_name FROM parttest a WHERE
created=to_date('2014-12-15 22:29:22','YYYY-MM-DD
HH24:MI:SS') AND owner='SYS';
Execution Plan
----------------------------------------------------------
Plan hash value: 3242664717
--------------------------------------------------------------------------------------------------------------------
| Id | Operation
| Name
| Rows |
Bytes | Cost (%CPU)| Time |
Pstart| Pstop |
--------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
|
|
28 | 868 |
2 (0)|
00:00:01 |
| |
| 1 | PARTITION LIST
SINGLE
|
| 28 |
868 | 2
(0)| 00:00:01 | KEY |
KEY |
| 2 | TABLE ACCESS BY
LOCAL INDEX ROWID| PARTTEST
| 28 |
868 | 2
(0)| 00:00:01 |
1 | 1
|
|* 3 |
INDEX RANGE SCAN
| IDX_NOPARTKEY |
28 |
| 1
(0)| 00:00:01 |
1 | 1
|
--------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
Statistics
----------------------------------------------------------
第五种情况:用带分区键值的索引进行查询,但在where条件中加分区条(与4的索引键相同,只是带索引键值)
SELECT object_name FROM parttest a WHERE
created=to_date('2014-12-15 22:29:22','YYYY-MM-DD
HH24:MI:SS') AND owner='SYS';
Execution Plan
----------------------------------------------------------
Plan hash value: 1150146376
------------------------------------------------------------------------------------------------------------------
| Id | Operation
| Name
| Rows | Bytes | Cost (%CPU)|
Time | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
|
|
28 | 868 |
2 (0)| 00:00:01 |
|
|
| 1 | PARTITION LIST
SINGLE
|
|
28 | 868 |
2 (0)|
00:00:01 | KEY | KEY |
| 2 | TABLE ACCESS BY
LOCAL INDEX ROWID| PARTTEST |
28 | 868 |
2 (0)|
00:00:01 | 1 |
1 |
|* 3 |
INDEX RANGE SCAN
| IDX_PARTKEY |
17 |
| 1
(0)| 00:00:01 |
1 | 1
|
------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
Statistics
----------------------------------------------------------
第六种情况:用带分区键值的索引进行查询,但在where条件中加分区条(与4的索引键相同,只是带前导索引键值)
set autotrace traceonly
SELECT object_name FROM parttest a WHERE
created=to_date('2014-12-15 22:29:22','YYYY-MM-DD
HH24:MI:SS') AND owner='SYS';
Execution Plan
----------------------------------------------------------
Plan hash value: 1150146376
------------------------------------------------------------------------------------------------------------------
| Id | Operation
| Name
| Rows | Bytes | Cost (%CPU)|
Time | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
|
|
28 | 868 |
2 (0)| 00:00:01 |
|
|
| 1 | PARTITION LIST
SINGLE
|
|
28 | 868 |
2 (0)|
00:00:01 | KEY | KEY |
| 2 | TABLE ACCESS BY
LOCAL INDEX ROWID| PARTTEST |
28 | 868 |
2 (0)|
00:00:01 | 1 |
1 |
|* 3 |
INDEX RANGE SCAN
| IDX_PARTKEY |
17 |
| 1
(0)| 00:00:01 |
1 | 1
|
------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
Statistics
----------------------------------------------------------
第七种情况:用带分区键值的索引进行跨分区查询,但在where条件中加分区条件(与4的索引键相同,只是带索引前导键值)
set autotrace traceonly
SELECT object_name FROM parttest a WHERE
object_name LIKE 'OR%' AND owner IN
('SYS','SUN');
Execution Plan
----------------------------------------------------------
Plan hash value: 1341146800
---------------------------------------------------------------------------------------------------------
| Id | Operation
| Name
| Rows |
Bytes | Cost (%CPU)| Time |
Pstart| Pstop |
---------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
|
| 1 |
25 |
3 (0)| 00:00:01 |
|
|
| 1 | INLIST ITERATOR
|
|
|
|
|
|
|
|
| 2 | PARTITION LIST
ITERATOR|
| 1 |
25 |
3 (0)| 00:00:01 |KEY(I)
|KEY(I) |
|* 3 |
INDEX RANGE SCAN
| IDX_PARTKEY3 |
1 |
25 | 3
(0)| 00:00:01 |KEY(I) |KEY(I) |
---------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
Statistics
----------------------------------------------------------
第八种情况:用带分区键值的索引进行跨分区查询,但在where条件中加分区条(与4的索引键相同,只是带后导索引键值)
set autotrace traceonly
SELECT object_name FROM parttest a WHERE
object_name LIKE 'OR%' AND owner IN
('SYS','SUN');
Execution Plan
----------------------------------------------------------
Plan hash value: 2095150599
------------------------------------------------------------------------------------------------------
| Id | Operation
| Name
| Rows
| Bytes | Cost (%CPU)| Time
| Pstart| Pstop |
------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
|
|
1 |
25 | 3
(0)| 00:00:01 |
|
|
| 1 | PARTITION LIST
INLIST|
| 1 |
25 |
3 (0)| 00:00:01 |KEY(I)
|KEY(I) |
|* 2 | INDEX RANGE SCAN
| IDX_PARTKEY2 |
1 |
25 | 3
(0)| 00:00:01 |KEY(I) |KEY(I) |
------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
Statistics
----------------------------------------------------------
第九种情况:用带分区键值的索引进行跨分区查询,但在where条件中加分区条件(与4的索引键相同,只是带索引键值)
set autotrace traceonly
SELECT object_name FROM parttest a WHERE
object_name LIKE 'OR%' AND owner IN
('SYS','SUN');
Execution Plan
----------------------------------------------------------
Plan hash value: 2097624711
---------------------------------------------------------------------------------------------------------------------
| Id | Operation
| Name
| Rows |
Bytes | Cost (%CPU)| Time |
Pstart| Pstop |
---------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
|
| 1 |
25 |
5 (0)| 00:00:01 |
|
|
| 1 | PARTITION LIST
INLIST
|
|
1 | 25 |
5 (0)|
00:00:01 |KEY(I) |KEY(I) |
| 2 | TABLE ACCESS BY
LOCAL INDEX ROWID| PARTTEST
| 1 |
25 |
5 (0)| 00:00:01 |KEY(I)
|KEY(I) |
|* 3 |
INDEX RANGE SCAN
| IDX_NOPARTKEY2 |
3 |
| 3
(0)| 00:00:01 |KEY(I) |KEY(I) |
---------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
Statistics
----------------------------------------------------------
总结:
3.
测试在非分区表上创建全局分区索引与普通索引区别,看着意义不大,使用场景未明。
CREATE TABLE gpart AS select
owner,object_id,object_name,created from
DBA_OBJECTS;
SELECT distinct TO_char(created,'YYYY-MM-DD') FROM
gpart;
exec
dbms_stats.gather_table_stats('SUN','GPART',cascade=>true,no_invalidate=>false,method_opt=>'for
all columns size
1',estimate_percent=>dbms_stats.auto_sample_size,degree=>24)
;
create index idx_gpart1 ON gpart(created) nologging;
DROP INDEX idx_gpart1;
set autotrace traceonly
SELECT * FROM gpart t WHERE created >
TO_DATE('2015-04-02','YYYY-MM-DD') ;
Execution Plan
----------------------------------------------------------
Plan hash value: 4136711861
------------------------------------------------------------------------------------------
| Id | Operation
| Name
| Rows |
Bytes | Cost (%CPU)| Time
|
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
|
| 1005 |
36180 | 13
(0)| 00:00:01 |
| 1 | TABLE ACCESS BY
INDEX ROWID| GPART
| 1005 | 36180 |
13 (0)|
00:00:01 |
|* 2 | INDEX RANGE SCAN
| IDX_GPART1 |
1005 |
| 4
(0)| 00:00:01 |
------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
Statistics
----------------------------------------------------------
create index idx_gpart2
on gpart(created)
DROP INDEX idx_gpart2;
set autotrace traceonly
SELECT * FROM gpart t WHERE created >
TO_DATE('2015-04-02','YYYY-MM-DD') ;
Execution Plan
----------------------------------------------------------
Plan hash value: 4217733073
-----------------------------------------------------------------------------------------------------------
| Id | Operation
| Name
| Rows
| Bytes | Cost (%CPU)| Time
| Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
|
| 1005 |
36180 | 13
(0)| 00:00:01 |
|
|
| 1 | PARTITION RANGE
SINGLE |
|
1005 | 36180 |
13 (0)| 00:00:01 |
5 |
5 |
| 2 | TABLE ACCESS BY
INDEX ROWID| GPART
| 1005 | 36180 |
13 (0)|
00:00:01 |
| |
|* 3 |
INDEX RANGE SCAN
| IDX_GPART2 | 1005 |
|
4 (0)|
00:00:01 | 5 |
5 |
-----------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
Statistics
----------------------------------------------------------