当前位置: DBARoad > 基础知识 > 文章正文

Hash Partitioned Global Index

                    作者 :OoNiceDream【转载时请务必以超链接形式标明文章原始出处和作者信息】
                    链接:http://www.dbaroad.me/archives/2009/05/hash_partitioned_global_index.html

Hash partitioned global index是10G的新特性,Oracle对哪种情况下适合使用该索引,也有一点说明:

Hash partitioned global indexes can improve the performance of indexes
where a small number of leaf blocks in the index have high contention
in multiuser OLTP environments. Queries involving the equality and IN
predicates on the index partitioning key can efficiently use hash-partitioned global indexes.


散列分区索引对完全相等性查询(equality and IN)能达到较好的分区消除效果:

SQL> create table test as
  2  select owner,object_name,object_id from dba_objects;
 
Table created.
 
SQL> create index ind_hash_01 on test (owner) global
  2  partition by hash (owner) partitions 6;
 
Index created.
 
SQL> exec dbms_stats.gather_table_stats(ownname=>'SYS',tabname=>'TEST',cascade=>true);
 
PL/SQL procedure successfully completed.
 
SQL> select * from test where owner='M1';
 
OWNER           OBJECT_NAME      OBJECT_ID
--------------- --------------- ----------
M1              DEPT                 88520
M1              PK_DEPT              88521
M1              EMP                  88522
M1              CK_LOG               88526
M1              IND_EMP              88527
 
SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
 
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------
SQL_ID  aaq4r433g1qu2, child number 0
-------------------------------------
select * from test where owner='M1'
 
Plan hash value: 1034188634
 
------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name        | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------------------------------
|   1 |  PARTITION HASH SINGLE       |             |      1 |      1 |      5 |00:00:00.01 |       5 |
|   2 |   TABLE ACCESS BY INDEX ROWID| TEST        |      1 |      1 |      5 |00:00:00.01 |       5 |
 
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------
|*  3 |    INDEX RANGE SCAN          | IND_HASH_01 |      1 |      1 |      5 |00:00:00.01 |       3 |
------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   3 - access("OWNER"='M1')
 
 
19 rows selected.
 
SQL> select * from test where owner in ('M1','OUTLN');
 
OWNER      OBJECT_NAME                     OBJECT_ID
---------- ------------------------------ ----------
M1         DEPT                                88520
M1         PK_DEPT                             88521
M1         EMP                                 88522
M1         CK_LOG                              88526
M1         IND_EMP                             88527
OUTLN      OL$                                   452
OUTLN      OL$HINTS                              453
OUTLN      SYS_LOB0000000453C00021$$             454
OUTLN      OL$NODES                              456
OUTLN      OL$NAME                               457
OUTLN      OL$SIGNATURE                          458
OUTLN      OL$HNT_NUM                            459
OUTLN      ORA$GRANT_SYS_SELECT                 5493
 
13 rows selected.
 
SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
 
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------
SQL_ID  a9rjz12jc5kvc, child number 0
-------------------------------------
select * from test where owner in ('M1','OUTLN')
 
Plan hash value: 1839128208
 
-------------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name        | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-------------------------------------------------------------------------------------------------------
|   1 |  INLIST ITERATOR              |             |      1 |        |     13 |00:00:00.01 |       9 |
|   2 |   PARTITION HASH ITERATOR     |             |      2 |      1 |     13 |00:00:00.01 |       9 |
|   3 |    TABLE ACCESS BY INDEX ROWID| TEST        |      2 |      1 |     13 |00:00:00.01 |       9 |
|*  4 |     INDEX RANGE SCAN          | IND_HASH_01 |      2 |      1 |     13 |00:00:00.01 |       5 |
-------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   4 - access(("OWNER"='M1' OR "OWNER"='OUTLN'))
 
 
20 rows selected.

而对一些范围查询,比如:like,between and,>等,则要返回所有分区:

SQL> select * from test where owner like 'M1%';
 
OWNER           OBJECT_NAME      OBJECT_ID
--------------- --------------- ----------
M1              DEPT                 88520
M1              PK_DEPT              88521
M1              EMP                  88522
M1              CK_LOG               88526
M1              IND_EMP              88527
 
SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
 
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------
SQL_ID  atj964wcsnnbs, child number 0
-------------------------------------
select * from test where owner like 'M1%'
 
Plan hash value: 1551804055
 
------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name        | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------------------------------
|   1 |  PARTITION HASH ALL          |             |      1 |      1 |      5 |00:00:00.01 |      13 |
|   2 |   TABLE ACCESS BY INDEX ROWID| TEST        |      6 |      1 |      5 |00:00:00.01 |      13 |
 
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------
|*  3 |    INDEX RANGE SCAN          | IND_HASH_01 |      6 |      1 |      5 |00:00:00.01 |      11 |
------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   3 - access("OWNER" LIKE 'M1%')
       filter("OWNER" LIKE 'M1%')
 
 
20 rows selected.

— The End —

关键字:
喜欢DBARoad的文章,那就通过 RSS Feed 功能订阅阅读吧!

我要评论

*

* 绝不会泄露


  • 订阅


      抓虾
      google reader
      my yahoo
      bloglines
      鲜果
      有道

站内搜索



返回首页 | 关于我 | 联系我 | 广告合作 | 网站地图 | 友情链接 | 版权声明 |