- 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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
我已经完成了注册页面,并且运行顺利。 现在我需要弄清楚登录部分。我想要它,所以一旦用户登录,它就会将他们带到私有(private)页面,只有登录的用户才能看到。 它不需要针对每个用户进行个性化设置,只
出于个人好奇心,我目前正在学习区 block 链的工作原理。我正在学习这门类(class),现在我已经使用网络套接字设置了点对点连接。区 block 链应用程序的多个实例现在可以使用这些套接字运行并相
我读过: The blockchain database isn’t stored in any single location, meaning the records it keeps are t
Closed. This question needs to be more focused。它当前不接受答案。 想要改善这个问题吗?更新问题,使它仅关注editing this post的一个问题。
如果我在区块链中进行交易,是否只有在将交易添加到区块链后才会进行比特币转账?如果是这样,挖掘区块可能需要时间,并且无法进行紧急付款。那么这不是区块链的劣势吗? 最佳答案 如果您不重视能够在没有第三方(
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题
根据我的理解,我读到的关于区 block 链的所有内容都表明,即使在私有(private)区 block 链上,每个参与者都可以查看所有交易。我看到它提到区 block 链的一个用例可能是共享医疗数据
服务器正在发送消息时,如何阻止连接到服务器的一个IP地址。我的发送消息选项程序如下所示。 private void buttonSendMsg_Click(对象发送者,EventArgs e) {
iam正在hadoop apache 2.7.1上工作 和iam添加大小不超过100 Kb的文件 所以如果我将块大小配置为1 mb或默认值是 128兆字节 不会影响我的文件,因为它们只会保存在一个块中
我有一个docker-compose文件here。我可以连接到7051并注册我的chaincode客户端,但是当我尝试连接到localhost:7050时,我得到一个错误,该错误在使用curl测试时如
从数据类型来看,区 block 链是单链表吗?因为每个 block 都使用哈希引用前一个 block 。 或者它是某种树? 最佳答案 区 block 链表示为单链表的方式。每个 block 都有前一个
我无法理解给定代码片段的 hashcode() 部分。 我尝试过搜索它,但我无法弄清楚。 this.hash = Arrays.hashCode(new Integer[]{data.has
已关闭。这个问题是 not about programming or software development 。目前不接受答案。 这个问题似乎不是关于 a specific programming
我正在通过一些在线示例学习区 block 链。我有这个高级代码,我用以前的哈希创建一个新 block ,然后向它添加一个事务,然后生成 block 的困难哈希(有 8 个前导零) Block blo
我们有一个包含一些数字商品的网站。从那里购买的用户需要用 BTC 购买一些信用。在他购买信用卡后,脚本必须将他用 BTC 购买的货币 (USD) 数量加载到他的账户中。 所以这里我们有 HTML 表单
我目前正在使用 enumerateObjectsUsingBlock block 在 subview 下进行枚举,我怎样才能确定 block 的完成? 下面是区 block 内容 [self.view
我通常将显示 block 放在链接上,以使按钮的所有 div 都处于事件状态,而不仅仅是文本。但在这种情况下,我需要在 ul li 中使用 display:inline-block 我认为这会禁用其他
我正在尝试创建付款账单并通过电报机器人发送给我的客户:我正在使用区 block 链 API V2-https://blockchain.info/api/api 接收。我的代码是: xpub='***
有个面试题:区 block 链和不可变链表有什么区别? 我回答他们是相同的技术,然后没有通过测试。请纠正我的错误。 最佳答案 链表中的每一项通常通过指针或内存地址指向链表中的下一项。 区 block
我是一名优秀的程序员,十分优秀!