Chinaunix首页 | 论坛 | 博客
  • 博客访问: 593223
  • 博文数量: 57
  • 博客积分: 877
  • 博客等级: 准尉
  • 技术积分: 1275
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-24 16:16
文章分类

全部博文(57)

文章存档

2014年(2)

2013年(15)

2012年(20)

2011年(20)

我的朋友

分类: Oracle

2012-06-14 17:34:25

一:建立一个分区表,并插入数据:

点击(此处)折叠或打开

  1. SQL> create table part_tab (id1 number,id2 number)
  2. 2 partition by RANGE (id1)
  3. 3 (
  4. 4 partition p1 values less than (20),
  5. 5 partition p2 values less than (40),
  6. 6 partition p3 values less than (60),
  7. 7 partition p4 values less than (maxvalue)
  8. 8 );
  9. Table created.
  10. SQL>
  11. SQL> insert into part_tab select user_id,trunc(dbms_random.value(1,100)) from dba_users;
  12. 37 rows created.
  13. SQL>
  14. SQL> commit;
  15. Commit complete.


二:建立索引

   在分区表上建立索引可以分为全局索引和本地索引:全局索引是针对整张表建立的一个索引,可以在建立索引的时候根据索引键进行相应的分区;


 

点击(此处)折叠或打开

  1. SQL> create index global_index on part_tab(id1) global
  2. 2 partition by range(id1)
  3. 3 (
  4. 4 partition p1 values less than (50),
  5. 5 partition p2 values less than (maxvalue)
  6. 6 );
  7. Index created.
  8. SQL> create index global_index2 on part_tab(id2) global
  9. 2 partition by range(id2)
  10. 3 (
  11. 4 partition p1 values less than (50),
  12. 5 partition p2 values less than (maxvalue)
  13. 6 );
  14. Index created.

以上就是对id1id2字段建立了2个全局索引

 

建立全局索引的时候索引键必须是索引分区键的前缀,不然建立索引的时候会报错:


 

点击(此处)折叠或打开

  1. SQL> create index global_index2 on part_tab(id2) global
  2. 2 partition by range(id1)
  3. 3 (
  4. 4 partition p1 values less than (50),
  5. 5 partition p2 values less than (maxvalue)
  6. 6 )
  7. 7 ;
  8. partition by range(id1)
  9. *
  10. ERROR at line 2:
  11. ORA-14038: GLOBAL partitioned index must be prefixed
  12. SQL> create index global_index5 on part_tab(id2,id1) global
  13. 2 partition by range(id2)
  14. 3 (
  15. 4 partition p1 values less than (50),
  16. 5 partition p2 values less than (maxvalue)
  17. 6 );
  18. Index created.

如果建立本地索引的时候,要建立的字段已经建立的全局索引,那建立这个索引的时候也要报错,反之亦然:

点击(此处)折叠或打开

  1. SQL> create index local_index1 on part_tab(id1) local;
  2. create index local_index1 on part_tab(id1) local
  3. *
  4. ERROR at line 1:
  5. ORA-01408: such column list already indexed
  6. SQL> create index local_index1 on part_tab(id2) local;
  7. create index local_index1 on part_tab(id2) local
  8. *
  9. ERROR at line 1:
  10. ORA-01408: such column list already indexed


 删除其中之一就可以正确建立:

点击(此处)折叠或打开

  1. SQL> drop index global_index2;
  2. Index dropped.
  3. SQL> create index local_index1 on part_tab(id2) local;
  4. Index created.


三:增加分区

    增加分区的时候,本地索引会自动更新,会自动增加相应的分区索引;而全局索引则不会,如果增加分区的时候没加上update global indexes 字句的时候,全局索引就会失效:

 

在原先分区表的基础上增加一个分区

点击(此处)折叠或打开

  1. SQL> alter table part_tab add partition p5 values less than (80);
  2. alter table part_tab add partition p5 values less than (80)
  3. *
  4. ERROR at line 1:
  5. ORA-14074: partition bound must collate higher than that of the last partition

报错,意思就是说现在要建立的分区值必须大于最后一个的分区值

 

这里可以有2种方法:

 1:把大的那个分区删掉,再增加相应的分区,但这样会丢失数据


 

点击(此处)折叠或打开

  1. SQL> select * from part_tab where id1 > 60;
  2. ID1 ID2
  3. ---------- ----------
  4. 86 7
  5. 88 18
  6. 70 25
  7. 65 34
  8. 78 51
  9. 76 57
  10. 67 59
  11. 85 60
  12. 91 62
  13. 89 63
  14. 74 66
  15. ID1 ID2
  16. ---------- ----------
  17. 75 66
  18. 87 68
  19. 84 73
  20. 2147483638 81
  21. 83 82
  22. 72 89
  23. 79 89
  24. 61 92
  25. 90 95
  26. 20 rows selected.
  27. SQL> alter table part_tab drop partition p4 update global indexes;
  28. Table altered.
  29. SQL> select * from part_tab where id1 > 60;
  30. no rows selected
  31. SQL> alter table part_tab add partition p4 values less than (maxvalue);
  32. Table altered.

2SPLIT PARTITION,分割那个分区,但对应分区上的本地索引会失效,分割完以后要重建这个本地索引

点击(此处)折叠或打开

  1. SQL> select count(*) from part_tab where id1 > 60;
  2. COUNT(*)
  3. ----------
  4. 20
  5. SQL> ALTER TABLE part_tab SPLIT PARTITION p4 AT (80) INTO (PARTITION P5, PARTITION P4) UPDATE GLOBAL INDEXES ;
  6. Table altered.
  7. SQL> select count(*) from part_tab where id1 > 60;
  8. COUNT(*)
  9. ----------
  10. 20
  11. SQL> select * from part_tab where id1 > 80;
  12. ID1 ID2
  13. ---------- ----------
  14. 90 4
  15. 2147483638 5
  16. 89 21
  17. 84 24
  18. 86 28
  19. 83 36
  20. 87 52
  21. 85 62
  22. 88 70
  23. 91 95
  24. 10 rows selected.
  25. SQL> select index_name,partition_name,status from user_ind_partitions;
  26. INDEX_NAME PARTITION_NAME STATUS
  27. ------------------------------ ------------------------------ --------
  28. GLOBAL_INDEX P1 USABLE
  29. GLOBAL_INDEX P2 USABLE
  30. LOCAL_INDEX1 P2 USABLE
  31. LOCAL_INDEX1 P1 USABLE
  32. INDEX_NAME PARTITION_NAME STATUS
  33. ------------------------------ ------------------------------ --------
  34. LOCAL_INDEX1 P3 USABLE
  35. GLOBAL_INDEX5 P1 USABLE
  36. GLOBAL_INDEX5 P2 USABLE
  37. LOCAL_INDEX1 P5 UNUSABLE
  38. LOCAL_INDEX1 P4 UNUSABLE
  39. SQL> alter index local_index1 rebuild partition p4;
  40. Index altered.
  41. SQL> alter index local_index1 rebuild partition p5;
  42. Index altered.




 

阅读(7614) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~