Oracle的分区② - 分区表举例
				
		
		
				
				 
		
				
						    好,接着学习分区表。为了将来可以很熟练得应用分区表,所以专门花一篇的篇幅,来进行分区表的实例模拟。其实操作的难度不大,主要还是关于表的设计和性能问题的分析,这个才是需要经验和技术的东西。
				
		
		
				
						
						
				 
		
				
				 
		
				
						一、分区表的维护
				
		
		
				
				 
		
				
						    分区表的维护操作比较复杂,具体可参见《Oracle 9i DBA指南》 P272-P293.
				
		
		
				
						
						
				 
		
				
				 
		
				
						二、实际举例
				
		
		
				
				 
		
				
						
								
										    1、移动历史表中的时间窗口
								
						
				
		
		
				
						
						
				 
		
				
						
								    案例如下:有一个表order,包含13个月的事务:1年的历史数据和本月的订单。每个月一个分区,这个按月的分区被命名为order_yymm,也是他们所在的表空间。
						
						
								另外order表包含两个局部索引:order_ix_onum是一个订单号码上的局部的、前缀的、唯一索引;order_ix_supp是一个供应商号码上的局部的、非前缀索引。局部索引分区用匹配基础表的后缀命名。
						
						
								还有一个用于客户姓名的全局唯一索引order_ix_cust,并包含3个分区,每个分区用户1/3的字母。
						
				
		
		
				
						
						
				 
		
				
						    则,1944年10月31日,修改时间窗的步骤如下:
				
		
		
				
						
						
				 
		
				
						
								    ①备份最早的时间间隔数据
						
				
		
		
				
						    ALTER TABLESPACE order_9310 BEGIN BACKUP;
				
		
		
				
						    ...
				
		
		
				
						    ALTER TABLESPACE order_9310 END BACKUP;
				
		
		
				
						
						
				 
		
				
						
								    ②删除最早的时间间隔分区
						
				
		
		
				
						    ALTER TABLE order DROP PARTITION order_9310;
				
		
		
				
						
						
				 
		
				
						    ③增加最近的时间间隔的分区
				
		
		
				
						    ALTER TABLE order ADD PARTITION order_9411;
				
		
		
				
						
						
				 
		
				
						    ④重建全局索引分区
				
		
		
				
						    ALTER INDEX order_ix_cust REBUILD PARTITION order_ix_cust_AH;
				
		
		
				
						
								    ALTER INDEX order_ix_cust REBUILD PARTITION order_ix_cust_IP;
						
				
		
		
				
						
								
										    ALTER INDEX order_ix_cust REBUILD PARTITION order_ix_cust_QZ;
								
						
				
		
		
				
						
						
				 
		
				
						    注意:在更改order表的分区时,需要考虑到用户的并发控制。需要做的2点是:
				
		
		
				
						    ● 在一个被定义好的批处理窗口期间,关闭所有用户层次的应用
				
		
		
				
						    ● 通过撤销所有应用使用的角色的访问权限,来保证没有谁可以访问表order
				
		
		
				
						
						
				 
		
				
						
								
										    2、将分区视图转换为分区表
								
						
				
		
		
				
						
						
				 
		
				
						    案例:分区视图按如下定义:
				
		
		
				
						    CREATE VIEW accounts AS
				
		
		
				
						    SELECT * FROM accounts_jan98
				
		
		
				
						    UNION ALL
				
		
		
				
						    SELECT * FROM accounts_fab98
				
		
		
				
						    UNION ALL
				
		
		
				
						    ...
				
		
		
				
						    SELECT * FROM accounts_dec98;
				
		
		
				
						
						
				 
		
				
						    修改的步骤如下:
				
		
		
				
						
						
				 
		
				
						
								    ①创建分区表,仅最近两个分区从该视图迁移到分区表中,每个分区获得两个数据块的一个段(作为占位器)
						
				
		
		
				
						    CREATE TABLE accounts_new (...)
				
		
		
				
						    TABLESPACE ts_temp STORAGE (INITIAL 2)
				
		
		
				
						    PARTITION BY RANGE (opening_date)
				
		
		
				
						    (PARTITION jan98 VALUES LESS THEN ('01-FEB-1998'),
				
		
		
				
						    ...
				
		
		
				
						    PARTITION dec98 VALUES LESS THEN ('01-JAN-1999'));
				
		
		
				
						
						
				 
		
				
						
								    ②用EXCHANGE PARTITION语句,将该表迁移到对应分区
						
				
		
		
				
						    ALTER TABLE accounts_new
				
		
		
				
						    EXCHANGE PARTITION nov98 WITH TABLE
				
		
		
				
						    accounts_nov98 WITH VALIDATION;
				
		
		
				
						
								
										
												    ALTER TABLE accounts_new
										
								
								
										
												    EXCHANGE PARTITION dec98 WITH TABLE
										
								
								
										
												    accounts_dec98 WITH VALIDATION;
										
								
								
										
												    这样,与nov98和dec98分区相关的占位器数据段就同accounts_nov98和accounts_dec98表相关的数据段作了交换。
										
								
								
										
												
												
										 
								
										
												    ③重新定义accounts视图
										
								
								
										
												
														
																    CREATE OR REPLACE VIEW accounts AS
														
												
												
														
																    SELECT * FROM accounts_jan98
														
												
												
														
																    UNION ALL
														
												
												
														
																    SELECT * FROM accounts_fab98
														
												
												
														
																    UNION ALL
														
												
												
														
																    ...
														
												
												
														
																    UNION ALL
														
												
												
														
																    SELECT * FROM accounts_new PARTITION (nov98)
														
												
												
														
																    UNION ALL
														
												
												
														
																    SELECT * FROM accounts_new PARTITION (dec98);
														
												
										
								 
						
				
		 
		
				
						
						
				 
		
				
						
								    ④删除accounts_nov98和accounts_dec98表
						
				
		
		
				
						
						
				 
		
				
						    ⑤重复以上操作,直至所有表都转换到分区中,删除该视图,并将分区表改为视图名。
				
		
		
				
						    DROP VIEW accounts;
				
		
		
				
						    RENAME accounts_new to accounts;
				
		
		
				
						
						
				 
		
				
						
						
				 
		
				
						
								三、分区表/索引的相关信息
						
				
		
		
				
						
						
				 
		
				
						    DBA|ALL|USER_PART_TABLES:显示所有分区表的分区信息
				
		
		
				
						
								
										    DBA|ALL|USER_TAB_PARTITIONS:显示分区层次的分区信息、分区存储参数、由ANALYZE决定的的统计数据
								
						
				
		
		
				
						
								
										
												    DBA|ALL|USER_TAB_SUBPARTITIONS:显示子分区层次的分区信息、分区存储参数、由ANALYZE决定的统计数据
										
								
						
				
		
		
				
						
								
										
												
														    DBA|ALL|USER_PART_KEY_COLUMNS:先是分区表的分区键值
												
										
								
						
				
		
		
				
						
								
										
												
														
																    DBA|ALL|USER_SUBPART_KEY_COLUMNS:显示组合分区表(和组合分区表上的局部索引)的子分区键列
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		    DBA|ALL|USER_PART_COL_STATISTICS:显示表分区的列统计数据和直方图信息
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		
																				    DBA|ALL|USER_SUBPART_COL_STATISTICS:显示表子分区的列统计数据和直方图信息
																		
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										
																												
																														
																																
																																		
																																				    DBA|ALL|USER_PART_HISTOGRAMS:显示表的分区上的直方图和直方图数据
																																		
																																
																														
																												
																										
																								
																						
																				
																		
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										
																												
																														
																																
																																		
																																				
																																						
																																								
																																										
																																												
																																														
																																																
																																																		
																																																				    DBA|ALL|USER_SUBPART_HISTOGRAMS:显示表的子分区上的直方图和直方图数据
																																																		
																																																
																																														
																																												
																																										
																																								
																																						
																																				
																																		
																																
																														
																												
																										
																								
																						
																				
																		
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										
																												
																														
																																
																																		
																																				
																																						
																																								
																																										
																																												
																																														
																																																
																																																		
																																																				
																																																						
																																																								
																																																										
																																																												
																																																														
																																																																
																																																																		
																																																																				    DBA|ALL|USER_PART_INDEXES:显示分区索引的分区信息
																																																																		
																																																																
																																																														
																																																												
																																																										
																																																								
																																																						
																																																				
																																																		
																																																
																																														
																																												
																																										
																																								
																																						
																																				
																																		
																																
																														
																												
																										
																								
																						
																				
																		
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										
																												
																														
																																
																																		
																																				
																																						
																																								
																																										
																																												
																																														
																																																
																																																		
																																																				
																																																						
																																																								
																																																										
																																																												
																																																														
																																																																
																																																																		
																																																																				
																																																																						
																																																																								
																																																																										
																																																																												
																																																																														
																																																																																
																																																																																		
																																																																																				    DBA|ALL|USER_IND_PARTITIONS:显示索引分区的:分区层次信息、分区存储参数、ANALYZE采集的统计数据
																																																																																		
																																																																																
																																																																														
																																																																												
																																																																										
																																																																								
																																																																						
																																																																				
																																																																		
																																																																
																																																														
																																																												
																																																										
																																																								
																																																						
																																																				
																																																		
																																																
																																														
																																												
																																										
																																								
																																						
																																				
																																		
																																
																														
																												
																										
																								
																						
																				
																		
																
														
												
										
								
						
				
		
		
				
						
								
										
												
														
																
																		
																				
																						
																								
																										
																												
																														
																																
																																		
																																				
																																						
																																								
																																										
																																												
																																														
																																																
																																																		
																																																				
																																																						
																																																								
																																																										
																																																												
																																																														
																																																																
																																																																		
																																																																				
																																																																						
																																																																								
																																																																										
																																																																												
																																																																														
																																																																																
																																																																																		
																																																																																				
																																																																																						
																																																																																								    DBA|ALL|USER_IND_SUBPARTITONS:显示索引子分区的:分区层次信息、分区存储参数、ANALYZE采集的统计数据