设为首页 加入收藏

TOP

ORACLE 全局索引和本地索引(二)
2015-11-21 01:35:16 来源: 作者: 【 】 浏览:1
Tags:ORACLE 全局 索引 本地
D-MON-YYYY‘)); Table altered. SQL> select INDEX_NAME, PARTITION_NAME from dba_ind_partitions where index_name=upper(‘orders_local_1_idx‘); INDEX_NAME PARTITION_NAME ------------------------------ ------------------------------ ORDERS_LOCAL_1_IDX LOCAL1 ORDERS_LOCAL_1_IDX LOCAL2 ORDERS_LOCAL_1_IDX LOCAL3 ORDERS_LOCAL_1_IDX LOCAL4 ORDERS_LOCAL_1_IDX Q5

?

?
这里 系统已经自动以和表分区相同的名字自动创建了一个索引分区。同理,删除表分区时相对应的索引分区也自动被删除。
?
本地索引和全局索引还有一个显著的差别,就是上面提到的,本地索引可以创建成本地非前缀型,而全局索引只能是前缀型。
?
SQL> create index orders_local_2_idx
     on orders(part_no)
      local
       (partition LOCAL1,
        partition LOCAL2,
        partition LOCAL3,
        partition LOCAL4)
     ;

Index created.

SQL> select INDEX_NAME, PARTITION_NAME, HIGH_VALUE from dba_ind_partitions
     where index_name=upper(‘orders_local_2_idx‘);

INDEX_NAME                     PARTITION_NAME                 HIGH_VALUE
------------------------------ ------------------------------ ---------------------------------------------------------
ORDERS_LOCAL_2_IDX             LOCAL1                         TO_DATE(‘ 1999-04-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, 
                                                              ‘NLS_CALENDAR=GREGORIA‘
ORDERS_LOCAL_2_IDX             LOCAL2                         TO_DATE(‘ 1999-07-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, 
                                                              ‘NLS_CALENDAR=GREGORIA‘
ORDERS_LOCAL_2_IDX             LOCAL3                         TO_DATE(‘ 1999-10-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘,
                                                              ‘NLS_CALENDAR=GREGORIA‘
ORDERS_LOCAL_2_IDX             LOCAL4                         TO_DATE(‘ 2000-01-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘,
                                                              ‘NLS_CALENDAR=GREGORIA‘

?

?
从上面的输出可以看出,虽然索引的键值是part_no,但索引分区的键值仍然和表的分区键值相同,即ord_date,也即是所谓的非前缀型索引。
?
最后,再引用一个例子说明前缀索引和非前缀索引的应用。
?
假设有一个使用DATE列分区的大表。我们经常使用一个VARCHAR2列(VCOL)进行查询,但这个列并不是表的分区键值。
?
有两种可能的方法来访问VCOL列的数据,一是建立基于VCOL列的本地非前缀索引,
?
? ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
? ? ? ? ? ? ?------- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -------
? ? ? ? ? ? | ? ? ? | ? ? ? ? (10 more ? ? ? ? ? ? ? ?| ? ? ? ?|
Values: ? ? A.. ? ? Z.. ? partitions here) ? ? ? ? ? ?A.. ? ? ?Z..?
?
另一种是建立基于VCOL列的全局索引,
?
? ? ? ? ? ? ? ? | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
? ? ? ? ? ? ? ------- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -------
? ? ? ? ? ? ?| ? ? ? | ? ? ? ? (10 more ? ? ? ? ? ? ? ?| ? ? ? ?|
Values: ? ? ?A.. ? ? D.. ? partitions here) ? ? ? ? ? ?T.. ? ? ?Z..?
?
可以看出,如果能够保证VCOL列值的唯一性,全局索引将会是最好的选择。如果VCOL列值不唯一,就需要在本地非前缀索引的并行查询和全局索引顺序查询以及高昂的维护代价之间做出选择。
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇oracleerror引号内的字符串没有正.. 下一篇获取指定日期的随机时间(oracle函..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: