创建与管理Oracle分区表和本地索引的实例解析_Oracle_数据库_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 数据库 > Oracle > 创建与管理Oracle分区表和本地索引的实例解析

创建与管理Oracle分区表和本地索引的实例解析

 2013/8/10 1:20:06    程序员俱乐部  我要评论(0)
  • 摘要:创建与管理Oracle分区表和本地索引的相关知识是本文我们主要要介绍的内容,我们知道,Oracle的分区技术在某些条件下可以极大的提高查询的性能,所以被广泛采用。从产品上说,分区技术是Oracle企业版中独立收费的一个组件。以下是对于分区及本地索引的一个示例。首先根据字典表创建一个测试分区表:SQL>connecteygle/eygleConnected.SQL>CREATETABLEdbobjs2(OBJECT_IDNUMBERNOTNULL
  • 标签:创建 ORA 索引 实例 实例解析 Oracle 解析

创建与管理Oracle分区表本地索引的相关知识是本文我们主要要介绍的内容,我们知道,Oracle的分区技术在某些条件下可以极大的提高查询的性能,所以被广泛采用。从产品上说,分区技术是Oracle企业版中独立收费的一个组件。以下是对于分区及本地索引的一个示例。

首先根据字典表创建一个测试分区表:

    class="dp-xml">
  1. SQL> connect eygle/eygle   
  2. Connected.   
  3. SQL> CREATE TABLE dbobjs   
  4. 2 (OBJECT_ID NUMBER NOT NULL,   
  5. 3 OBJECT_NAME varchar2(128),   
  6. 4 CREATED DATE NOT NULL   
  7. 5 )   
  8. 6 PARTITION BY RANGE (CREATED)   
  9. 7 (PARTITION dbobjs_06 VALUES LESS THAN (TO_DATE('01/01/2007', 'DD/MM/YYYY')),   
  10. 8 PARTITION dbobjs_07 VALUES LESS THAN (TO_DATE('01/01/2008', 'DD/MM/YYYY')));   
  11. Table created.   
  12. SQL> COL segment_name for a20   
  13. SQL> COL PARTITION_NAME for a20   
  14. SQL> SELECT segment_name, partition_name, tablespace_name   
  15. 2 FROM dba_segments   
  16. 3 WHERE segment_name = 'DBOBJS';   
  17. SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME   
  18. -------------------- -------------------- ------------------------------   
  19. DBOBJS DBOBJS_06 EYGLE   
  20. DBOBJS DBOBJS_07 EYGLE 

创建一个Local索引,注意这里可以将不同分区的索引指定创建到不同的表空间:

  1. SQL> CREATE INDEX dbobjs_idx ON dbobjs (created) LOCAL   
  2. 2 (PARTITION dbobjs_06 TABLESPACE users,   
  3. 3 PARTITION dbobjs_07 TABLESPACE users   
  4. 4 );   
  5. Index created. 

这个子句可以进一步调整为类似:

  1. CREATE INDEX dbobjs_idx ON dbobjs (created) LOCAL   
  2. (PARTITION dbobjs_06 TABLESPACE users,   
  3. PARTITION dbobjs_07 TABLESPACE users   
  4. ) TABLESPACE users; 

通过统一的tablespace子句为索引指定表空间。

  1. SQL> COL segment_name for a20   
  2. SQL> COL PARTITION_NAME for a20   
  3. SQL> SELECT segment_name, partition_name, tablespace_name   
  4. 2 FROM dba_segments   
  5. 3 WHERE segment_name = 'DBOBJS_IDX';   
  6. SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME   
  7. -------------------- -------------------- ------------------------------   
  8. DBOBJS_IDX DBOBJS_06 USERS   
  9. DBOBJS_IDX DBOBJS_07 USERS   
  10. SQL> insert into dbobjs   
  11. 2 select object_id,object_name,created   
  12. 3 from dba_objects where created   
  13. 6227 rows created.   
  14. SQL> commit;   
  15. Commit complete.   
  16. SQL> select count(*) from dbobjs partition (DBOBJS_06);   
  17. COUNT(*)   
  18. ----------   
  19. 6154   
  20. SQL> select count(*) from dbobjs partition (dbobjs_07);   
  21. COUNT(*)   
  22. ----------   
  23. 73 

我们可以通过查询来对比一下分区表和非分区表的查询性能差异:

  1. SQL> set autotrace on   
  2.  SQL> select count(*) from dbobjs where created < to_date('01/01/2008','dd/mm/yyyy');   
  3. COUNT(*)   
  4. ----------   
  5. 6227   
  6. Execution Plan   
  7. ----------------------------------------------------------   
  8. 0 SELECT STATEMENT ptimizer=CHOOSE (Cost=1 Card=1 Bytes=9)   
  9. 1 0 SORT (AGGREGATE)   
  10. 2 1 PARTITION RANGE (ALL)   
  11. 3 2 INDEX (RANGE SCAN) OF 'DBOBJS_IDX' (NON-UNIQUE) (Cost=2 Card=8 Bytes=72)   
  12. Statistics   
  13. ----------------------------------------------------------   
  14. 0 recursive calls   
  15. 0 db block gets   
  16. 25 consistent gets   
  17. 0 physical reads   
  18. 0 redo size   
  19. 380 bytes sent via SQL*Net to client   
  20. 503 bytes received via SQL*Net from client   
  21. 2 SQL*Net roundtrips to/from client   
  22. 0 sorts (memory)   
  23. 0 sorts (disk)   
  24. 1 rows processed   
  25. SQL> select count(*) from dbobjs where created < to_date('01/01/2007','dd/mm/yyyy');   
  26. COUNT(*)   
  27. ----------   
  28. 6154   
  29. Execution Plan   
  30. ----------------------------------------------------------   
  31. 0 SELECT STATEMENT ptimizer=CHOOSE (Cost=1 Card=1 Bytes=9)   
  32. 1 0 SORT (AGGREGATE)   
  33. 2 1 INDEX (RANGE SCAN) OF 'DBOBJS_IDX' (NON-UNIQUE) (Cost=2 Card=4 Bytes=36)   
  34. Statistics   
  35. ----------------------------------------------------------   
  36. 0 recursive calls   
  37. 0 db block gets   
  38. 24 consistent gets   
  39. 0 physical reads   
  40. 0 redo size   
  41. 380 bytes sent via SQL*Net to client   
  42. 503 bytes received via SQL*Net from client   
  43. 2 SQL*Net roundtrips to/from client   
  44. 0 sorts (memory)   
  45. 0 sorts (disk)   
  46. 1 rows processed   
  47. SQL> select count(distinct(object_name)) from dbobjs where created < to_date('01/01/2007','dd/mm/yyyy');   
  48. COUNT(DISTINCT(OBJECT_NAME))   
  49. ----------------------------   
  50. 4753   
  51. Execution Plan   
  52. ----------------------------------------------------------   
  53. 0 SELECT STATEMENT ptimizer=CHOOSE (Cost=1 Card=1 Bytes=75)   
  54. 1 0 SORT (GROUP BY)   
  55. 2 1 TABLE ACCESS (BY LOCAL INDEX ROWID) OF 'DBOBJS' (Cost=1 Card=4 Bytes=300)   
  56. 3 2 INDEX (RANGE SCAN) OF 'DBOBJS_IDX' (NON-UNIQUE) (Cost=2 Card=1)   
  57. Statistics   
  58. ----------------------------------------------------------   
  59. 0 recursive calls   
  60. 0 db block gets   
  61. 101 consistent gets   
  62. 0 physical reads   
  63. 0 redo size   
  64. 400 bytes sent via SQL*Net to client   
  65. 503 bytes received via SQL*Net from client   
  66. 2 SQL*Net roundtrips to/from client   
  67. 1 sorts (memory)   
  68. 0 sorts (disk)   
  69. 1 rows processed 

对于非分区表的测试:

  1. SQL> CREATE TABLE dbobjs2   
  2. 2 (object_id NUMBER NOT NULL,   
  3. 3 object_name VARCHAR2(128),   
  4. 4 created DATE NOT NULL   
  5. 5 );   
  6. Table created.   
  7. SQL> CREATE INDEX dbobjs_idx2 ON dbobjs2 (created);   
  8. Index created.   
  9. SQL> insert into dbobjs2   
  10. 2 select object_id,object_name,created   
  11. 3 from dba_objects where created   
  12. 6227 rows created.   
  13. SQL> commit;   
  14. Commit complete.   
  15. SQL> select count(distinct(object_name)) from dbobjs2 where created < to_date('01/01/2007','dd/mm/yyyy');   
  16. COUNT(DISTINCT(OBJECT_NAME))   
  17. ----------------------------   
  18. 4753   
  19. Execution Plan   
  20. ----------------------------------------------------------   
  21. 0 SELECT STATEMENT ptimizer=CHOOSE   
  22. 1 0 SORT (GROUP BY)   
  23. 2 1 TABLE ACCESS (BY INDEX ROWID) OF 'DBOBJS2'   
  24. 3 2 INDEX (RANGE SCAN) OF 'DBOBJS_IDX2' (NON-UNIQUE)   
  25. Statistics   
  26. ----------------------------------------------------------   
  27. 0 recursive calls   
  28. 0 db block gets   
  29. 2670 consistent gets   
  30. 0 physical reads   
  31. 1332 redo size   
  32. 400 bytes sent via SQL*Net to client   
  33. 503 bytes received via SQL*Net from client   
  34. 2 SQL*Net roundtrips to/from client   
  35. 1 sorts (memory)   
  36. 0 sorts (disk)   
  37. 1 rows processed 

当增加表分区时,LOCAL索引被自动维护:

  1. SQL> ALTER TABLE dbobjs   
  2. 2 ADD PARTITION dbobjs_08 VALUES LESS THAN (TO_DATE('01/01/2009', 'DD/MM/YYYY'));   
  3. Table altered.   
  4. SQL> set autotrace off   
  5. SQL> COL segment_name for a20   
  6. SQL> COL PARTITION_NAME for a20   
  7. SQL> SELECT segment_name, partition_name, tablespace_name   
  8. 2 FROM dba_segments   
  9. 3 WHERE segment_name = 'DBOBJS_IDX';   
  10. SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME   
  11. -------------------- -------------------- ------------------------------   
  12. DBOBJS_IDX DBOBJS_06 USERS   
  13. DBOBJS_IDX DBOBJS_07 USERS   
  14. DBOBJS_IDX DBOBJS_08 EYGLE   
  15. SQL> SELECT segment_name, partition_name, tablespace_name   
  16. 2 FROM dba_segments   
  17. 3 WHERE segment_name = 'DBOBJS';   
  18. SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME   
  19. -------------------- -------------------- ------------------------------   
  20. DBOBJS DBOBJS_06 EYGLE   
  21. DBOBJS DBOBJS_07 EYGLE   
  22. DBOBJS DBOBJS_08 EYGLE 

关于创建与管理Oracle分区表和本地索引的相关知识及实例就介绍到这里了,如果您想了解更多关于Oracle数据库的知识,可以看一下这里的文章:http://database.51cto.com/oracle/,希望本次的介绍能够对您有所收获!

发表评论
用户名: 匿名