- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章oracle表分区的概念及操作由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
。
1.表空间及分区表的概念 。
表空间:
是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间.
分区表:
当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表.
2.表分区的具体作用 。
oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具.
分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。每个分区有自己的名称,还可以选择自己的存储特性。从数据库 管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。但 是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用 sql dml 命令访问分区后的表时,无需任何修改.
什么时候使用分区表:
1) 表的大小超过2gb.
2) 表中包含历史数据,新的数据被增加都新的分区中.
3.表分区的优缺点 。
优点:
1) 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度.
2) 增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用; 。
3) 维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可; 。
4) 均衡i/o:可以把不同的分区映射到磁盘以平衡i/o,改善整个系统性能.
缺点:
分区表相关,已经存在的表没有方法可以直接转化为分区表。不过 oracle 提供了在线重定义表的功能.
4.表分区的几种类型及操作方法 。
1.范围分区 。
范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期。举个例子:你可能会将销售数据按照月份进行分区.
当使用范围分区时,请考虑以下几个规则:
1) 每一个分区都必须有一个values less then子句,它指定了一个不包括在该分区中的上限值。分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中.
2) 所有分区,除了第一个,都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值.
3) 在最高的分区中,maxvalue被定义。maxvalue代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,也可以理解为高于任何分区中指定的value less then的值,同时包括空值.
例1:
假设有一个customer表,表中有数据200000行,我们将此表通过customer_id进行分区,每个分区存储100000行,我们将每个分区保存到单独的表空间中,这样数据文件就可以跨越多个物理磁盘。下面是创建表和分区的代码,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
create
table
customer
(
customer_id number
not
null
primary
key
,
first_name varchar2(30)
not
null
,
last_name varchar2(30)
not
null
,
phone varchar2(15)
not
null
,
email varchar2(80),
status
char
(1)
)
partition
by
range (customer_id)
(
partition cus_part1
values
less than (100000) tablespace cus_ts01,
partition cus_part2
values
less than (200000) tablespace cus_ts02
)
|
例2:按时间划分 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
create
table
order_activities
(
order_id number(7)
not
null
,
order_date
date
,
total_amount number,
custotmer_id number(7),
paid
char
(1)
)
partition
by
range (order_date)
(
partition ord_act_part01
values
less than (to_date(
'01- may -2003'
,
'dd-mon-yyyy'
)) tablespaceord_ts01,
partition ord_act_part02
values
less than (to_date(
'01-jun-2003'
,
'dd-mon-yyyy'
)) tablespace ord_ts02,
partition ord_act_part02
values
less than (to_date(
'01-jul-2003'
,
'dd-mon-yyyy'
)) tablespace ord_ts03
)
|
例3:maxvalue 。
1
2
3
4
5
6
7
8
9
10
11
|
create
table
rangetable
(
idd
int
primary
key
,
iname
varchar
(10),
grade
int
)
partition
by
range (grade)
(
partition part1
values
less
then
(1000) tablespace part1_tb,
partition part2
values
less
then
(maxvalue) tablespace part2_tb
);
|
2.列表分区:
该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区.
例1 。
1
2
3
4
5
6
7
8
9
10
11
12
|
create
table
problem_tickets
(
problem_id number(7)
not
null
primary
key
,
description varchar2(2000),
customer_id number(7)
not
null
,
date_entered
date
not
null
,
status varchar2(20)
)
partition
by
list (status)
(
partition prob_active
values
(
'active'
) tablespace prob_ts01,
partition prob_inactive
values
(
'inactive'
) tablespace prob_ts02
|
例2 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
create
table
listtable
(
id
int
primary
key
,
name
varchar
(20),
area
varchar
(10)
)
partition
by
list (area)
(
partition part1
values
(
'guangdong'
,
'beijing'
) tablespace part1_tb,
partition part2
values
(
'shanghai'
,
'nanjing'
) tablespace part2_tb
);
)
|
3.散列分区
这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区.
散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在i/o设备上进行散列分区,使得这些分区大小一致.
例1:
1
2
3
4
5
6
7
8
9
10
11
|
create
table
hash_table
(
col number(8),
inf varchar2(100)
)
partition
by
hash (col)
(
partition part01 tablespace hash_ts01,
partition part02 tablespace hash_ts02,
partition part03 tablespace hash_ts03
)
|
简写:
1
2
3
4
5
6
7
8
|
create
table
emp
(
empno number (4),
ename varchar2 (30),
sal number
)
partition
by
hash (empno) partitions 8
store
in
(emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);
|
hash分区最主要的机制是根据hash算法来计算具体某条纪录应该插入到哪个分区中,hash算法中最重要的是hash函数,oracle中如果你要使用hash分区,只需指定分区的数量即可。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀.
4.组合范围散列分区 。
这种分区是基于范围分区和列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
create
table
sales
(
product_id varchar2(5),
sales_date
date
,
sales_cost number(10),
status varchar2(20)
)
partition
by
range(sales_date) subpartition
by
list (status)
(
partition p1
values
less than(to_date(
'2003-01-01'
,
'yyyy-mm-dd'
))tablespace rptfact2009
(
subpartition p1sub1
values
(
'active'
) tablespace rptfact2009,
subpartition p1sub2
values
(
'inactive'
) tablespace rptfact2009
),
partition p2
values
less than (to_date(
'2003-03-01'
,
'yyyy-mm-dd'
)) tablespace rptfact2009
(
subpartition p2sub1
values
(
'active'
) tablespace rptfact2009,
subpartition p2sub2
values
(
'inactive'
) tablespace rptfact2009
)
)
|
5.复合范围散列分区:
这种分区是基于范围分区和散列分区,表首先按某列进行范围分区,然后再按某列进行散列分区.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
create
table
dinya_test
(
transaction_id number
primary
key
,
item_id number(8)
not
null
,
item_description varchar2(300),
transaction_date
date
)
partition
by
range(transaction_date)subpartition
by
hash(transaction_id) subpartitions 3 store
in
(dinya_space01,dinya_space02,dinya_space03)
(
partition part_01
values
less than(to_date(‘2006-01-01
','
yyyy-mm-dd
')),
partition part_02 values less than(to_date(‘2010-01-01'
,
'yyyy-mm-dd'
)),
partition part_03
values
less than(maxvalue)
);
|
5.有关表分区的一些维护性操作 。
1) 添加分区 。
以下代码给sales表添加了一个p3分区 。
1
|
alter
table
sales
add
partition p3
values
less than(to_date(
'2003-06-01'
,
'yyyy-mm-dd'
));
|
注意:以上添加的分区界限应该高于最后一个分区界限.
以下代码给sales表的p3分区添加了一个p3sub1子分区 。
1
|
alter
table
sales
modify
partition p3
add
subpartition p3sub1
values
(
'complete'
);
|
2) 删除分区 。
以下代码删除了p3表分区:
1
|
alter
table
sales
drop
partition p3;
|
在以下代码删除了p4sub1子分区:
1
|
alter
table
sales
drop
subpartition p4sub1;
|
注意:如果删除的分区是表中唯一的分区,那么此分区将不能被删除,要想删除此分区,必须删除表.
3) 截断分区 。
截断某个分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。当表中即使只有一个分区时,也可以截断该分区。通过以下代码截断分区:
1
|
alter
table
sales
truncate
partition p2;
|
通过以下代码截断子分区:
1
|
alter
table
sales
truncate
subpartition p2sub2;
|
4) 合并分区 。
合并分区是将相邻的分区合并成一个分区,结果分区将采用较高分区的界限,值得注意的是,不能将分区合并到界限较低的分区。以下代码实现了p1 p2分区的合并:
1
|
alter
table
sales merge partitions p1,p2
into
partition p2;
|
5) 拆分分区 。
拆分分区将一个分区拆分两个新分区,拆分后原来分区不再存在。注意不能对hash类型的分区进行拆分.
1
|
alter
table
sales sblit partition p2
at
(to_date(
'2003-02-01'
,
'yyyy-mm-dd'
))
into
(partition p21,partition p22);
|
6) 接合分区(coalesca) 。
结合分区是将散列分区中的数据接合到其它分区中,当散列分区中的数据比较大时,可以增加散列分区,然后进行接合,值得注意的是,接合分区只能用于散列分区中。通过以下代码进行接合分区:
1
|
alter
table
sales coalesca partition;
|
7) 重命名表分区 。
以下代码将p21更改为p2 。
1
|
alter
table
sales rename partition p21
to
p2;
|
8) 相关查询 。
跨分区查询 。
1
2
3
4
5
6
7
8
9
|
select
sum
( *)
from
(
select
count
(*) cn
from
t_table_ss partition (p200709_1)
union
all
select
count
(*) cn
from
t_table_ss partition (p200709_2)
);
|
查询表上有多少分区 。
1
|
select
*
from
user_tab_partitions
where
table_name=
'tablename'
|
查询索引信息 。
1
2
3
4
5
6
7
8
9
|
select
object_name,object_type,tablespace_name,
sum
(value)
from
v$segment_statistics
where
statistic_name
in
(
'physical reads'
,
'physical write'
,
'logical reads'
)
and
object_type=
'index'
group
by
object_name,object_type,tablespace_name
order
by
4
desc
|
--显示数据库所有分区表的信息:
1
|
select
*
from
dba_part_tables
|
--显示当前用户可访问的所有分区表信息
1
|
select
*
from
all_part_tables
|
--显示当前用户所有分区表的信息:
1
|
select
*
from
user_part_tables
|
--显示表分区信息 显示数据库所有分区表的详细分区信息:
1
|
select
*
from
dba_tab_partitions
|
--显示当前用户可访问的所有分区表的详细分区信息:
1
|
select
*
from
all_tab_partitions
|
--显示当前用户所有分区表的详细分区信息:
1
|
select
*
from
user_tab_partitions
|
--显示子分区信息 显示数据库所有组合分区表的子分区信息:
1
|
select
*
from
dba_tab_subpartitions
|
--显示当前用户可访问的所有组合分区表的子分区信息:
1
|
select
*
from
all_tab_subpartitions
|
--显示当前用户所有组合分区表的子分区信息:
1
|
select
*
from
user_tab_subpartitions
|
--显示分区列 显示数据库所有分区表的分区列信息:
1
|
select
*
from
dba_part_key_columns
|
--显示当前用户可访问的所有分区表的分区列信息:
1
|
select
*
from
all_part_key_columns
|
--显示当前用户所有分区表的分区列信息:
1
|
select
*
from
user_part_key_columns
|
--显示子分区列 显示数据库所有分区表的子分区列信息:
1
|
select
*
from
dba_subpart_key_columns
|
--显示当前用户可访问的所有分区表的子分区列信息:
1
|
select
*
from
all_subpart_key_columns
|
--显示当前用户所有分区表的子分区列信息:
1
|
select
*
from
user_subpart_key_columns
|
--怎样查询出oracle数据库中所有的的分区表 。
1
|
select
*
from
user_tables a
where
a.partitioned=
'yes'
|
--删除一个表的数据是 。
1
|
truncate
table
table_name;
|
--删除分区表一个分区的数据是 。
1
|
alter
table
table_name
truncate
partition p5;
|
到此这篇关于oracle表分区详解的文章就介绍到这了,更多相关oracle表分区内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://www.cnblogs.com/leiOOlei/archive/2012/06/08/2541306.html 。
最后此篇关于oracle表分区的概念及操作的文章就讲到这里了,如果你想了解更多关于oracle表分区的概念及操作的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Oracle 即时客户端和 Oracle 客户端有什么区别?你能给我解释一下吗?谢谢 最佳答案 Oracle 客户端带有安装程序和许多可执行文件,例如 sqlplus,tnsping,它是完整而庞大的
我正在寻找一个Delphi组件来直接连接到ORACLE数据库服务器,而无需安装oracle客户端。 我知道Oracle Data Access (ODAC)来自DevArt 。还有其他组件具有此功能吗
如何编写 Oracle 存储过程,以表 (X) 作为输入参数,并在过程内部使用表 X 来与另一个表 Y 联接? 表 X 将包含数千条记录。 不希望将表名作为 varchar 传递,然后使用动态 SQL
如何编写 Oracle 存储过程,以表 (X) 作为输入参数,并在过程内部使用表 X 来与另一个表 Y 联接? 表 X 将包含数千条记录。 不希望将表名作为 varchar 传递,然后使用动态 SQL
我要过滤COMMENTS属性为空的记录 我试过了 SELECT TABLE_NAME, COMMENTS FROM (SELECT TABLE_NAME, COMMENTS FROM (sel
我要下载 Oracle Instant Client for Linux x86-64 (64-bit)现在有一段时间了。 现在我注意到该网站在过去几个月中一直遇到技术问题。 要从 Oracle 下载
有什么方法可以将我的 Delphi 应用程序 (FireDac) 直接连接到 Oracle 数据库? 目前可以连接,但需要安装Oracle Client 在 embarcadero 站点 ( http
我有一张表,其中日期列的数据格式如下:“7/25/2014 12:14:27 AM”。我需要通过放入 where 子句来获取此日期。有人可以建议我该怎么做吗? 最佳答案 日期(存储在表中)是 repr
如果两个事务试图同时修改同一行会发生什么?通常,一旦行被修改,另一个事务等待直到第一个事务执行提交或回滚。但是,如果他们恰好在同一时刻发送更新请求怎么办? 最佳答案 答案是否定的。两个事务不能同时修改
我想知道为什么我不能在 Oracle 模式中有两个同名的索引?它抛出一个错误,指出该名称已被使用。我的印象是,由于索引在一个特定的表上,这应该不会导致任何错误,除非我们对同一个表上的两个不同列使用相同
我需要构建一个查询来按成员和到期日期检索信息组,但我需要为每个成员提供一个序列号.. 例如: 如果成员“A”有 3 条记录要过期,“B”只有 1 条,“C”有 2 条,我需要这样的结果: Number
独立程序 create procedure proc1 ( begin end; ) 存储过程 create package pkg1 ( procedure proc2 begin end; ) 最
在 Oracle 9i 中声明 FK 时遇到问题。我在这里查看了许多关于 SO 和一些在线文档(例如 http://www.techonthenet.com/oracle/foreign_keys/f
我和我的同事维护的应用程序在后端有一个 Oracle 数据库。我们正在考虑偶尔以“受限”模式运行应用程序,其中一个数据库表空间设置为只读。我们可以轻松地将必要的表和索引移动到单独的表空间,这些表空间将
我想实现一个自定义的回归聚合函数,类似于现有的 REGR_SLOPE . 我要定义的函数需要获取两列作为参数,例如 select T.EMPLOYEE_ID, CUSTOM_REGR_SL
我已经尝试解决这个问题一段时间了,我认为是时候寻求帮助了。我正在构建一个架构配置脚本,我想添加一些脚本输出和错误处理。这个想法是脚本输出窗口只会向我显示关键消息而没有所有噪音。 Create Temp
在旧的 Oracle 服务器(我被告知是 8i)上使用 JDBC 时,我遇到了一个非常令人困惑和奇怪的问题。我在那里准备了一个表,其中包含大约 10 列、数字、varchars、一个 raw(255)
我有一张 table Customer_Chronics在 Oracle 11g 中。 该表具有三个关键列,如下所示: 分支代码 客户 ID 期 我已按 branch_code 列表按表分区,现在我进
是否有存储用户自定义异常的oracle表? 最佳答案 没有。 与其他变量一样,用户定义的异常在 PL/SQL block 中定义,并且具有 PL/SQL 变量将具有的任何范围。所以,例如 DECLAR
在 oracle 中使用序列并使用 Before insert trigger 自动递增列或使用标识列是否更好,因为它在 Oracle 12 c 中可用? 最佳答案 无论哪种方式,您都将使用序列。 1
我是一名优秀的程序员,十分优秀!