Oracle中表的几种类型

本文详细介绍了Oracle数据库中的各种表类型,包括堆表、分区表(如范围分区、散列分区、列表分区、复合分区)、索引组织表、簇表、临时表、压缩表和只读表。重点讨论了分区表的创建、转换和管理,以及如何通过不同类型的分区优化数据管理和查询效率。此外,还提到了11g及后续版本的新特性,如间隔分区、系统分区和引用分区。
摘要由CSDN通过智能技术生成


1、表的功能:存储、管理数据的基本单元(二维表:有行和列组成)
2、表的类型:
   1)堆表:heap table :数据存储时,行是无序的,对它的访问采用全表扫描。
   2)分区表 表>2G
   3)索引组织表(IOT)
   4)簇表
   5)临时表
   6)压缩表
   7)嵌套表


3、如何将普通表转换为分区表;
   11g以前,1)create 分区表, 2)insert into 分区表 select * from 普通表; 3)rename 分区表名; 4)重建约束、索引、触发器。
   11g以后,在线重定义分区表


12.1 分区表及其种类(10g)


1)Range Partitioning (范围分区)


scott:


SQL>create table sale(
product_id varchar2(5), sales_count number(10,2)
)
partition by range(sales_count)
(
  partition p1 values less than(1000),
  partition p2 values less than(2000),
  partition p3 values less than(3000)
);
查看信息:


select * from user_tab_partitions where table_name='SALE'; 


insert into sale values('1',600);
insert into sale values('2',1000);
insert into sale values('3',2300);
insert into sale values('4',6000);
commit;


select * from sale partition(p1);
select * from sale partition(p2);


增加一个分区
alter table sale add partition p4 values less than(maxvalue);


再看一下, 可以插入6000值了
select * from user_tab_partitions where table_name='SALE';
insert into sale values('4',6000);


看一下段的分配
SQL> select segment_name,segment_type,partition_name from user_segments;


12.1.1 默认情况下,如果对分区表的分区字段做超范围(跨段)update操作,会报错——ORA-14402: 。如果一定要改,可以通过打开表的row movement属性来完成。


SQL> select rowid,t1.* from sale partition(p1) t1;


ROWID              PRODU SALES_COUNT
------------------ ----- -----------
AAASvUAAEAAAAGVAAA 1             600


SQL> update sale set sales_count=1200 where sales_count=600;
update sale set sales_count=1200 where sales_count=600
       *
第 1 行出现错误:
ORA-14402: 更新分区关键字列将导致分区的更改


SQL> alter table sale enable row movement;
SQL> update sale set sales_count=1200 where sales_count=600;


已更新 1 行。


SQL> select rowid,t1.* from sale partition(p2) t1;


ROWID              PRODU SALES_COUNT
------------------ ----- -----------
AAASvVAAEAAAAGdAAA 2            1000
AAASvVAAEAAAAGdAAB 1            1200


一般来说范围分区的分区字段使用数字类型或日期类型,使用字符类型的语法是可以的,实际工作中使用较少。这或许跟values less than
子句有关。


12.1.2 关于建立分区索引


一般使用分区都会建立索引,分区索引有local与global之分。


            Local Parfixed Index
                                                              |-----------------------------
 Local Partitioned Index   |
|-----------------------------|
 Partitioned Index                    |                                         |Local Nonparfixed Index
|----------------------------------|                                         |------------------------------
|                                                |
| |Global Partitioned Index
| |------------------------------
|
|Nonpartitioned Index 
|------------------------


1)local:一个索引分区对应一个表分区,分区key就是索引key,分区边界就是索引边界。更新一个表分区时仅仅影响该分区的索引。


SQL>create index sale_idx on sale(sales_count) local;
SQL>select * from user_ind_partitions;


Local Parfixed Index,所谓前缀索引,是指组合索引中的first column使用的是分区key。 


global:全局索引:
  
2)分区全局索引:索引分区不与表分区对应,分区key是索引key。另外一定要将maxvalue关键字做上限。
create index sale_global_idx on sale(sales_count) global
partition by range (sales_count)
(
partition p1 values less than(1500),
partition p2 values less than(maxvalue)
);


SQL>select * from user_ind_partitions; 


12.1.3 删除一个分区,其中的数据全部清除,并且包括相关索引等
SQL> alter table sale drop partition p3;


 
12.1.4 Hash Partitioning (散列分区,也叫hash分区) 


实现均匀的负载值分配,增加HASH分区可以重新分布数据。


create table my_emp(
  empno number, ename varchar2(10)
)
partition by hash(empno) 
(
  partition p1, partition p2
);
  
select * from user_tab_partitions where table_name='MY_EMP';


插入几个值,看是否均匀插入。


insert into my_emp values(1,'A');
insert into my_emp values(2,'B');
insert into my_emp values(3,'C');


select * from my_emp partition(P1);
select * from my_emp partition(P2);


12.1.5 列表分区(list): 将不相关的数据组织在一起


create table personcity(
  id number, name varchar2(10), city varchar2(10)
)
partition
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值