创建与维护Oracle分区表和本地索引

来源:互联网 发布:小蜜蜂数控切割机编程 编辑:程序博客网 时间:2024/05/19 22:49


【原文: http://www.searchdatabase.com.cn/showcontent_12937.htm 】

Oracle的分区技术在某些条件下可以极大的提高查询的性能,所以被广泛采用。从产品上说,分区技术是Oracle企业版中独立收费的一个组件。以下是对于分区及本地索引的一个示例。

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


  SQL> connect eygle/eygle  
  Connected.  
  SQL> create TABLE dbobjs  
  2 (OBJECT_ID NUMBER NOT NULL,  
  3 OBJECT_NAME varchar2(128),  
  4 createD DATE NOT NULL  
  5 )  
  6 PARTITION BY RANGE (createD)  
  7 (PARTITION dbobjs_06 VALUES LESS THAN (TO_DATE(’01/01/2007’, ’DD/MM/YYYY’)), 
  8 PARTITION dbobjs_07 VALUES LESS THAN (TO_DATE(’01/01/2008’, ’DD/MM/YYYY’))); 
  Table created.  
  SQL> COL segment_name for a20  
  SQL> COL PARTITION_NAME for a20  
  SQL> select segment_name, partition_name, tablespace_name  
  2 FROM dba_segments  
  3 where segment_name = ’DBOBJS’;  
  SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME  
  -------------------- -------------------- ------------------------------  
  DBOBJS DBOBJS_06 EYGLE  
  DBOBJS DBOBJS_07 EYGLE 

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

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

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


  create INDEX dbobjs_idx ON dbobjs (created) LOCAL  
  (PARTITION dbobjs_06 TABLESPACE users,  
  PARTITION dbobjs_07 TABLESPACE users  
  ) TABLESPACE users; 

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

SQL> COL segment_name for a20  
  SQL> COL PARTITION_NAME for a20  
  SQL> select segment_name, partition_name, tablespace_name  
  2 FROM dba_segments  
  3 where segment_name = ’DBOBJS_IDX’;  
  SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME  
  -------------------- -------------------- ------------------------------  
  DBOBJS_IDX DBOBJS_06 USERS  
  DBOBJS_IDX DBOBJS_07 USERS  
  SQL> insert into dbobjs  
  2 select object_id,object_name,created  
  3 from dba_objects where created  
  6227 rows created.  
  SQL> commit;  
  Commit complete.  
  SQL> select count(*) from dbobjs partition (DBOBJS_06);  
  count(*)  
  ----------  
  6154  
  SQL> select count(*) from dbobjs partition (dbobjs_07);  
  count(*)  
  ----------  
  73 


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


  SQL> set autotrace on  
  SQL> select count(*) from dbobjs where created < to_date(’01/01/2008’,’dd/mm/yyyy’); 
  count(*)  
  ----------  
  6227  
  execution Plan  
  ----------------------------------------------------------  
  0 select STATEMENT ptimizer=CHOOSE (Cost=1 Card=1 Bytes=9)  
  1 0 SORT (AGGREGATE)  
  2 1 PARTITION RANGE (ALL)  
  3 2 INDEX (RANGE SCAN) OF ’DBOBJS_IDX’ (NON-UNIQUE) (Cost=2 Card=8 Bytes=72)  
  Statistics  
  ----------------------------------------------------------  
  0 recursive calls  
  0 db block gets  
  25 consistent gets  
  0 physical reads  
  0 redo size  
  380 bytes sent via SQL*Net to client  
  503 bytes received via SQL*Net from client  
  2 SQL*Net roundtrips to/from client  
  0 sorts (memory)  
  0 sorts (disk)  
  1 rows processed  
  SQL> select count(*) from dbobjs where created < to_date(’01/01/2007’,’dd/mm/yyyy’); 
  count(*)  
  ----------  
  6154  
  execution Plan  
  ----------------------------------------------------------  
  0 select STATEMENT ptimizer=CHOOSE (Cost=1 Card=1 Bytes=9)  
  1 0 SORT (AGGREGATE)  
  2 1 INDEX (RANGE SCAN) OF ’DBOBJS_IDX’ (NON-UNIQUE) (Cost=2 Card=4 Bytes=36)  
  Statistics  
  ----------------------------------------------------------  
  0 recursive calls  
  0 db block gets  
  24 consistent gets  
  0 physical reads  
  0 redo size  
  380 bytes sent via SQL*Net to client  
  503 bytes received via SQL*Net from client  
  2 SQL*Net roundtrips to/from client  
  0 sorts (memory)  
  0 sorts (disk)  
  1 rows processed  
  SQL> select count(distinct(object_name)) from dbobjs where created < to_date(’01/01/2007’,’dd/mm/yyyy’);  
  count(DISTINCT(OBJECT_NAME))  
  ----------------------------  
  4753  
  execution Plan  
  ----------------------------------------------------------  
  0 select STATEMENT ptimizer=CHOOSE (Cost=1 Card=1 Bytes=75)  
  1 0 SORT (GROUP BY)  
  2 1 TABLE ACCESS (BY LOCAL INDEX ROWID) OF ’DBOBJS’ (Cost=1 Card=4 Bytes=300)  
  3 2 INDEX (RANGE SCAN) OF ’DBOBJS_IDX’ (NON-UNIQUE) (Cost=2 Card=1)  
  Statistics  
  ----------------------------------------------------------  
  0 recursive calls  
  0 db block gets  
  101 consistent gets  
  0 physical reads  
  0 redo size  
  400 bytes sent via SQL*Net to client  
  503 bytes received via SQL*Net from client  
  2 SQL*Net roundtrips to/from client  
  1 sorts (memory)  
  0 sorts (disk)  
  1 rows processed

       对于非分区表的测试:

SQL> create TABLE dbobjs2  
  2 (object_id NUMBER NOT NULL,  
  3 object_name VARchar2(128),  
  4 created DATE NOT NULL  
  5 );  
  Table created.  
  SQL> create INDEX dbobjs_idx2 ON dbobjs2 (created);  
  Index created.  
  SQL> insert into dbobjs2  
  2 select object_id,object_name,created  
  3 from dba_objects where created  
  6227 rows created.  
  SQL> commit;  
  Commit complete.  
  SQL> select count(distinct(object_name)) from dbobjs2 where created < to_date(’01/01/2007’,’dd/mm/yyyy’);  
  count(DISTINCT(OBJECT_NAME))  
  ----------------------------  
  4753  
  execution Plan  
  ----------------------------------------------------------  
  0 select STATEMENT ptimizer=CHOOSE  
  1 0 SORT (GROUP BY)  
  2 1 TABLE ACCESS (BY INDEX ROWID) OF ’DBOBJS2’  
  3 2 INDEX (RANGE SCAN) OF ’DBOBJS_IDX2’ (NON-UNIQUE)  
  Statistics  
  ----------------------------------------------------------  
  0 recursive calls  
  0 db block gets  
  2670 consistent gets  
  0 physical reads  
  1332 redo size  
  400 bytes sent via SQL*Net to client  
  503 bytes received via SQL*Net from client  
  2 SQL*Net roundtrips to/from client  
  1 sorts (memory)  
  0 sorts (disk)  
  1 rows processed 

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


SQL> alter TABLE dbobjs  
  2 ADD PARTITION dbobjs_08 VALUES LESS THAN (TO_DATE(’01/01/2009’, ’DD/MM/YYYY’)); 
  Table altered.  
  SQL> set autotrace off  
  SQL> COL segment_name for a20  
  SQL> COL PARTITION_NAME for a20  
  SQL> select segment_name, partition_name, tablespace_name  
  2 FROM dba_segments  
  3 where segment_name = ’DBOBJS_IDX’;  
  SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME  
  -------------------- -------------------- ------------------------------  
  DBOBJS_IDX DBOBJS_06 USERS  
  DBOBJS_IDX DBOBJS_07 USERS  
  DBOBJS_IDX DBOBJS_08 EYGLE  
  SQL> select segment_name, partition_name, tablespace_name  
  2 FROM dba_segments  
  3 where segment_name = ’DBOBJS’;  
  SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME  
  -------------------- -------------------- ------------------------------  
  DBOBJS DBOBJS_06 EYGLE  
  DBOBJS DBOBJS_07 EYGLE  
  DBOBJS DBOBJS_08 EYGLE 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 京东商家退货怎么办 发货后退货邮费怎么办 淘宝货到退款怎么办 淘宝收不到货怎么办 淘宝不处理投诉怎么办 实体店不能退货怎么办 顾客无理由退货怎么办 京东衣服质量问题怎么办 买家退货要运费怎么办 卖家不给退运费怎么办 淘宝申请退款卖家不退怎么办 网购商家报复怎么办 淘宝退货店家不同意怎么办 淘宝退货不同意退款怎么办 运费险没收到怎么办 地税逾期未申报怎么办 转转买家发到付怎么办 捡到苹果手机打不开怎么办 捡到指纹手机打不开怎么办 捡到手机密码打不开怎么办 遇到假苹果售后怎么办 做微商被骗囤货怎么办 代理如果不做了怎么办 微商加盟费不退怎么办 手机背面发霉了怎么办 手机电池被换了怎么办 苹果6pcpu发热怎么办 手机漏电怎么办手发麻 iphone主板烧了怎么办 ioS13.1抹掉数据怎么办 阿迪达斯 实体店 假货 怎么办 椰子v2鞋底发黄怎么办 椰子鞋 白色脏了怎么办 微信照片过期怎么办 开淘宝店快递怎么办 淘宝下架cmcc怎么办 别人说你穿假鞋怎么办 浅色裤子染色了怎么办 鞋扣不粘了怎么办 船鞋穿久了会臭怎么办 aj1鞋头开胶怎么办