创建与管理Oracle的分区表和本地索引
在网上看到eygle写的一篇关于分区表和本地索引的文章,感觉总结的挺好,特转了过来。
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 |
PS:我建了几个oracle QQ群,欢迎数据库爱好者加入。
Oracle专家QQ1群:60632593
Oracle专家QQ2群:60618621
Oracle专家QQ3群:23145225
-The End-
创建与管理Oracle的分区表和本地索引相关推荐
- oracle自动分区如何创建本地索引吗,创建与管理Oracle分区表和本地索引的实例解析...
创建与管理Oracle分区表和本地索引的相关知识是本文我们主要要介绍的内容,我们知道,Oracle的分区技术在某些条件下可以极大的提高查询的性能,所以被广泛采用.从产品上说,分区技术是Oracle企业 ...
- oracle10g 创建分区表,oracle10G分区的创建与维护Oracle分区表和本地索引
Oracle的分区技术在某些条件下可以极大的提高查询的性能,所以被广泛采用.从产品上说,分区技术是Oracle企业版中独立收费的一个组件.以下是对于分区及本地索引的一个示例. Oracle的分区技术在 ...
- oracle10G分区的创建与维护Oracle分区表和本地索引
Oracle的分区技术在某些条件下可以极大的提高查询的性能,所以被广泛采用.从产品上说,分区技术是Oracle企业版中独立收费的一个组件.以下是对于分区及本地索引的一个示例. Oracle的分区技术在 ...
- oracle 10g 分区管理,Oracle 10g分区表的自动维护
Oracle 10g分区表不支持自动化管理,一般都要手动创建分区,手动删除.今天给大家带来了一个自动化管理表空间的脚本. 本脚本主要由3个部分组成:sys_ConfigTable.sql.sys_pr ...
- oracle不适合建立索引的场景,Oracle 分区表中本地索引和全局索引的适用场景
背景 分区表创建好了之后,如果需要最大化分区表的性能就需要结合索引的使用,分区表有两种索引:本地索引和全局索引.既然存在着两种的索引类型,相信存在即合理.既然存在就会有存在的原因,也就是在特定的场景中 ...
- 分区表的本地索引竟然失效了——ORA-01502
由于昨天对一个千万级别的分区表做了分区数据交换的操作,因为本表操作太慢,所以将其移出普通表操作后才移回分区表,但是今天又反馈该表的某字段为条件查询速度很慢,自己试了下果真如此,我看了查询语句的执行计划 ...
- mysql 分区索引失效_分区表的本地索引竟然失效了——ORA-01502
由于昨天对一个千万级别的分区表做了分区数据交换的操作,因为本表操作太慢,所以将其移出普通表操作后才移回分区表,但是今天又反馈该表的某字段为条件查询速度很慢,自己试了下果真如此,我看了查询语句的执行计划 ...
- oracle账号注册公司名称,oracle+账号创建与管理oracle创建数据库
方法/步骤 1.从Windows桌面执行"开始"→"程序"→"Oracle – "→"配置和移置工具"→"Da ...
- oracle手动分区改为自动分区,oracle12c在线转换分区表,本地索引,自动按月间隔分区...
SELECT count(*) FROM AAA_DATA; --AAA话单数据表 SELECT count(*) FROM IPTV_HW_DATA; --IPTV华为数据表 SELECT co ...
- oracle 建分区索引_Oracle的分区表和Local索引创建与维护
Oracle的分区表和Local索引创建与维护 SQL> connect eygle/eygle Connected. SQL> CREATE TABLE dbobjs 2 (OBJEC ...
最新文章
- ubuntu11.04中如何像其他版本一样快速回到桌面
- 计算机等级考试计算机基础知识pdf,计算机基础知识与应用能力等级考试.pdf
- Sharepoint 自定义字段类型
- lseek成功但未生效?
- coffeeScript学习01
- Spring3 MVC+Spring+Spring Jdbc实现的权限管理系统,可以控制到增删改查
- firebase登录验证_如何使用Firebase通过三步向身份验证本机添加身份验证
- python paas_到底什么是PaaS?——【PaaS概述科普文】
- poj 3080 Blue Jeans kmp+枚举
- android auto能用酷狗,完美支持Android车载设备,酷狗音乐pad版使用教程
- mui 框架图片预览
- Pyinstaller 打包Pyside2 报错qt.qpa.plugin
- windows 任务栏点击无反应,电脑没有任务栏怎么办
- 2021年,第一份值得职场人“跪读”的书单来了
- JAVA毕业设计-智慧农业水果销售系统计算机源码+lw文档+系统+调试部署+数据库
- 是非人生 — 一个菜鸟程序员的5年职场路 第6节
- 如何修改Ubuntu的分辨率
- 【科创人】瑞云创始人汪忠田:售后服务SaaS市场拓荒者
- 「技术工具」阿里开源Java在线诊断工具 Arthas 进阶教程
- 2018年广东工业大学文远知行杯新生程序设计竞赛 1013 在那天的雪停息之前β