海量数据库及分区4——《12年资深DBA教你Oracle开发与优化——性能优化部分》
目录:
Oracle数据完整性和锁机制?
索引及优化之表分析?
表分析、约束及表间关系?
Oracle体系结构1
Oracle体系结构2?
海量数据库及分区1?
海量数据库及分区2?
海量数据库及分区3?
海量数据库及分区4?
高级SQL优化(一)??
高级SQL优化(二)??
高级SQL优化(三) 常用优化工具?
PPT和源码下载:????http://sishuok.com/forum/posts/list/6365.html
配套视频课程
????Oracle性能优化?http://sishuok.com/product/601?
????海量数据库和高级SQL优化?http://sishuok.com/product/602
?
?
管理分区
增加索引分区
本地索引无法明确的增加分区,其增加只能是基表增加分区,此时新增加的索引分区的名字是Oracle自命名的,但可以给其重新命名。
也可是使用ALTER INDEX index_name MODIFY DEFAULT ARRTIBUTES? TABLASEPACE tablespace_name修改本地索引分区默认的表空间后,再使用ADD PARTITION增加表的分区,则基表增加分区带来索引分区的增加,会自动将新增加的索引分区指向该表空间。
接合分区
??分区接合是针对散列分区或者*-散列子分区的,目的是减少分区数。当某个散列分区接合后,Oracle将其分区的数据分散到其它分区中。被接合的分区是由数据库选择的,接合完成后该分区会被删除,且如果没有使用UPDATE INDEX子句,本地索引和全局索引均将变成不可用,一般需要重建索引。
1.散列分区表的散列分区接合
? 使用语法 ALTER TABLE? COALESCE PARTITION。
?
2.散列子分区表的散列子分区集合
? 使用语法 ALTER TABLE MODIFY PARTITION? COALESCE SUBPARTITION。 ???????????????????????参见附件脚本1
??
删除表分区
??只针对范围和列表分区或者组合*-范围和组合*-列表分区,散列分区不能删除,替代的方式是接合分区。
分区或子分区删除后,其中的数据也被删除,同样,基于这些分区或者子分区的本地索引中相应的分区和子分区也会被删除;对于全局索引除非使用了UPDATE INDEXS子句,删除分区后其会变成不可用,一般需要重构。如果要防止数据被删除替代的方式是使用合并分区MERGE PARTITION。
删除分区的语句是ALTER TABLE DROP PARTITION,删除子分区的语句时ALTER TABLE DROP SUBPARTITION。
1.从包含数据和全局索引的表中删除分区
??此时指的是表中有数据,且包含一个或几个全局索引。
??(1).方法一(推荐的方法)
??? 先删除分区,再一个个的重构全部索引,此时可以解决范围分区的全局索引的问题(删除后全部变成不可用)。这么做的原因是不要考虑全局索引是什么分区的。一般的方法是编写一个工具子程序,通过动态SQL开重构索引:
? ALTER TABLE table_name DROP PARTITION partition_name;
ALTER INDEX index_name1_on_ table_name REBUILD;
? …
?ALTER INDEX index_namen_on_ table_name REBUILD;
(2).方法二
??? 先删除该分区的数据(因为删除数据会重构全局分区),再删除分区,一般针对数据不是特别多的表:
? DELETE FROM table_name PARTITION(partition_name);
ALTER TABLE table_name? PARTITION partition_name;
(3).方法三
??? 使用UPDATE INDEXES子句,此时Oracle会自动重构该全局索引:
???? ALTER TABLE table_name? PARTITION partition_name UPDATE INDEXES;
?
2.从包含数据和参照完整性(外键)的表中删除分区
? (1).方法一
??? 如果要删除的分区中的数据没有被参照引用,先禁用该参照完整性约束,再删除分区,最后再启用该参照完整性约束。
(2).方法二
如果要删除的分区中的数据被参照引用,先删除该分区中数据,再删除分区。
删除索引分区
无法显式的删除本地索引的分区,删除的唯一方式是本地索引分区基表的分区被删除时由Oracle自动的隐式删除。?
如果全局索引分区是空的,则可以显式的删除它,使用的语句是ALTER INDEX index_name DROP PARTITION partition_name。但是,如果全局索引分区包含数据,删除则会引起更高级的分区(即下一个分区)变得不可用。如果非要这么做,则对更高级的分区需要重构,语法是:
?ALTER INDEX index_name REUBILT PARTITION nextpartition_name
??
交换分区
?
? ?可以将一个分区(子分区)和非分区表进行数据交换,oracle交换的方法是其实是对逻辑存储段进行交换。同样,散列|范围|列表分区可以与复合*-散列|*-范围|*-列表分区间也可以进行数据交换。当应用中需要将非分区表的数据转换进入分区表的分区时非常高效实用。使用INCLUDEING INDEXES子句可以同步将本地索引也进行交换,使用WITH VALIDATATION子句还可以实现行数据的验证。
交换分区时如果不带UPDATE INDEXES子句,则全局索引或全局索引