分区表的好处,应该就是提高性能。

提高性能的套路,一般就是垂直扩展和水平扩展。垂直扩展就是换更强的服务器,水平扩展就是加更多的服务器。垂直扩展适合单机版,水平扩展常用于分布式系统。而传统的数据库,如oracle、sql server等,本质上是一个单机系统,你说你多加几台服务器,一起跑oracle,没啥意义。所以,对于oracle等数据库,常用的提升策略,就是垂直扩展。关系型数据库里面,好像是mysql比较接近分布式系统,主从复制,读写分离,玩得很溜。oracle嘛,如果硬要说水平扩展的,可能就是共享磁盘方式了吧,多个磁盘或者是网络存储什么的,分散硬盘IO的压力。

以上都是对硬件提升而言。在软件设置里,数据库性能提升,还可以采用反规范化的策略,比如将表进行分割。这里也有所谓水平分割,垂直分割。垂直分割就是将表拆了,一个大表拆成多个小表,比如一个大表,几十上百个字段,密密麻麻,拆成几个小表,每个表十来个字段。好处就是提高查询命中率。因为关系型数据库采用的是按页存储,一条记录越短,那么每页存储的记录数就越多,你要查点什么,返回给你的页数就越少,性能自然就提升了。水平分割就是将记录进行分割,比如一年的表分成12个表来存,一个月一个表,每个表记录数也少了。

一、建立分区表

水平分割除了物理分表,采用分区表也有类似的效果。比如按照某字段的值进行分区。以下是一个存储文件信息的表,按照所属文件夹ID进行分区:

CREATE TABLE "WORK"."FILES"

("ID" NUMBER NOT NULL ENABLE,

"FOLDERID" NUMBER NOT NULL ENABLE,

"FILENAME" VARCHAR2(50),

"SUFFIX" VARCHAR2(10),

"FILESIZE" NUMBER,

"ACCEPTDATE" DATE,

"DATADATE" DATE,

"NOTE" VARCHAR2(100),

"STATUS" VARCHAR2(2),

CONSTRAINT "PK_FILES" PRIMARY KEY ("ID")

) partition by range (FOLDERID) --分区依据列

(partition p_1 values less than (20000),

partition p_2 values less than (40000),

partition p_3 values less than (60000),

partition p_4 values less than (80000),

partition p_5 values less than (100000),

partition p_6 values less than (120000),

partition p_7 values less than (140000),

partition p_8 values less than (160000),

partition p_9 values less than (180000),

partition p_10 values less than (200000),

partition p_11 values less than (220000),

partition p_12 values less than (240000),

partition p_13 values less than (260000),

partition p_14 values less than (280000),

partition p_15 values less than (300000),

partition p_16 values less than (320000),

partition p_17 values less than (340000),

partition p_18 values less than (360000),

partition p_19 values less than (380000),

partition p_20 values less than (400000),

partition p_21 values less than (420000),

partition p_22 values less than (440000),

partition p_23 values less than (460000),

partition p_24 values less than (480000),

partition p_25 values less than (500000),

partition p_26 values less than (520000),

partition p_27 values less than (540000),

partition p_28 values less than (560000),

partition p_29 values less than (580000),

partition p_30 values less than (600000),

partition p_31 values less than (maxvalue)

);

这个分区表的意图很明显,就是folderid每2万的记录就分作一个区,这样用folderId进行查找的时候,就到某个区直接找就行了,一个区的记录数毕竟小多了。

二、拆分最大分区

这个分区方案,在系统运行之初是没有问题的。但因为数据量很大,数据增长很快,分区依据列FolderID现在已经突破了60万,所以后来插进来的记录,全部都挤到最后一个分区 p_31里了,查了一下,有差不多接近6千万条,系统反应非常慢,最终卡死。

所以拆分最大分区,刻不容缓。

三、如何拆分最大分区

在oracle中,拆一个分区,每次只能一分为二,而不能直接将一个分区拆成多个。因此,网上有些文章给出的方案就是搞一个存储过程,里面循环执行,直至拆成多个分区。

循环是要循环的,但不一定要用存储过程,直接用代码块也可以。代码块其实就相当于匿名存储过程了。

以下给出完整步骤:

1、先停止所有业务系统

如果是7 * 24小时的生产系统怎么办?这个我没想好。也许可以用什么备用程序或数据库顶上。否则数据量大的情况下,一边跑业务系统,数据不停进来,这边还在拆,速度肯定很慢。

2、观察分区情况

select table_name,partition_name,high_value,initial_extent,next_extent,num_rows,blocks from user_tab_partitions a

where a.table_name=upper('FILES')

order by partition_name;

select count(*) from files partition (p_31) where folderid > 600000;

3、先拆出一个试试水

alter table files split partition p_31 at (620000) into (PARTITION p_31,PARTITION p_default) update index;

请注意,后面这个update index这个选项必不可少,否则拆分以后,索引不可用,报ORA-01502错误,新记录会插不进去!(错误ORA-01502: 索引或这类索引的分区处于不可用状态)

4、批量拆分

发现一切尽在掌握,开始大规模拆分。代码无非主要就是执行拼凑的SQL语句。

declare

i number;

j number;

k number;

sql1 varchar2(2000);

begin

--运行前先确定好以下三个变量:

-----------------------------------------------------------------

i:= 620000;--目前次大分区临界点,最大是 p_default

j:= 31;--次大分区序号

k:= 2000000;--分拆后次大分区临界点

-----------------------------------------------------------------

while i < k loop

i := i + 20000;

j := j + 1;

sql1 := 'alter table files_his split partition p_default at (' || i || ') into (PARTITION p_' || j || ',PARTITION p_default) update index';

execute immediate sql1;

end loop;

end;

5、观察分区情况

select table_name,partition_name,high_value,initial_extent,next_extent,num_rows,blocks from user_tab_partitions a

where a.table_name=upper('FILES')

order by partition_name;

6、查找一下数量

select count(*) from files partition (p_31) where folderid > 600000;

select count(*) from files partition (p_32) where folderid > 620000;

select count(*) from files partition (p_33) where folderid > 640000;

四、重建索引

分区时,语句务必带上“update index”选项,否则拆分以后,索引不可用,报ORA-01502错误,新记录会插不进去!(错误ORA-01502: 索引或这类索引的分区处于不可用状态)。但网上许多教程,根本没提这一点,以致我辛辛苦苦分完区,又要重建索引。

--此为拆分分区不加update index的补救措施

--查看索引情况

select owner,table_name,index_name,uniqueness,status from dba_indexes i

where i.owner = 'WORK' and i.table_name = 'FILES';

--重建...

alter index IX_FOLDER_FILENAME rebuild online;

alter index IX_FOLDER rebuild online;

alter index PK_FILES rebuild online;

五、结后语

拆分分区感觉比较麻烦,最好的方式就是防微杜渐,预先估计好数据量,在分区表建立之初就预留足够的分区。

oracle拆分分区语法详解大全_oracle拆分分区表及重建索引相关推荐

  1. oracle拆分分区语法详解大全_Oracle hash的分区方法详解

    hash的原理虽然简单,但是它在数据库中可以说是无处不在.其中hash partition是hash在数据库中一个简单的应用,虽然它没有range partition那么常用,但是我们在做数据库水平拆 ...

  2. oracle拆分分区语法详解大全_学习笔记:Oracle分区表 添加 删除 合并 删除 交换 拆分等分区表的操作案例...

    天萃荷净 Oracle分区表管理,记录关于Oracle分区表的管理案例:创建.删除.合并.拆分.交换.更改分区表的操作方法 1.添加创建分区表 1.1)增加分区(add partition) 语法是: ...

  3. Oracle触发器的语法详解

    触发器是一种特殊的存储过程,下面是触发器的详细说明: ORACLE 触发器 ORACLE产生数据库触发器的语法为: create [or replace] trigger 触发器名 触发时间 触发事件 ...

  4. code函数oracle列子,Oracle Pivot函数语法详解及应用实例

    遇到一个难题,须要将单列数据根据分列显示,须要用到Pivot语法.html 参照现有的query,写了一段相似如下script片断的sql语句,问题搞定.经验总结:能用SQL搞定的问题,就不要人工去处 ...

  5. oracle insert指定分区,oracle partition 分区建立详解

    Oracle9i通过引入列表分区(List Partition),使得当前共有4种分区数据 方法,具体列出如下: 字串9 第一种 范围分区 字串4 1 对表进行单列 范围分区: 字串6 这使最为常用也 ...

  6. python语法详解大全_笔记:Python 语法要点汇总

    Python 是一门解释型语言,无需编译和链接 Python 解释器 交互模式 脚本模式 源码编码 默认情况下,Python 源文件是 UTF-8 编码 指定源文件的字符编码 # -*- coding ...

  7. Oracle创建表语句(Create table)语法详解及示例

    Oracle创建表语句(Create table)语法详解及示例   创建表(Create table)语法详解 1. ORACLE常用的字段类型ORACLE常用的字段类型有 VARCHAR2 (si ...

  8. SQL全方位攻略:5. SQL “方言”大比拼:Oracle、MySQL、PostgreSQL限制检索行数语法详解(分页查询)

    系列文章目录 SQL全方位攻略:1.数据库介绍 SQL全方位攻略:2.SQL介绍 SQL全方位攻略:3.SQL标准 SQL全方位攻略:4. 标准SQL和SQL"方言" 文章目录 系 ...

  9. python编程语法大全-Python编程入门——基础语法详解

    今天小编给大家带来Python编程入门--基础语法详解. 关于怎么快速学python,可以加下小编的python学习群:611+530+101,不管你是小白还是大牛,小编我都欢迎,不定期分享干货 每天 ...

最新文章

  1. 调试小技巧---利用调用堆栈
  2. python fabric使用
  3. 刘宇凡:自媒体不是自媒体 应是志媒体
  4. ios::ate ios::app ios::out ios::in ios::trunc ios::binary(组合总结)
  5. 128核云原生新力作:Ampere® Altra® Max性能参数公布,提升50%!
  6. java 类锁如何获得_Java Synchronized获得类的锁和获得对象的锁有什么区别呢?
  7. php隐藏表单提交表单提交表单_浅谈php提交form表单
  8. Node.js 入门知识点总结
  9. 如何查看静态库中有哪些函数
  10. linux虚拟主机用织梦,织梦程序用什么虚拟主机很服务器好
  11. win10系统更新时一直停留在重新启动界面的解决方法
  12. linux系统tcl电视刷机包,【欢视商店】TCL电视RT95系列升级包与刷机包
  13. 数据库实验报告一-创建数据库和表
  14. java读取properties文件连接数据库
  15. 以太坊Whisper协议
  16. Windows Server 2016安装SCCM2019
  17. fun在c语言中意义与用法,fun的用法
  18. R语言使用t.test函数进行t检验、使用配对的t检验(paired)检验组间不独立数据的差异是否有统计学意义
  19. Google官方控件ShapeableImageView使用
  20. 设计模式原则 - 迪米特法则(六)

热门文章

  1. 什么?“裸辞”一个月拿到13家offer,网友:你是在找存在感吗···
  2. 若依集成JimuReport积木报表进行token传递
  3. 有哪些电容笔值得推荐?十大电容笔知名品牌
  4. java代码的执行机制+JVM+GC
  5. base64编码 vba_【VBA研究】如何用Base64 编解码方法实现简单的加解密
  6. 中式红木装修,最适合别墅的装修风格!
  7. 【OpenCv】 VS C++ (零):专栏总揽与OpenCv介绍
  8. angular里使用jquery
  9. GPT专业应用:生成电影解说词
  10. 奇数阶幻方法C语言运用指针,奇数幻方的构造方法(转载)