您的位置:首页 > 数据库 > Oracle

oracle的分区表、分区索引和全局索引部分总结

2017-12-21 03:16 603 查看
原文地址:http://blog.sina.com.cn/s/blog_56d8ea900101g07p.html

oracle的分区表、分区索引和全局索引部分总结: http://space.itpub.net/18953778/viewspace-557476 找不到数据对应分区会报: ora-14400插入的分区关键字未映射到任何分区

分区索引与全局索引的性能对比例子,前两个是索引基础介绍:
1、如果使用全局索引,当对某一个分区进行ddl操作时,该索引就无效了,必须重建,这一点比较麻烦。
注意:这里的索引失效是很严重的完全失效
2、如果索引字段是分区键(主要是range),那么就用local的。
3、如果索引字段是id、电话号码等类型的,那么就用global的。
4、如果分区间的数据是相互独立的,即不会被同时访问,使用local index 更好些。相反如果数据跨越多个分区,可能local index会更差些。
5、当分区中出现许多事务并且要保证所有分区中的数据记录的唯一性时采用全局索引。 http://www.cnblogs.com/skyme/archive/2011/02/15/1955212.html http://oracle.chinaitlab.com/backup/761867.html http://f.dataguru.cn/thread-49050-1-1.html http://www.itpub.net/forum.php?mod=viewthread&action=printable&tid=920774

oracle创建时间分区表: http://hf200012.iteye.com/blog/1526682
Oracle 数据库分区表的创建和操作: http://www.cnblogs.com/fjfzhkb/archive/2008/01/09/1031956.html
分区表执行计划: http://www.yaweirz.com/oracle/ocp/465.html
其他:
问:一表,以字段 a(时间字符字段)做分区字段,,则a 是不是就具有索引的功能了,还需要在这个字段上建索引吗
答:不具备。只能说可以partition prune
1)partition column is not indexed column
2)Whether to create index on partition key,depends on whether the column meets the conditions of creating index.
虽然不具备,但是字符型对于like > = <都会range scan
分区修剪(Partition pruning)指的是一种查询可以跳过一个或多个分区对应的数据文件不进行读取的技术。假如你能安排你的查询从查询计划中剪除大量的不必要的分区,查询使用更少的资源,因此与剪除的不必要的分区成比例的变快,并且更可扩展(If you can arrange for queries
to prune large numbers of unnecessary partitions from the query execution plan, the queries use fewer resources and are thus proportionally faster and more scalable)。

例如,如果一个表使用 YEAR, MONTH, DAY 分区,这样如 WHERE year = 2013, WHERE year < 2010, WHERE year BETWEEN 1995 AND 1998 等 WHERE 子句允许 Impala 除了指定范围的分区外,跳过所有其他分区的数据文件。同样的,WHERE year = 2013 AND month BETWEEN 1 AND 3 甚至可以剪除更多的分区,只读取一年中的一部分数据文件。 http://my.oschina.net/weiqingbin/blog?disp=2&p=2&catalog=423691 http://www.itpub.net/forum.php?mod=viewthread&tid=1342243&extra=&highlight=&page=1
后话:
为了更好的性能,一般都在分区列上建立局部索引;

问:对于海量数据的查询效率是一个很关键的问题,而分区可以提高查询效率。问题是
对于分区表,如果在select语句中不显式的指定去哪个分区查(如果指定的话也只能指定一个分区,如果多个分区的话还要union过,有点麻烦),但在where子句中有分区字段的between,in,=等语句(可能还有其他属性字段的限制),那么oracle执行该查询语句时暗地里会不会根据分区去查?
   看了一些文档,好象都没明确说这件事,望有这方面经验的朋友指点,谢谢
答: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=927594 http://www.cnblogs.com/liuweihua/archive/2012/05/05/2484441.html

使用ORACLE在线重定义将普通表改为分区表,被转义的表必须有主键,转义的表不需要 http://jishu.zol.com.cn/4032.html http://www.blogjava.net/willpower88/archive/2013/12/15/111987.html http://blog.csdn.net/lnwf5188588/article/details/8839337 http://blog.csdn.net/stevendbaguo/article/details/9849311
其中需要赋dbms_redefinition的执行权限给对应用户:
grant
 
execute
 
on
 
dbms_redefinition 
to
 
dex ;

还可能需要建物化视图的权限;

所以最好用sys执行
dbms_redefinition,对应用户执行常规sql

1、exec dbms_redefinition.start_redef_table('joinspider', 't_test', 't_temp');
只是将t_test表数据 同步到 t_temp,不变更任何索引信息;比如原来t_test有索引,t_temp无索引,这些都不会受任何影响;
2、exec dbms_redefinition.finish_redef_table('joinspider', 't_test', 't_temp');
交换两个表的信息,包括索引,分区信息等等;
3、失败了使用exec  DBMS_REDEFINITION.abort_redef_table(‘joinspider’,
't_test', 't_temp')放弃在线重定义

以下:
--创建含on prebuilt table的物化视图和物化视图日志
--实现通过物化视图刷新当前表中数据进入中间表
SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'TEST', 'TEST_PARTITION');
PL/SQL 过程已成功完成。

START后
select owner,mview_name from user_mviews;
select log_owner,master,log_table from user_mview_logs;是有数据的

--实现物化视图刷新在执行同步时操作过程中变化数据。
SQL> EXEC dbms_redefinition.sync_interim_table(user, 'TEST','TEST_PARTITION') ;
PL/SQL 过程已成功完成。

--锁定原表,防止表上的DML,物化视图执行刷新,完成刷新后,将删除物化视图和对应的日志。
SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'TEST', 'TEST_PARTITION');
PL/SQL 过程已成功完成。
finish后 上面两个查询无数据

FINISH_REDEF_TABLE最后一步,如果TEST有其他同义词引用,可以导致失败,提示

ORA-12093: 中间表 "USER"."TEST_PARTITION" 无效

ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 78

ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 1680

ORA-06512: 在 line 1

奇怪的是,表的信息已经交换?匪夷所思。。。待求证。
http://yumianfeilong.com/html/2007/12/27/155.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: