我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何理解ADD和DROP分区

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何理解ADD和DROP分区

如何理解ADD和DROP分区,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

add和drop分区
语法:
ALTER TABLE t_pe_r
      ADD PARTITION p4 VALUES LESS THAN (30 );
ALTER TABLE t_pe_l
      ADD PARTITION p4 VALUES  (30 );
ALTER TABLE t_pe_h
      ADD PARTITION p3;

alter table t_pe_r drop partition p3;

限制:如果范围分区使用maxvalue选项则报错ORA-14074: 分区界限必须调整为高于最后一个分区界限
      如果LIST分区使用了default选项则报错ORA-14323: 在 DEFAULT 分区已存在时无法添加分区
      drop 分区不能使用在HASH分区表中,报错ORA-14255: 未按范围, 组合范围或列表方法对表进行分区

我们这里讨论HASH、list、range 3方式下add partition和drop partition关于local索引,global索引和普通索引的状态。
使用脚本
drop table t_pe_r ;
drop table t_pe_l;
drop table t_pe_h;
CREATE TABLE t_pe_r (i NUMBER, j NUMBER , f varchar2(20),k varchar2(20))
     PARTITION BY RANGE(j)
        (PARTITION p1 VALUES LESS THAN (10),
         PARTITION p2 VALUES LESS THAN (20));
create index t_pe_r_n on t_pe_r(i);
create index t_pe_r_l on t_pe_r(j) local;
create index t_pe_r_g on t_pe_r(f)
GLOBAL PARTITION BY hash (f)
(partition pg1 ,
 partition pg2);

CREATE TABLE t_pe_l (i NUMBER, j NUMBER , f varchar2(20),k varchar2(20))
     PARTITION BY list (j)
        (PARTITION p1 VALUES (10),
         PARTITION p2 VALUES (20));
create index t_pe_l_n on t_pe_l(i);
create index t_pe_l_l on t_pe_l(j) local;
create index t_pe_l_g on t_pe_l(f)
GLOBAL PARTITION BY hash (f)
(partition pg1 ,
 partition pg2);

CREATE TABLE t_pe_h (i NUMBER, j NUMBER , f varchar2(20),k varchar2(20))
     PARTITION BY hash(j)
        (PARTITION p1 ,
         PARTITION p2 );
create index t_pe_h_n on t_pe_h(i);
create index t_pe_h_l on t_pe_h(j) local;
create index t_pe_h_g on t_pe_h(f)
GLOBAL PARTITION BY hash (f)
(partition pg1 ,
 partition pg2);
 
insert into t_pe_r
values(2,5,'a','A');
insert into t_pe_r
values(1,15,'b','B');
insert into t_pe_l
values(2,10,'a','A');
insert into t_pe_l
values(1,20,'b','B');
insert into t_pe_h
values(2,5,'a','A');
insert into t_pe_h
values(1,15,'b','B');
insert into t_pe_h
values(3,25,'c','C');

select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_r_l';
select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_r_g';
select INDEX_NAME ,STATUS from dba_indexes where lower(index_name)='t_pe_r_n';

select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_l_l';
select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_l_g';
select INDEX_NAME ,STATUS from dba_indexes where lower(index_name)='t_pe_l_n';

select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_h_l';
select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_h_g';
select INDEX_NAME ,STATUS from dba_indexes where lower(index_name)='t_pe_h_n';
下面进行添加
ALTER TABLE t_pe_r
      ADD PARTITION p4 VALUES LESS THAN (30 );
ALTER TABLE t_pe_l
      ADD PARTITION p4 VALUES  (30 );
ALTER TABLE t_pe_h
      ADD PARTITION p3;

然后查看索引状态
SQL> select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_r_l';
 
INDEX_NAME                     STATUS   PARTITION_NAME
------------------------------ -------- ------------------------------
T_PE_R_L                       USABLE   P2
T_PE_R_L                       USABLE   P1
T_PE_R_L                       USABLE   P4
SQL> select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_r_g';
 
INDEX_NAME                     STATUS   PARTITION_NAME
------------------------------ -------- ------------------------------
T_PE_R_G                       USABLE   PG2
T_PE_R_G                       USABLE   PG1
SQL> select INDEX_NAME ,STATUS from dba_indexes where lower(index_name)='t_pe_r_n';
 
INDEX_NAME                     STATUS
------------------------------ --------
T_PE_R_N                       VALID
SQL> select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_l_l';
 
INDEX_NAME                     STATUS   PARTITION_NAME
------------------------------ -------- ------------------------------
T_PE_L_L                       USABLE   P2
T_PE_L_L                       USABLE   P1
T_PE_L_L                       USABLE   P4
SQL> select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_l_g';
 
INDEX_NAME                     STATUS   PARTITION_NAME
------------------------------ -------- ------------------------------
T_PE_L_G                       USABLE   PG2
T_PE_L_G                       USABLE   PG1
SQL> select INDEX_NAME ,STATUS from dba_indexes where lower(index_name)='t_pe_l_n';
 
INDEX_NAME                     STATUS
------------------------------ --------
T_PE_L_N                       VALID
SQL> select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_h_l';
 
INDEX_NAME                     STATUS   PARTITION_NAME
------------------------------ -------- ------------------------------
T_PE_H_L                       USABLE   P2
T_PE_H_L                       UNUSABLE P1
T_PE_H_L                       UNUSABLE P3
SQL> select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_h_g';
 
INDEX_NAME                     STATUS   PARTITION_NAME
------------------------------ -------- ------------------------------
T_PE_H_G                       UNUSABLE PG2
T_PE_H_G                       UNUSABLE PG1
SQL> select INDEX_NAME ,STATUS from dba_indexes where lower(index_name)='t_pe_h_n';
 
INDEX_NAME                     STATUS
------------------------------ --------
T_PE_H_N                       UNUSABLE
可以看到实际上LIST和HASH的所有索引都没有受到影响,而HASH分区则不同,所有的索引均失效,添加分区后通过HASH算法重新分布了行,那么应该ROWID也受到了影响,可以DUMP出来看看。
索引进行rebuild
alter index T_PE_H_L rebuild  partition p1;
在进行HASH分区的加入分区时候最好如下:
ALTER TABLE t_pe_h
      ADD PARTITION p3 update indexes; 加上UPDATE INDEXES,同时实际上HASH的分区个数应该是2的N次方,不然会分布不均匀。
然后我们测试下DROP partition,drop partition只能用于RANGE 和LIST分区方式,HASH分区不能使用:
You can drop partitions from range, list, or composite range-list partitioned tables. For hash-partitioned tables, or hash subpartitions of range-hash partitioned

tables, you must perform. a coalesce operation instead.
使用脚本:
alter table t_pe_r drop partition p1;
alter table t_pe_l drop partition p1;
然后观察:
SQL> select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_r_l';
 
INDEX_NAME                     STATUS   PARTITION_NAME
------------------------------ -------- ------------------------------
T_PE_R_L                       USABLE   P2
T_PE_R_L                       USABLE   P4
SQL> select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_r_g';
 
INDEX_NAME                     STATUS   PARTITION_NAME
------------------------------ -------- ------------------------------
T_PE_R_G                       UNUSABLE PG2
T_PE_R_G                       UNUSABLE PG1
SQL> select INDEX_NAME ,STATUS from dba_indexes where lower(index_name)='t_pe_r_n';
 
INDEX_NAME                     STATUS
------------------------------ --------
T_PE_R_N                       UNUSABLE
SQL> select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_l_l';
 
INDEX_NAME                     STATUS   PARTITION_NAME
------------------------------ -------- ------------------------------
T_PE_L_L                       USABLE   P2
T_PE_L_L                       USABLE   P4
SQL> select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_l_g';
 
INDEX_NAME                     STATUS   PARTITION_NAME
------------------------------ -------- ------------------------------
T_PE_L_G                       UNUSABLE PG2
T_PE_L_G                       UNUSABLE PG1
SQL> select INDEX_NAME ,STATUS from dba_indexes where lower(index_name)='t_pe_l_n';
 
INDEX_NAME                     STATUS
------------------------------ --------
T_PE_L_N                       UNUSABLE
可以看到普通索引,全局索引均已经失效,但是本地索引却不受影响。
如果我们带上UPDATE INDEXES会怎么样?
SQL> alter table t_pe_r drop partition p1 update indexes;
 
Table altered
SQL> alter table t_pe_l drop partition p1 update indexes;
 
Table altered
 
SQL>
SQL> select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_r_l';
 
INDEX_NAME                     STATUS   PARTITION_NAME
------------------------------ -------- ------------------------------
T_PE_R_L                       USABLE   P2
T_PE_R_L                       USABLE   P4
SQL> select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_r_g';
 
INDEX_NAME                     STATUS   PARTITION_NAME
------------------------------ -------- ------------------------------
T_PE_R_G                       USABLE   PG2
T_PE_R_G                       USABLE   PG1
SQL> select INDEX_NAME ,STATUS from dba_indexes where lower(index_name)='t_pe_r_n';
 
INDEX_NAME                     STATUS
------------------------------ --------
T_PE_R_N                       VALID
SQL> select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_l_l';
 
INDEX_NAME                     STATUS   PARTITION_NAME
------------------------------ -------- ------------------------------
T_PE_L_L                       USABLE   P2
T_PE_L_L                       USABLE   P4
SQL> select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_l_g';
 
INDEX_NAME                     STATUS   PARTITION_NAME
------------------------------ -------- ------------------------------
T_PE_L_G                       USABLE   PG2
T_PE_L_G                       USABLE   PG1
SQL> select INDEX_NAME ,STATUS from dba_indexes where lower(index_name)='t_pe_l_n';
 
INDEX_NAME                     STATUS
------------------------------ --------
T_PE_L_N                       VALID
可以看到加上UPDATE INDEXES 就会自动重建失效的索引。
结论:
1、如果范围分区使用maxvalue选项则报错ORA-14074: 分区界限必须调整为高于最后一个分区界限
2、如果LIST分区使用了default选项则报错ORA-14323: 在 DEFAULT 分区已存在时无法添加分区
3、drop 分区不能使用在HASH分区表中,报错ORA-14255: 未按范围, 组合范围或列表方法对表进行分区,如果要减少一个HASH分区表中的分区需要用ALTER TABLE ... COALESCE PARTITION
4、HASH分区进行ADD PARTITION操作,普通索引,本地索引,全局索引都会失效,除非使用UPDATE INDEXES,但是LIST、RANGE分区不受影响
5、LIST,RANGE分区进行DROP PARTITION操作全局索引及普通索引会失效,但是LOCAL索引不受影响。除非使用UPDATE INDEXES.
6、如果想要为全局索引增加分区,那这个操作只能对HASH分区的全局有效,ORA-14640: 添加/合并索引分区操作只对散列分区的全局索引有效,但是DROP全局索引的分区对HASH\LIST\RANGE均有效。

关于如何理解ADD和DROP分区问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何理解ADD和DROP分区

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何理解ADD和DROP分区

如何理解ADD和DROP分区,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。add和drop分区语法:ALTER TABLE t_pe_r ADD PARTITIO
2023-06-06

云服务器和物理机如何区分

云服务器和物理机的区分主要体现在它们运行环境和使用方式上。1. 运行环境:云服务器是基于虚拟化技术实现的,它是在物理机上通过虚拟化软件创建的虚拟服务器实例。而物理机是指真实的硬件服务器,没有经过虚拟化处理。2. 使用方式:云服务器是通过互联
2023-09-22

云服务器和物理机如何区分

云服务器和物理机是两种不同的计算基础设施,拥有独特的特性和优势。云服务器提供虚拟化、动态资源分配、快速部署、高可扩展性、按需付费模式和附加功能。物理机提供专用硬件、静态资源分配、手动部署、有限的可扩展性、前期资本支出和更高的可靠性。选择取决于业务需求:弹性、快速和低成本(云服务器),或者高性能、控制和数据隐私(物理机)。
云服务器和物理机如何区分
2024-04-11

如何理解C++和C#、Java的区别

本篇文章给大家分享的是有关如何理解C++和C#、Java的区别,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。作为比C语言更简捷的语言,C++语言提供了更好的机制来增强程序的安全
2023-06-17

虚拟主机和物理主机如何区分

虚拟主机和物理主机可以通过以下几个方面进行区分:1. 硬件资源分配:虚拟主机是在一台物理主机上通过虚拟化技术划分出来的多个虚拟环境,每个虚拟主机都拥有一部分的硬件资源,如CPU、内存、磁盘空间等。而物理主机是指一台独立的服务器,所有的硬件资
2023-08-25

hive如何实现分区和分桶

这篇文章主要介绍hive如何实现分区和分桶,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、Hive分区表在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一
2023-06-19

如何通过ODBC在Oracle中管理大数据的分区和子分区

在Oracle中,可以使用ODBC连接来管理大数据的分区和子分区。以下是一些步骤:创建分区表:首先,创建一个分区表,可以使用CREATE TABLE语句来定义表的结构和分区规则。例如:CREATE TABLE sales_data (sa
如何通过ODBC在Oracle中管理大数据的分区和子分区
2024-07-16

Linux根分区和inodes被占满如何解决

本篇内容介绍了“Linux根分区和inodes被占满如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!解决方法df -h 查看分区存储情
2023-06-27

云服务器和物理服务器如何区分

云服务器与物理服务器的区别概念:虚拟(云)vs独立(物理)管理:由用户(物理)vs由提供商(云)资源:固定(物理)vs扩展性(云)访问:本地(物理)vs全球(云)成本:前期高(物理)vs按需计费(云)可靠性:硬件相关(物理)vs冗余保障(云)应用场景:定制、安全(物理)vs弹性、可扩展(云)
云服务器和物理服务器如何区分
2024-04-12

MariaDB中如何进行分区表设计和管理

在MariaDB中,分区表是指将一张表分割成多个独立的子表,每个子表称为一个分区。分区表可以提高查询性能、数据管理和维护的效率。以下是在MariaDB中进行分区表设计和管理的步骤:创建分区表:在创建表的时候,可以通过PARTITION B
MariaDB中如何进行分区表设计和管理
2024-04-09

云服务器和物理服务器如何区分

云服务器和物理服务器可以通过以下几个方面来区分:1. 硬件实体:物理服务器是一台实际存在的计算机硬件设备,包括服务器主板、处理器、内存、磁盘等组件。而云服务器是在云计算平台上虚拟化出来的虚拟机实例,没有实际的硬件设备。2. 部署方式:物理服
2023-09-27

如何区分MySQL的innodb_flush_log_at_trx_commit和sync_binlog

innodb_flush_log_at_trx_commit和sync_binlog 两个参数是控制MySQL磁盘写入策略以及数据安全性的关键参数。 show variables like "innodb_flush_log_at_trx
2022-05-23

如何区分 golang 函数和方法?

go函数和方法的区别在于:函数定义于包外,不接收接收器;而方法定义于类型内,接收类型接收器作为第一个参数。如何区分 Go 函数和方法?在 Go 语言中,虽然函数和方法看上去很相似,但两者之间存在本质区别。函数定义于包作用域之外,可以直接
如何区分 golang 函数和方法?
2024-04-25

如何在Couchbase中实现数据分区和副本管理

在Couchbase中实现数据分区和副本管理可以通过以下步骤来实现:数据分区:Couchbase使用分片(sharding)来实现数据分区。您可以在创建bucket时指定分片数目,Couchbase会自动将数据分布在不同的分片上。这样可以提
如何在Couchbase中实现数据分区和副本管理
2024-04-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录