网站怎么做搜索功能,c 网站模板,网站建设营销推广工作,竞价防恶意点击Oracle中的分区表是Oracle中的一个很好的特性#xff0c;可以把大表划分成多个小表#xff0c;从而提高对于该大表的SQL执行效率#xff0c;而各个分区对应用又是透明的。分区表中的每个分区有独立的存储特性#xff0c;包括表空间、PCT_FREE等。那分区表中的各分区表空间之… Oracle中的分区表是Oracle中的一个很好的特性可以把大表划分成多个小表从而提高对于该大表的SQL执行效率而各个分区对应用又是透明的。分区表中的每个分区有独立的存储特性包括表空间、PCT_FREE等。那分区表中的各分区表空间之间有什么关系新建的分区会创建在哪个表空间中呢对应的local分区索引又会使用哪个表空间呢下面使用一个例子来解释上面的这些问题。创建测试分区表zxTESTcreate table t (id number,name varchar2(10))2 tablespace users3 partition by range(id)4 (5 partition p1 values less than (10) tablespace example,6 partition p2 values less than (20) tablespace system,7 partition p3 values less than (30)8 );上面创建了一个range分区表T对表T指定了表空间为users分区p1表空间为example分区p2表空间为system分区p3表空间没有指定。下面分别从user_tables、user_tab_partitions视图中查看对应的表空间zxTESTcol tablespace_name for a30
zxTESTcol partition_name for a30
zxTESTselect tablespace_name,partitioned from user_tables where table_nameT;TABLESPACE_NAME PARTITION
------------------------------ ---------YESzxTESTselect partition_name,tablespace_name from user_tab_partitions where table_nameT;PARTITION_NAME TABLESPACE_NAME
------------------------------ ------------------------------
P1 EXAMPLE
P2 SYSTEM
P3 USERS从上面的查询可以看出分区表T在user_tables视图中没有记录表空间名的信息分区P1和P2对应的分区与建表语句中指定的一致分区P3对应的分区与表T指定的表空间一致为USERS。难道表T就没有表空间属性么我们使用dbms_metadata.get_ddl查看表T的语句从上图中可以看出表T其实也是有表空间属性的就是在建表时指定的USERS表空间。而分区P3继承了这一属性。那为什么说是分区P3继承了这一属性呢我们查询下面的视图zxTESTcol table_name for a30
zxTESTselect table_name,def_tablespace_name from user_part_tables;TABLE_NAME DEF_TABLESPACE_NAME
------------------------------ ---------------------------------
T USERS官方文档对列def_tablespace_name的解释是Default tablespace to be used when adding a partition。从上面的查询可以知道表T的分区如果没有明确指定表空间时都会使用USERS表空间。事实是这样么下面给表T添加一个表空间zxTESTalter table t add partition p4 values less than (40);Table altered.zxTESTselect partition_name,tablespace_name from user_tab_partitions where table_nameT;PARTITION_NAME TABLESPACE_NAME
------------------------------ ------------------------------
P1 EXAMPLE
P2 SYSTEM
P3 USERS
P4 USERS从上面可以看到新添加的分区P4对应的表空间是USERS证实了前面的观点。如果当前的表空间已经无法扩展想把新加的分区创建到其他表空间中而在加表空间时不指定表空间信息可以实现么答案是肯定可以。zxTESTalter table t modify default attributes tablespace example;Table altered.zxTESTselect table_name,def_tablespace_name from user_part_tables;TABLE_NAME DEF_TABLESPACE_NAME
------------------------------ ------------------------------------------------------------------------------------------
T EXAMPLEzxTESTalter table t add partition p5 values less than (50);Table altered.zxTESTselect partition_name,tablespace_name from user_tab_partitions where table_nameT;PARTITION_NAME TABLESPACE_NAME
------------------------------ ------------------------------
P1 EXAMPLE
P2 SYSTEM
P3 USERS
P4 USERS
P5 EXAMPLE从上面可以看到在修改了表T的表空间属性后新加的分区P5创建在EXAMPLE表空间中。下面再来看local分区索引对应的表空间。先在表上创建一个分区索引。zxTESTcreate index idx_t on t(id) local;Index created.下面看看local分区索引对应的表空间的属性zxTESTselect tablespace_name,partitioned from user_indexes where index_nameIDX_T;TABLESPACE_NAME PARTITION
------------------------------ ---------YESzxTESTselect partition_name,partition_position,tablespace_name from user_ind_partitions where index_nameIDX_T;PARTITION_NAME PARTITION_POSITION TABLESPACE_NAME
------------------------------ ------------------ ------------------------------
P1 1 EXAMPLE
P2 2 SYSTEM
P3 3 USERS
P4 4 USERS
P5 5 EXAMPLE从上面的查询可以看出local分区索引上没有表空间信息而每个索引分区对应的表空间名与相应的分区所在的表空间一致。我们同样使用dbms_metadata包来查看索引的建表语句从上图可以看到索引IDX_T确实没有表空间属性。我们再来查看user_part_index来验证一下是否是真的呢zxTESTcol index_name for a30
zxTESTcol def_tablespace_name for a30
zxTESTselect index_name,def_tablespace_name from user_part_indexes where index_nameIDX_T;INDEX_NAME DEF_TABLESPACE_NAME
------------------------------ ------------------------------
IDX_T从上面的查询中可以看到索引IDX_T也没有默认的表空间存储选项而在官方文档中看到New partitions or subpartitions added to the local index will be created in the same tablespace(s) as the corresponding partitions or subpartitions of the underlying table。说明local分区索引默认与相关联的表分区在同一个表空间上面的查询也可以验证这一结论。那可以把local分区索引所在的表空间与表分区所在的表空间分开来么答案是肯定可以的。在创建本地索引进指定表空间参数即可zxTESTdrop index idx_t;Index dropped.zxTESTcreate index idx_t on t(id) local tablespace sysaux;Index created.zxTESTselect tablespace_name,partitioned from user_indexes where index_nameIDX_T;TABLESPACE_NAME PARTITION
------------------------------ ---------YESzxTESTselect partition_name,partition_position,tablespace_name from user_ind_partitions where index_nameIDX_T;PARTITION_NAME PARTITION_POSITION TABLESPACE_NAME
------------------------------ ------------------ ------------------------------
P1 1 SYSAUX
P2 2 SYSAUX
P3 3 SYSAUX
P4 4 SYSAUX
P5 5 SYSAUXzxTESTselect index_name,def_tablespace_name from user_part_indexes where index_nameIDX_T;INDEX_NAME DEF_TABLESPACE_NAME
------------------------------ ------------------------------
IDX_T SYSAUX从上面的查询中可以看到所有的分区索引的表空间都为SYSAUX。创建一个新的分区看对应的分区索引是否还是在SYSAUX表空间zxTESTalter table t add partition p6 values less than (60);Table altered.zxTESTselect partition_name,partition_position,tablespace_name from user_ind_partitions where index_nameIDX_T;PARTITION_NAME PARTITION_POSITION TABLESPACE_NAME
------------------------------ ------------------ ------------------------------
P1 1 SYSAUX
P2 2 SYSAUX
P3 3 SYSAUX
P4 4 SYSAUX
P5 5 SYSAUX
P6 6 SYSAUX从上面可以看出新的分区索引所在的表空间仍是SYSAUX。下面来看如何修改新分区索引创建的对应的表空间zxTESTalter index idx_t modify default attributes tablespace users;Index altered.zxTESTselect index_name,def_tablespace_name from user_part_indexes where index_nameIDX_T;INDEX_NAME DEF_TABLESPACE_NAME
------------------------------ ------------------------------
IDX_T USERSzxTESTalter table t add partition p7 values less than (70);Table altered.zxTESTselect partition_name,partition_position,tablespace_name from user_ind_partitions where index_nameIDX_T;PARTITION_NAME PARTITION_POSITION TABLESPACE_NAME
------------------------------ ------------------ ------------------------------
P1 1 SYSAUX
P2 2 SYSAUX
P3 3 SYSAUX
P4 4 SYSAUX
P5 5 SYSAUX
P6 6 SYSAUX
P7 7 USERS从上面的结果可以看出新加分区对应的分区索引的表空间变为了新指定的USERS。修改成功。 转载于:https://blog.51cto.com/hbxztc/1929585