起原:收集
1.2.2. 盘问分区表记实: SQL> select * from dinya_test partition(part_01);
TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE
--------------------------------------------------------------------------------
1 12 BOOKS 2005-1-14 14:19:
2 12 BOOKS 2005-2-13 14:19:
SQL>
SQL> select * from dinya_test partition(part_02);
TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE
--------------------------------------------------------------------------------
3 12 BOOKS 2006-5-30
4 12 BOOKS 2007-6-23
SQL>
SQL> select * from dinya_test partition(part_03);
TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE
--------------------------------------------------------------------------------
5 12 BOOKS 2011-2-26
6 12 BOOKS 2011-4-30
SQL>
从盘问的结果可以看出,拔出的数据曾经凭据交易光阴范畴存储在差此外分区中。这里是指定了分区的盘问,固然也可以不指定分区,间接实验select * from dinya_test盘问一切记实。
在也检索的数据量很大的时辰,指定分区会大大提高检索速率。
1.2.3. 更新分区表的记实: SQL> update dinya_test partition(part_01) t set t.item_description=’DESK’ where
t.transaction_id=1;
1 row updated.
SQL> commit;
Commit complete.
SQL>
这里将第一个分区中的交易ID=1的记实中的item_description字段更新为“DESK”,可以看到曾经乐成更新了一条记实。然则当更新的时辰指定了分区,而凭据盘问的记实不在该分区中时,将不会更新数据,请看下面的例子: SQL> update dinya_test partition(part_01) t set t.item_description=’DESK’ where
t.transaction_id=6;
0 rows updated.
SQL> commit;
Commit complete.
SQL>
指定了在第一个分区中更新记实,然则前提中限制交易ID为6,而盘问全表,交易ID为6的记其实第三个分区中,何等该条语句将不会更新记实。
1.2.4. 删除分区表记实: SQL> delete from dinya_test partition(part_02) t where t.transaction_id=4;
1 row deleted.
SQL> commit;
Commit complete.
SQL>
下面例子删除了第二个分区part_02中的交易记实ID为4的一条记实,和更新数据沟通,如果指定了分区,而前提中的数据又不在该分区中时,将不会删除任何数据。
1.3. 分区表索引的运用:
分区表和普通表一样可以竖立索引,分区表可以竖立局部索引和全局索引。当分区中出现许多事件并且要保证一切分区中的数据记实的独一性时采用全局索引。
1.3.1. 局部索引分区的竖立: SQL> create index dinya_idx_t on dinya_test(item_id)
2 local
3 (
4 partition idx_1 tablespace dinya_space01,
5 partition idx_2 tablespace dinya_space02,
6 partition idx_3 tablespace dinya_space03
7 );
Index created.
SQL>
看盘问的实验摒挡,从下面的实验摒挡可以看出,系统曾经运用了索引: SQL> select * from dinya_test partition(part_01) t where t.item_id=12;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=187)
1 0 TABLE ACCESS (BY LOCAL INDEX ROWID) OF ’DINYA_TEST’ (Cost=
2 Card=1 Bytes=187)
2 1 INDEX (RANGE SCAN) OF ’DINYA_IDX_T’ (NON-UNIQUE) (Cost=1
Card=1)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
334 bytes sent via SQL*Net to client
309 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
2 rows processed
SQL>
1.3.2. 全局索引分区的竖立
全局索引竖马上global 子句答理指定索引的范畴值,这个范畴值为索引字段的范畴值: SQL> create index dinya_idx_t on dinya_test(item_id)
2 global partition by range(item_id)
3 (
4 partition idx_1 values less than (1000) tablespace dinya_space01,
5 partition idx_2 values less than (10000) tablespace dinya_space02,
6 partition idx_3 values less than (maxvalue) tablespace dinya_space03
7 );
Index created.
SQL>
本例中对表的item_id字段竖立索引分区,固然也可以不指定索引分区名间接对整个表竖立索引,如: SQL> create index dinya_idx_t on dinya_test(item_id);
Index created.
SQL>
异常的,对全局索引凭据实验摒挡可以看出索引曾经可以运用: SQL> select * from dinya_test t where t.item_id=12;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=3 Bytes=561)
1 0 TABLE ACCESS (BY GLOBAL INDEX ROWID) OF ’DINYA_TEST’ (Cost
=2 Card=3 Bytes=561)
2 1 INDEX (RANGE SCAN) OF ’DINYA_IDX_T’ (NON-UNIQUE) (Cost=1
Card=3)
Statistics
----------------------------------------------------------
5 recursive calls
0 db block gets
10 consistent gets
0 physical reads
0 redo size
420 bytes sent via SQL*Net to client
309 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
3 sorts (memory)
0 sorts (disk)
5 rows processed
SQL>
1.4. 分区表的维护:
体味了分区表的竖立、索引的竖立、表和索引的运用后,在操纵的还要平日对分区举办维护和管理。一样往常维护和管理的内容包罗:添加一个分区,兼并一个分区及删除分区等等。下面以范畴分区为例剖析');添加、兼并、删除分区的普通操纵:
1.4.1. 添加一个分区: SQL> alter table dinya_test
2 add partition part_04 values less than(to_date(’2012-01-01’,’yyyy-mm-dd’))
tablespace dinya_spa
ce03;
Table altered.
SQL>
添加一个分区的时辰,添加的分区的前提必需大于现有分区的最大值,不然系统将提示ORA-14074 partition bound must collate higher than that of the last partition 错误。
1.4.2. 兼并一个分区: SQL> alter table dinya_test merge partitions part_01,part_02 into partition part_02;
Table altered.
SQL>
在本例中将原有的表的part_01分区和part_02分区举办了兼并,兼并后的分区为part_02,如果在兼并的时辰把兼并后的分区定为part_01的时辰,系统将提示ORA-14275 cannot reuse lower-bound partition as resulting partition 错误。
1.4.3. 删除分区: SQL> alter table dinya_test drop partition part_01;
Table altered.
SQL>
删除分区表的一个分区后,盘问该表的数据时表现,该分区中的数据已一切丢失,所以实验删除分区举措时要稳重,确保先备份数据后再实验,或将分区兼并。
1.5. 总结:
需要剖析');的是,本文在举例说名分区表事件操纵的时辰,都指定了分区,因为指定了分区,系统在实验的时辰则只操纵该分区的记实,提高了数据措置的速率。不要指定分区间接操纵数据也是可以的。在分区表上建索引及多索引的运用和非分区表一样。此外,因为在维护分区的时辰或许对分区的索引会孕育发作一定的影响,或许需要在维护之后重建索引,相关内容请参考分区表索引局部的文档 .
版权声明:
原创作品,答理转载,转载时请务必以超链接情势标明文章 原始出处 、作者信息和本声明。不然将穷究司法责任。