oracle表空间分区表索引文档格式.docx

上传人:b****7 文档编号:22940284 上传时间:2023-02-06 格式:DOCX 页数:14 大小:19.22KB
下载 相关 举报
oracle表空间分区表索引文档格式.docx_第1页
第1页 / 共14页
oracle表空间分区表索引文档格式.docx_第2页
第2页 / 共14页
oracle表空间分区表索引文档格式.docx_第3页
第3页 / 共14页
oracle表空间分区表索引文档格式.docx_第4页
第4页 / 共14页
oracle表空间分区表索引文档格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

oracle表空间分区表索引文档格式.docx

《oracle表空间分区表索引文档格式.docx》由会员分享,可在线阅读,更多相关《oracle表空间分区表索引文档格式.docx(14页珍藏版)》请在冰豆网上搜索。

oracle表空间分区表索引文档格式.docx

表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。

Oracle中提供了以下几种表分区:

一、范围分区:

这种类型的分区是使用列的一组值,通常将该列成为分区键。

示例1:

假设有一个CUSTOMER表,表中有数据200000行,我们将此表通过CUSTOMER_ID进行分区,每个分区存储100000行,我们将每个分区保存到单独的表空间中,这样数据文件就可以跨越多个物理磁盘。

下面是创建表和分区的代码,如下:

CREATETABLECUSTOMER

CUSTOMER_IDNUMBERNOTNULLPRIMARYKEY,

FIRST_NAMEVARCHAR2(30)NOTNULL,

LAST_NAMEVARCHAR2(30)NOTNULL,

PHONEVARCHAR2(15)NOTNULL,

EMAILVARCHAR2(80),

STATUSCHAR

(1)

PARTITIONBYRANGE(CUSTOMER_ID)

PARTITIONCUS_PART1VALUESLESSTHAN(100000)TABLESPACECUS_TS01,

PARTITIONCUS_PART2VALUESLESSTHAN(200000)TABLESPACECUS_TS02

注意:

在创建表进行分区时,表空间必须先存在,而且建议将不同的分区放入不同的表空间中。

示例2:

假设有ORDER_ACTIVITIES表,每6个月对订单进行清理,我们可以按月份对表进行分区,分区代码如下:

CREATETABLEORDER_ACTIVITIES

ORDER_IDNUMBER(7)NOTNULL,

ORDER_DATEDATE,

TOTAL_AMOUNTNUMBER,

CUSTOTMER_IDNUMBER(7),

PAIDCHAR

(1)

PARTITIONBYRANGE(ORDER_DATE)

PARTITIONORD_ACT_PART01VALUESLESSTHAN(TO_DATE('

01-MAY-2003'

'

DD-MON-YYYY'

))TABLESPACEORD_TS01,

PARTITIONORD_ACT_PART02VALUESLESSTHAN(TO_DATE('

01-JUN-2003'

))TABLESPACEORD_TS02,

01-JUL-2003'

))TABLESPACEORD_TS03

二、列表分区:

该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。

CREATETABLEPROBLEM_TICKETS

PROBLEM_IDNUMBER(7)NOTNULLPRIMARYKEY,

DESCRIPTIONVARCHAR2(2000),

CUSTOMER_IDNUMBER(7)NOTNULL,

DATE_ENTEREDDATENOTNULL,

STATUSVARCHAR2(20)

PARTITIONBYLIST(STATUS)

PARTITIONPROB_ACTIVEVALUES('

ACTIVE'

)TABLESPACEPROB_TS01,

PARTITIONPROB_INACTIVEVALUES('

INACTIVE'

)TABLESPACEPROB_TS02

三、散列分区:

这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。

当列的值没有合适的条件时,建议使用散列分区。

请看下列示例:

CREATETABLEHASH_TABLE

COLNUMBER(8),

INFVARCHAR2(100)

PARTITIONBYHASH(COL)

PARTITIONPART01TABLESPACEHASH_TS01,

PARTITIONPART02TABLESPACEHASH_TS02,

PARTITIONPART03TABLESPACEHASH_TS03

四、复合范围列表分区:

这种分区是基于范围分区和列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区。

CREATETABLESALES

PRODUCT_IDVARCHAR2(5),

SALES_DATEDATE,

SALES_COSTNUMBER(10),

PARTITIONBYRANGE(SALES_DATE)

SUBPARTITIONBYLIST(STATUS)

PARTITIONP1VALUESLESSTHAN(TO_DATE('

2003-01-01'

YYYY-MM-DD'

))TABLESPACEP1_TS

SUBPARTITIONP1SUB1VALUES('

)TABLESPACESUBP1_TS1,

SUBPARTITIONP1SUB2VALUES('

)TABLESPACESUBP1_TS2

),

PARTITIONP2VALUESLESSTHAN(TO_DATE('

2003-03-01'

))TABLESPACEP2_TS

SUBPARTITIONP2SUB1VALUES('

)TABLESPACESUBP2_TS1,

SUBPARTITIONP2SUB2VALUES('

)TABLESPACESUBP2_TS2

使用TEMPLATE模板

SUBPARTITIONTEMPLATE

SUBPARTITIONSUB1VALUES('

SUBPARTITIONSUB2VALUES('

))TABLESPACEP1_TS,

五、复合范围散列分区:

这种分区是基于范围分区和散列分区,表首先按某列进行范围分区,然后再按某列进行散列分区。

与上面的定义方式非常的类似,在此不单独举例。

表分区对于用户来说是透明的,我们在插入数据时Oracle会自动判断插入的数据,然后放入相应的表分区中。

但有时我们想单独查询某个分区中的数据时,就必须手工指定分区的名称。

(此示例基于:

四、复合范围列表分区的示例一)

向SALES表插入记录,不必指定表分区。

INSERTINTOSALESVALUES('

00001'

01-1月-02'

100,'

/

00002'

01-1月-01'

200,'

00003'

01-2月-03'

300,'

00004'

04-2月-03'

00005'

04-2月-02'

不指定表分区查看SALES表信息:

SELECT*FROMSALES;

结果如下所示:

指定P1表分区查询SALES表信息:

SELECT*FROMSALESPARTITION(P1);

指定P1SUB1子分区查询SALES表信息:

SELECT*FROMSALESSUBPARTITION(P1SUB1);

四、复合范围列表分区的示例二)

示例2基于TEMPLATE模板的表分区,查询稍稍烦琐一点。

结果如下所示,和刚才查询一致。

指定SUB1子分区查询SALES表信息:

SELECT*FROMSALESSUBPARTITION(SUB1);

出现如下错误信息:

怎么解决以上问题呢?

我们通过sys模式查看分区信息的数据字典,如下:

可以看出子分区不叫SUB1,而是P1_SUB1,重新查询信息,如下图所示:

有关表分区的一些维护性操作:

一、添加分区

以下代码给SALES表添加了一个P3分区

ALTERTABLESALESADDPARTITIONP3VALUESLESSTHAN(TO_DATE('

2003-06-01'

));

以上添加的分区界限应该高于最后一个分区界限。

以下代码给SALES表的P3分区添加了一个P3SUB1子分区

ALTERTABLESALESMODIFYPARTITIONP3ADDSUBPARTITIONP3SUB1VALUES('

COMPLETE'

);

二、删除分区

以下代码删除了P3表分区:

ALTERTABLESALESDROPPARTITIONP3;

在以下代码删除了P4SUB1子分区:

ALTERTABLESALESDROPSUBPARTITIONP4SUB1;

如果删除的分区是表中唯一的分区,那么此分区将不能被删除,要想删除此分区,必须删除表。

三、截断分区

截断某个分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。

当表中即使只有一个分区时,也可以截断该分区。

通过以下代码截断分区:

ALTERTABLESALESTRUNCATEPARTITIONP2;

通过以下代码截断子分区:

ALTERTABLESALESTRUNCATESUBPARTITIONP2SUB2;

四、合并分区

合并分区是将相邻的分区合并成一个分区,结果分区将采用较高分区的界限,值得注意的是,不能将分区合并到界限较低的分区。

以下代码实现了P1P2分区的合并:

ALTERTABLESALESMERGEPARTITIONSP1,P2INTOPARTITIONP2;

五、拆分分区

拆分分区将一个分区拆分两个新分区,拆分后原来分区不再存在。

注意不能对HASH类型的分区进行拆分。

ALTERTABLESALESSBLITPARTITIONP2AT(TO_DATE('

2003-02-01'

))

INTO(PARTITIONP21,PARTITIONP22);

六、接合分区(coalesca)

结合分区是将散列分区中的数据接合到其它分区中,当散列分区中的数据比较大时,可以增加散列分区,然后进行接合,值得注意的是,接合分区只能用于散列分区中。

通过以下代码进行接合分区:

ALTERTABLESALESCOALESCAPARTITION;

七、重命名表分区

以下代码将P21更改为P2

ALTERTABLESALESRENAMEPARTITIONP21TOP2;

九、跨分区查询

selectsum(*)from(

(selectcount(*)cnfromt_table_SSPARTITION(P200709_1)

unionall

selectcount(*)cnfromt_table_SSPARTITION(P200709_2));

十、查询表上有多少分区

SELECT*FROMuseR_TAB_PARTITIONSWHERETABLE_NAME='

tableName'

十一、查询索引信息

selectobject_name,object_type,tablespace_name,sum(value)

fromv$segment_statistics

wherestatistic_nameIN('

physicalreads'

physicalwrite'

logicalreads'

)andobject_type='

INDEX'

groupbyobject_name,object_type,tablespace_name

orderby4desc

 

--显示数据库所有分区表的信息:

select*fromDBA_PART_TABLES

--显示当前用户可访问的所有分区表信息:

select*fromALL_PART_TABLES

--显示当前用户所有分区表的信息:

select*fromUSER_PART_TABLES

--显示表分区信息显示数据库所有分区表的详细分区信息:

select*fromDBA_TAB_PARTITIONS

--显示当前用户可访问的所有分区表的详细分区信息:

select*fromALL_TAB_PARTITIONS

--显示当前用户所有分区表的详细分区信息:

select*fromUSER_TAB_PARTITIONS

--显示子分区信息显示数据库所有组合分区表的子分区信息:

select*fromDBA_TAB_SUBPARTITIONS

--显示当前用户可访问的所有组合分区表的子分区信息:

select*fromALL_TAB_SUBPARTITIONS

--显示当前用户所有组合分区表的子分区信息:

select*fromUSER_TAB_SUBPARTITIONS

--显示分区列显示数据库所有分区表的分区列信息:

select*fromDBA_PART_KEY_COLUMNS

--显示当前用户可访问的所有分区表的分区列信息:

select*fromALL_PART_KEY_COLUMNS

--显示当前用户所有分区表的分区列信息:

select*fromUSER_PART_KEY_COLUMNS

--显示子分区列显示数据库所有分区表的子分区列信息:

select*fromDBA_SUBPART_KEY_COLUMNS

--显示当前用户可访问的所有分区表的子分区列信息:

select*fromALL_SUBPART_KEY_COLUMNS

--显示当前用户所有分区表的子分区列信息:

select*fromUSER_SUBPART_KEY_COLUMNS

--怎样查询出oracle数据库中所有的的分区表

select*fromuser_tablesawherea.partitioned='

YES'

--删除一个表的数据是

truncatetabletable_name;

--删除分区表一个分区的数据是

altertabletable_nametruncatepartitionp5;

注:

分区根据具体情况选择。

表分区有以下优点:

1、数据查询:

数据被存储到多个文件上,减少了I/O负载,查询速度提高。

2、数据修剪:

保存历史数据非常的理想。

3、备份:

将大表的数据分成多个文件,方便备份和恢复。

4、并行性:

可以同时向表中进行DML操作,并行性性能提高。

================================================

索引:

1、一般索引:

createindexindex_nameontable(col_name);

2、Oracle分区索引详解

语法:

TableIndex

CREATE[UNIQUE|BITMAP]INDEX[schema.]index_name

ON[schema.]table_name[tbl_alias]

(col[ASC|DESC])index_clauseindex_attribs

index_clauses:

分以下两种情况

1.LocalIndex

就是索引信息的存放位置依赖于父表的Partition信息,换句话说创建这样的索引必须保证父表是Partition

1.1索引信息存放在父表的分区所在的表空间。

但是仅可以创建在父表为HashTable或者composite分区表的。

LOCALSTOREIN(tablespace)

1.2仅可以创建在父表为HashTable或者composite分区表的。

并且指定的分区数目要与父表的分区数目要一致

LOCALSTOREIN(tablespace)(PARTITION[partition[LOGGING|NOLOGGING][TABLESPACE{tablespace|DEFAULT}][PCTFREEint][PCTUSEDint][INITRANSint][MAXTRANSint][STORAGEstorage_clause][STOREIN{tablespace_name|DEFAULT][SUBPARTITION[subpartition[TABLESPACEtablespace]]]])

1.3索引信息存放在父表的分区所在的表空间,这种语法最简单,也是最常用的分区索引创建方式。

Local

1.4并且指定的Partition数目要与父表的Partition要一致

LOCAL(PARTITION[partition

[LOGGING|NOLOGGING]

[TABLESPACE{tablespace|DEFAULT}]

[PCTFREEint]

[PCTUSEDint]

[INITRANSint]

[MAXTRANSint]

[STORAGEstorage_clause]

[STOREIN{tablespace_name|DEFAULT]

[SUBPARTITION[subpartition[TABLESPACEtablespace]]]])

GlobalIndex

索引信息的存放位置与父表的Partition信息完全不相干。

甚至父表是不是分区表都无所谓的。

语法如下:

GLOBALPARTITIONBYRANGE(col_list)

(PARTITIONpartitionVALUESLESSTHAN(value_list)

[STORAGEstorage_clause])

但是在这种情况下,如果父表是分区表,要删除父表的一个分区都必须要更新GlobalIndex,否则索引信息不正确

ALTERTABLETableNameDROPPARTITIONPartitionNameUpdateGlobalIndexes

--查询索引

orderby4d

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1