欢迎投稿

今日深度:

关于分区技术的索引 index,分区索引index

关于分区技术的索引 index,分区索引index


分区系列篇:

关于oracle分区技术--初了解  http://blog.csdn.net/wanghui5767260/article/details/39158873

关于分区技术的索引:           http://blog.csdn.net/wanghui5767260/article/details/39181027


关于分区技术---索引 Index

 

一、   分区索引分类:

    本地前缀分区索引(local prefixedpartitioned index)

    全局分区索引(global partitionedindex)

    本地非前缀分区索引(localnon-prefixed partitioned index)

 

1.1  表和索引的组合:

 


第一种:表和索引都不分区 

    最简单的方式  就是常见的索引

 

第二种:表分区了,但索引没分区

    这导致了:“我们已经做了分区表了,怎么性能没有提高?”的主要原因之一。

在很多系统中,特别是交易系统里面,是通过索引访问数据库的。如果索引没有分区,索引树的高度没有变,因此访问性能当然没有提高。如果按索引访问表,与表是否分区关系不大。

 

第三种:表没有分区,但索引分区了

    索引只能是全局分区索引。

 

第四种:表分区了,索引也分区了(重点!!!)

    全局分区索引

    本地前缀分区索引

 

二、   具体介绍分区索引

 

本地分区索引

    是指索引的分区方法与对应表的分区方法一样。

 

2.1本地前缀分区索引(local prefixed partitioned index)

是指分区字段是索引字段的前缀。

    一张交易流水表(TXN_CURRENT),并且以交易日期字段(TXN_DATE)按年度进行了范围分区。在TXN_DATE 字段创建索引。

 

Createindex idx_txn_current_1 on txn_current(txn_date) local;

 

或者复合分区索引

Createindex idx_txn_current_2 on txn_current(txn_date,area) local;

 

    好处:

a. 由于分区索引和表分区对应,因此查询数据直接到对应的索引分区去查询,索引树的高度肯定低于非分区情况下的那棵大索引树了,也就是说性能更高了。

b. 当某个分区进行删除(DROP)或合并(MERGE)操作之后,oracle自动对所对应的索引分区进行相同的操作,整个本地前缀索引依然有效,不需要重建(rebuild)操作,这样大大保障了表的可用性。

 

2.2 全局分区索引(global partitioned index)

    索引的分区与表分区无关

 

    分区表按年份进行分区,在地区(AREA)字段上建立分区索引,

 


 

 

也就是说:杭州交易数据肯定可分布在各年份,湖州、嘉兴交易数据同样如此。

假如有这样的查询需求:

Select* from TXN_CURRENT where area=’05711001’;

--假设查询杭州西湖区

 

好处:

a. 此时oracle会很聪明地知道杭州的分区索引树上去检索,索引高度肯定低于非分区情况下的大索引树了,也就是性能更高了。

b. 在分区粒度比较细的情况下,性能甚至高于本地前缀分区索引。

 

不足:

a.  主要体现在高可用方面。如果该表的03年数据通过分区删除全部删除了。则全局分区索引(包括普通非分区索引)则全部失效(INVALID),这些索引不可用了,除非重建(rebuild)操作。数据量越大,索引量也越大,重建索引时间也越长,无法通过该类索引访问数据的时间也越长。因此,大大降低数据的可访问性。

 

2.3 本地非前缀分区索引

可能导致性能会下降的情况,本地非前缀分区索引的性能可能还不如不分区。

 

优点:

a. 提高按索引访问的可用性!我们假设要通过删除分区技术,进行03年数据的清理,如果area字段索引建立成普通索引,或者是全局分区索引,都会面临一个问题:在分区删除(DROP)操作之后,普通索引和全局分区索引都会失效(INVALID),必须重建。而本地非前缀分区索引的好处在于,在分区删除操作后,该本地非前缀分区索引依然有效。

 

三、   整理思路

 

理解分区索引藏宝图:

 


 

描述藏宝图:找宝藏

(1)如果表分区字段正好是索引字段或者是其前缀。例如:上述TXN_CURRENT 表分区字段是TXN_DATE,则TXN_DATE正好是索引字段(TXN_DATE),或者正好是索引字段(TXN_DATE,AREA)的前缀,则此时应建立local profixedpartitioned index.

(2)否则,如果欲将非分区字段建立为唯一索引,例如:假设在TXN_CURRENT 表的某个字段建立唯一索引,oracle要求必须global prefixed index.

 否则报错:

ORA-14039:partitioning columns must form a subset of key columns of a UNIQUE index

 

(3)流程图再往下,此时要判断“是否性能在可承受范围,而分区的管理性、可用性更重要?”。如果是,就应建立local non-profixed index。也就是上面所描述的:如果历史数据的整理非常频繁,而且不能承受全局分区索引重建的长时间带来的索引不可用,同时日常交易性能尚能接受,则建议设计为本地非前缀分区索引。

(4)流程图再往下,最后判断系统是否为交易系统或者是数据仓库系统。因为通常情况下,数据仓库会有频繁的大批量数据导入(ETL)操作,以及历史数据清理操作,此时分区索引可用性更重要,因此建议设计为Localnon-profixed index 。而在交易系统中,日常查询性能要求更高,历史数据清理操作频度相对较低,因此建议设计为global profixed index。

 注:oracle没有global non-profixed index概念。

 

四、   分区表设计建议  只是建议:更多看实际!!!

 

(1)       表的大小:当表的大小超过1.5G—2GB时,或对于OLTP系统,表的记录超过1000万条时,都应考虑对表进行分区。

(2)      数据访问特征:基于表的大部分查询应用,只访问表中的少量数据。对于这样的表进行分区,可充分利用分区技术排除无关数据查询的特征。

(3)      数据维护:按时间段删除成批的数据,例如按月删除历史数据。对于这样的表需要考虑进行分区,以满足维护的需求。

(4)      数据备份和恢复:按时间周期进行表空间的备份时,在分区与表空间之间建立起对应关系。

(5)      只读数据:如果一个表中的大部分数据都是只读数据,通过对表进行分区,可将只读数据存储在只读表空间中,对于数据库的备是非常有益的。

(6)      并行数据操作:对于经常执行并行操作(如parallelinsert、parallel update等)的表应考虑进行分区。

(7)      表的可用性:当对表中部分数据的可用性要求很高时,应考虑进行表分区。



2014/9/10     tyger

本文整理自:罗敏《品悟性能优化》


Oracle索引技术之怎建立最佳索引

怎样建立最佳索引?1、明确地创建索引create index index_name on table_name(field_name)tablespace tablespace_namepctfree 5initrans 2maxtrans 255storage(minextents 1maxextents 16382pctincrease 0); 2、创建基于函数的索引常用与UPPER、LOWER、TO_CHAR(date)等函数分类上,例:create index idx_func on emp(UPPER(ename)) tablespace tablespace_name; 3、创建位图索引对基数较小,且基数相对稳定的列建立索引时,首先应该考虑位图索引,例:create bitmap index idx_bitm on class (classno) tablespace tablespace_name; 4、明确地创建唯一索引可以用create unique index语句来创建唯一索引,例:create unique index dept_unique_idx on dept(dept_no) tablespace idx_1; 5、创建与约束相关的索引可以用using index字句,为与unique和primary key约束相关的索引,例:alter table table_nameadd constraint PK_primary_keyname primary key(field_name)using index tablespace tablespace_name; 如何创建局部区索引?1)基础表必须是分区表2)分区数量与基础表相同3)每个索引分区的子分区数量与相应的基础表分区相同4)基础表的自分区中的行的索引项,被存储在该索引的相应的自分区中,例如create index TG_CDR04_SERV_ID_IDX on TG_CDR04(SERV_ID)Pctfree 5Tablespace TBS_AK01_IDXStorage(MaxExtents 32768PctIncrease 0FreeLists 1FreeList Groups 1)local/ 如何创建范围分区的全局索引?基础表可以是全局表和分区表create index idx_start_date on tg_cdr01(start_date)global partition by range(start_date)(partition p01_idx vlaues less than ('0106')partition p01_idx vlaues less than ('0111')...partition p01_idx vlaues less than ('0401'))/ 如何重建现存的索引?重建现存的索引的当前时刻不会影响查询重建索引可以删除额外的数据块提高索引查询效率alter index idx_name rebuild nologging;对于分区索引alter index idx_name rebuild partition partition_name nologging; 删除索引的原因?1)不再需要的索引2)索引没有针对其相关的表所发布的查询提供所期望的性能改善3)应用没有用该索引来查询数据4)该索引无效,必须在重建之前删除该索引5)该索引已经变的太碎了,必须在重......余下全文>>
 

oracle中为何重建分区索引(索引分区)? 重建分区索引与索引分区什不同?

1.上述的语句是对单个分区索引进行重建。
2.索引分区的意思是指建立一个分区索引,而不是一个普通索引。
3.重建分区索引,这个比如说碎片太多,想换个表空间都可以重建的。
4.执行完了,就表示执行成功了。索引的分区信息可以在 user_ind_partitions 查询
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/3145.html NewsArticle 关于分区技术的索引 index,分区索引index 分区系列篇: 关于oracle分区技术--初了解 http://blog.csdn.net/wanghui5767260/article/details/39158873 关于分区技术的索引: http://blog.csdn.net/wanghui5767260/art...
相关文章
    暂无相关文章
评论暂时关闭