分区表删除分区对索引的影响(Oracle分区表删除分区数据时导致索引失效解决)

http://www.itpub.net/thread-1942951-1-1.html


oracle中,建立分区表,然后建立索引的时候有全局索引和本地索引,
因为需要定时删除分区,所以建立本地索引,可以在查询的时候走索引,
那么全局索引的意义是什么?
据说全局索引会快,什么样的查询用全局索引
会达到快的效果?
而且全局索引维护起来比较麻烦,删除分区会让索引失效,
失效的原因是什么?

同时还有个问题

因为我同时也在使用mysql数据库,在mysql数据库里面,好像没有全局索引和
本地索引的区别,按照正常的create index 不加global或者local,生成的索引,
在删除分区的时候没有失效的现象。是不是代表就是local本地索引?

而在oracle中直接用create index 不加global或者local  好像生成的就是全局索引。

麻烦各位大神为我解惑~谢谢!~!

===================================================================

那么全局索引的意义是什么?
据说全局索引会快,什么样的查询用全局索引
会达到快的效果?

如果你的查询条件中不包含分区键,那么用全局索引比局部索引快。局部的相当于要多次查询,每次查一个小一点的索引。

失效的原因是什么?
因为同一个分区的索引条目,在全局索引文件中并不是在一起的,而是分散的。分区可以整个删除,索引没法把整块数据拿掉。

mysql问题请去相应板块。

================================================================

用一个例子来说明吧:
假设有一个订单明细表,有订单生成时间,订单号,产品ID和用户ID。且这个订单明细表是按订单生成时间按月分区的。
如果有一个需求是查询2015年3月,某个产品被订购的数量。那么我们可以在订单生成时间和产品ID列上建一个组合索引,并建成本地索引更好。因为这样可以进行分区消除,只在3月数据所对应的索引中去查找,处理的范围小,效率高。
如果有一个需求是查询某个用户历史上订购某个产品的次数,那么在产品ID列和用户ID列上创建一个全局索引更好。反之,如果在产品ID列和用户ID列上创建一个本地索引,由于不能使用上分区消除,其访问效率会低于全局索引。而且,为了进一步提升前面全局索引的性能,我们还可以对这个全局索引按产品ID(产品ID的唯一值相对较少)进行分区,这样,访问这个全局索引时会更有效率。

所以,全局索引快,还是本地索引快,要结合特定的SQL,不同的SQL,两种索引的表现是不同的。

索引是由记录的ROWID和索引列值组成的。而ROWID又是由对象号、文件号、块号和行号组成的。当我们对分区做管理操作时(比如删除分区、合并分区、分割分区等),相应分区的对象号均会改变,再加上这些操作是DDL操作。如果不失效全局索引,若某个SQL的访问路径是按索引访问,那么就极可能得到错误的结果。而本地索引,由于是和指定分区独立关联的,大部分的分区管理操作,它是可以同步做对应的索引的DDL操作的。但是,在做分区操作时,加上”update indexes"选项,全局索引会进行相应的更新和维护操作,这样全局索引也不会失效,但操作的时间会相应变长。所以,本地索引的管理成本更优。

================================================================


现有一分区表,除主键索引外其余索引均为分区索引,疑问如下:
1、现在有dba指出修改计划将表主键的全局索引修改为分区索引,不知道修改后能不能够起到优化的作用??
2、分区索引对主键中的数据一致性有没有影响??
3、在不影响生产库的情况下怎样将全局主键索引修改为分区索引??
  按照我的理解答的,不全对啊。谢谢
答1,分区表在管理上的确非常方便,在性能方面的表现也不错。
但是就是有一点不是很理想:删除分区和TRUNCATE分区表中数据,会造成主键和全局索引的失效。如果数据表非常大,索引的重建也是需要花很长时间的。
所以:首先根据应用尽量将索引修改为分区索引(个别索引可能不能修改),删除主键也修改为唯一分区索引。
经过测试表明,如果分区字段选择合理,使用分区索引的效率比全局索引要高一些,而主键和唯一分区索引的效率大体相当,因此这样的优化还是非常值得的,如果由于优化导致个别应用效率下降,也可以通过应用的调整进行优化。

答2:主键如果不是你选择的分区字段的话, 在分区表上创建的唯一索引必须包含分区字段,否则会提示错误(ORA-14039),这一点也需要特别注意。

答3:删除索引,创建所以,具体sql,google
注:主键索引和主键约束的创建与删除顺序 
创建主键索引 --> 创建主键约束 
删除主键约束 --> 删除主键索引 
  

注: 
1.分区字段不是主键的情况下,只可以创建全局分区索引,不可以创建本地主键分区索引. 
只有分区字段为主键时才可以创建本地主键分区索引. 
2.如果创建本地唯一分区索引,除指定索引字段外还要加上表分区字段. 
这种索引意义不大:因为这样构成复合索引,索引改变,约束也改变了. 
3.如果创建非唯一索引则不需要表分区字段. 
4.创建全局分区索引后可以创建约束.  


================================================================

一般都是local 的。不然后续一维护分区,索引就失效了。

还得从新维护索引。


可以把分区建也作为主键。


主键就用全局吧,删除分区的时候加上update global indexes就可以了,执行很快的。

猜你喜欢

转载自blog.csdn.net/e_wsq/article/details/80889060