oracle 建分区索引_Oracle的分区表和Local索引创建与维护

本文介绍了如何在Oracle中创建分区表和Local索引,并通过示例展示了不同分区查询的性能差异。创建了一个名为dbobjs的分区表,按日期范围进行分区,然后创建了一个Local索引dbobjs_idx,该索引在不同分区上指定到特定的表空间。通过查询和执行计划对比了分区表和非分区表在查询效率上的差别。
摘要由CSDN通过智能技术生成

Oracle的分区表和Local索引创建与维护

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 Optimizer=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 Optimizer=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 Optimizer=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 Optimizer=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

-The End-

By eygle on 2008-04-23 12:22 |

Comments (0) |

FAQ | 1892 |

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值