程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 創建與管理Oracle分區表和本地索引的實例解析

創建與管理Oracle分區表和本地索引的實例解析

編輯:Oracle數據庫基礎

創建與管理Oracle分區表本地索引的相關知識是本文我們主要要介紹的內容,我們知道,Oracle的分區技術在某些條件下可以極大的提高查詢的性能,所以被廣泛采用。從產品上說,分區技術是Oracle企業版中獨立收費的一個組件。以下是對於分區及本地索引的一個示例。

首先根據字典表創建一個測試分區表:

  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 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved