设为首页 收藏本站
查看: 491|回复: 0

[经验分享] 创建与管理Oracle的分区表和本地索引

[复制链接]
YunVN网友  发表于 2016-8-14 07:33:48 |阅读模式
  在网上看到eygle写的一篇关于分区表和本地索引的文章,感觉总结的挺好,特转了过来。
  Oracle分区技术在某些条件下可以极大的提高查询的性能,所以被广泛采用。从产品上说,分区技术是Oracle企业版中独立收费的一个组件。以下是对于分区及本地索引的一个示例。
  首先根据字典表创建一个测试分区表:
  
SQL>connecteygle/eygle
  Connected.
  SQL>CREATETABLEdbobjs
  2(OBJECT_IDNUMBERNOTNULL,
  3OBJECT_NAMEvarchar2(128),
  4CREATEDDATENOTNULL
  5)
  6PARTITIONBYRANGE(CREATED)
  7(PARTITIONdbobjs_06VALUESLESSTHAN(TO_DATE('01/01/2007','DD/MM/YYYY')),
  8PARTITIONdbobjs_07VALUESLESSTHAN(TO_DATE('01/01/2008','DD/MM/YYYY')));
  Tablecreated.
  SQL>COLsegment_namefora20
  SQL>COLPARTITION_NAMEfora20
  SQL>SELECTsegment_name,partition_name,tablespace_name
  2FROMdba_segments
  3WHEREsegment_name='DBOBJS';
  SEGMENT_NAMEPARTITION_NAMETABLESPACE_NAME
  ----------------------------------------------------------------------
  DBOBJSDBOBJS_06EYGLE
  DBOBJSDBOBJS_07EYGLE
  创建一个Local索引,注意这里可以将不同分区的索引指定创建到不同的表空间
  
SQL>CREATEINDEXdbobjs_idxONdbobjs(created)LOCAL
  2(PARTITIONdbobjs_06TABLESPACEusers,
  3PARTITIONdbobjs_07TABLESPACEusers
  4);
  Indexcreated.
  这个子句可以进一步调整为类似:
  
CREATEINDEXdbobjs_idxONdbobjs(created)LOCAL
  (PARTITIONdbobjs_06TABLESPACEusers,
  PARTITIONdbobjs_07TABLESPACEusers
  )TABLESPACEusers;
  
通过统一的tablespace子句为索引指定表空间。  
  
SQL>COLsegment_namefora20
  SQL>COLPARTITION_NAMEfora20
  SQL>SELECTsegment_name,partition_name,tablespace_name
  2FROMdba_segments
  3WHEREsegment_name='DBOBJS_IDX';
  SEGMENT_NAMEPARTITION_NAMETABLESPACE_NAME
  ----------------------------------------------------------------------
  DBOBJS_IDXDBOBJS_06USERS
  DBOBJS_IDXDBOBJS_07USERS
  SQL>insertintodbobjs
  2selectobject_id,object_name,created
  3fromdba_objectswherecreated
  6227rowscreated.
  SQL>commit;
  Commitcomplete.
  SQL>selectcount(*)fromdbobjspartition(DBOBJS_06);
  COUNT(*)
  ----------
  6154
  SQL>selectcount(*)fromdbobjspartition(dbobjs_07);
  COUNT(*)
  ----------
  73
  我们可以通过查询来对比一下分区表和非分区表的查询性能差异:
  
SQL>setautotraceon
  SQL>selectcount(*)fromdbobjswherecreated<to_date('01/01/2008','dd/mm/yyyy');
  COUNT(*)
  ----------
  6227
  ExecutionPlan
  ----------------------------------------------------------
  0SELECTSTATEMENTptimizer=CHOOSE(Cost=1Card=1Bytes=9)
  10SORT(AGGREGATE)
  21PARTITIONRANGE(ALL)
  32INDEX(RANGESCAN)OF'DBOBJS_IDX'(NON-UNIQUE)(Cost=2Card=8Bytes=72)
  Statistics
  ----------------------------------------------------------
  0recursivecalls
  0dbblockgets
  25consistentgets
  0physicalreads
  0redosize
  380bytessentviaSQL*Nettoclient
  503bytesreceivedviaSQL*Netfromclient
  2SQL*Netroundtripsto/fromclient
  0sorts(memory)
  0sorts(disk)
  1rowsprocessed
  SQL>selectcount(*)fromdbobjswherecreated<to_date('01/01/2007','dd/mm/yyyy');
  COUNT(*)
  ----------
  6154
  ExecutionPlan
  ----------------------------------------------------------
  0SELECTSTATEMENTptimizer=CHOOSE(Cost=1Card=1Bytes=9)
  10SORT(AGGREGATE)
  21INDEX(RANGESCAN)OF'DBOBJS_IDX'(NON-UNIQUE)(Cost=2Card=4Bytes=36)
  Statistics
  ----------------------------------------------------------
  0recursivecalls
  0dbblockgets
  24consistentgets
  0physicalreads
  0redosize
  380bytessentviaSQL*Nettoclient
  503bytesreceivedviaSQL*Netfromclient
  2SQL*Netroundtripsto/fromclient
  0sorts(memory)
  0sorts(disk)
  1rowsprocessed
  SQL>selectcount(distinct(object_name))fromdbobjswherecreated<to_date('01/01/2007','dd/mm/yyyy');
  COUNT(DISTINCT(OBJECT_NAME))
  ----------------------------
  4753
  ExecutionPlan
  ----------------------------------------------------------
  0SELECTSTATEMENTptimizer=CHOOSE(Cost=1Card=1Bytes=75)
  10SORT(GROUPBY)
  21TABLEACCESS(BYLOCALINDEXROWID)OF'DBOBJS'(Cost=1Card=4Bytes=300)
  32INDEX(RANGESCAN)OF'DBOBJS_IDX'(NON-UNIQUE)(Cost=2Card=1)
  Statistics
  ----------------------------------------------------------
  0recursivecalls
  0dbblockgets
  101consistentgets
  0physicalreads
  0redosize
  400bytessentviaSQL*Nettoclient
  503bytesreceivedviaSQL*Netfromclient
  2SQL*Netroundtripsto/fromclient
  1sorts(memory)
  0sorts(disk)
  1rowsprocessed
对于非分区表的测试:  
  
SQL>CREATETABLEdbobjs2
  2(object_idNUMBERNOTNULL,
  3object_nameVARCHAR2(128),
  4createdDATENOTNULL
  5);
  Tablecreated.
  SQL>CREATEINDEXdbobjs_idx2ONdbobjs2(created);
  Indexcreated.
  SQL>insertintodbobjs2
  2selectobject_id,object_name,created
  3fromdba_objectswherecreated
  6227rowscreated.
  SQL>commit;
  Commitcomplete.
  SQL>selectcount(distinct(object_name))fromdbobjs2wherecreated<to_date('01/01/2007','dd/mm/yyyy');
  COUNT(DISTINCT(OBJECT_NAME))
  ----------------------------
  4753
  ExecutionPlan
  ----------------------------------------------------------
  0SELECTSTATEMENTptimizer=CHOOSE
  10SORT(GROUPBY)
  21TABLEACCESS(BYINDEXROWID)OF'DBOBJS2'
  32INDEX(RANGESCAN)OF'DBOBJS_IDX2'(NON-UNIQUE)
  Statistics
  ----------------------------------------------------------
  0recursivecalls
  0dbblockgets
  2670consistentgets
  0physicalreads
  1332redosize
  400bytessentviaSQL*Nettoclient
  503bytesreceivedviaSQL*Netfromclient
  2SQL*Netroundtripsto/fromclient
  1sorts(memory)
  0sorts(disk)
  1rowsprocessed
  当增加表分区时,LOCAL索引被自动维护:
  
SQL>ALTERTABLEdbobjs
  2ADDPARTITIONdbobjs_08VALUESLESSTHAN(TO_DATE('01/01/2009','DD/MM/YYYY'));
  Tablealtered.
  SQL>setautotraceoff
  SQL>COLsegment_namefora20
  SQL>COLPARTITION_NAMEfora20
  SQL>SELECTsegment_name,partition_name,tablespace_name
  2FROMdba_segments
  3WHEREsegment_name='DBOBJS_IDX';
  SEGMENT_NAMEPARTITION_NAMETABLESPACE_NAME
  ----------------------------------------------------------------------
  DBOBJS_IDXDBOBJS_06USERS
  DBOBJS_IDXDBOBJS_07USERS
  DBOBJS_IDXDBOBJS_08EYGLE
  SQL>SELECTsegment_name,partition_name,tablespace_name
  2FROMdba_segments
  3WHEREsegment_name='DBOBJS';
  SEGMENT_NAMEPARTITION_NAMETABLESPACE_NAME
  ----------------------------------------------------------------------
  DBOBJSDBOBJS_06EYGLE
  DBOBJSDBOBJS_07EYGLE
  DBOBJSDBOBJS_08EYGLE
  
PS:我建了几个oracle,欢迎数据库爱好者加入。
Oracle专家QQ1群:60632593
Oracle专家QQ2群:60618621
Oracle专家QQ3群:23145225
-The End-
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-257570-1-1.html 上篇帖子: Oracle中视图的创建和处理方法 下篇帖子: Oracle在2011年取得的Java主要成就
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表