数据库分区分表

http://blog.163.com/[email protected]/blog/static/12257726201051735823602/

一、分区表、分区索引概念
 
    为了满足而非常大的数据库的管理,需要创建和使用分区表和分区索引,分区表允许将数据分成成为分区甚至子分区的更小的、更好管理的块。每个分区可以单独管理,可以不依赖其他分区而单独发挥作用,因此可以提供更有利于可用性和性能的结构。 
 
    表或索引可以共享相同的逻辑属性,但是可以有不同的物理属性。例如所有分区/子分区可以共享相同的列和约束,但是可以有不同的表空间。 
 
    最好可以将表或者索引的分区存储到不同的表空间,这样的好处是: 
    ● 减少数据在多个分区中冲突的可能性 
    ● 可以单独备份和恢复每个分区 
    ● 控制分区与磁盘驱动器之间的映射(平衡I/O负载) 
    ● 改善可管理性、可用性和性能 
 
 
二、分区方法 
 
    1、范围分区 
 
    当列数据可以被划分为逻辑范围时(例如年度中的月份),就可以使用范围分区。当数据在整个范围中能被均等地划分时性能最好。如果所划分的分区范围大小明显不同时,则需要考虑其他的分区方法了。 
 
    创建范围分区时,需要指定分区列、表示分区边界,例如: 
 
    CREATE TABLE sales 
    ( invoice_no NUMBER, 
    sale_year INT NOT NULL, 
    sale_month INT NOT NULL, 
    sale_day INT NOT NULL ) 
    PARTITION BY RANGE (sale_year, sale_month, sale_day) 
    ( PARTITION sale_q1 VALUES LESS THAN (1999, 04, 01) 
    TABLLESPACE tsa, 
    PARTITION sale_q2 VALUES LESS THAN (1999, 07, 01) 
    TABLLESPACE tsb, 
    PARTITION sale_q3 VALUES LESS THAN (1999, 10, 01) 
    TABLLESPACE tsc, 
    PARTITION sale_q4 VALUES LESS THAN (2000, 01, 01) 
    TABLLESPACE tsd ); 
 
    注:要注意使用不同字符集的数据库时,最字符的分类序列有时是不同的。 
 
    2、散列分区 
 
    当数据不太容易进行范围划分时,为了性能和管理的原因又想分区时,就可以使用散列分区方法。散列分区将在指定数量的分区中均等得划分数据。创建散列分区需要指定分区列、分区数量(或单独的分区描述)举例如下: 
 
    CREATE TABLE scubagear 
    (id NUMBER, 
    name VARCHAR2(60)) 
    PARTITION BY HASH (id) 
    PARTITIONS 4 
    STORE IN (gear1, gear2, gear3, gear4); 
 
    3、列表分区 
 
    当需要明确地控制如何将行映射到分区时,就需要使用列表分区。可以在每个分区表述中为该分区指定一列离散值。 
 
    列表分区与范围分区、散列分区的区别在于 
    ● 范围分区为分列假设了一个值的自然范围,无法将该值范围之外的分区组织在一起 
    ● 散列分区无法对数据的划分进行控制,在逻辑上是无须的 
 
    需要注意的是:列表分区无法支持多列分区。具体举例如下: 
 
    CREATE TABLE sales_by_region 
    (deptno number, 
    deptname varchar2(20), 
    quarterly_sales number(10,2), 
    state varchar2(2)) 
    PARTITION BY LIST (state) 
    (PARTITION q1_northwest VALUES (‘OR‘, ‘WA‘), 
    PARTITION q1_southwest VALUES (‘AZ‘, ‘UT‘, ‘NM‘), 
    PARTITION q1_northeast VALUES (‘NY‘, ‘VM‘, ‘NJ‘), 
    PARTITION q1_southeast VALUES (‘FL‘, ‘GA‘), 
    PARTITION q1_northcentral VALUES (‘SD‘, ‘WI‘), 
    PARTITION q1_southcentral VALUES (‘OK‘, ‘TX‘)); 
 
    4、组合分区 
 
    组合分区是在分区中使用范围分区,而在子分区中使用散列分区。组合分区很适合于历史数据和条块数据两者,改善了范围分区及其数据放置的管理型。例如一下举例: 
 
    CREATE TABLE scubaqear (equipno NUMBER, equipname VARCHAR(32), price NUMBER) 
    PARTITION BY RANGE (equipno) SUBPARTITION BY HASH(equipname) 
    SUBPARTITIONS 8 STORE IN (ts1, ts2, ts3, ts4) 
    (PARTITION p1 VALUES LESS THAN (1000), 
    PARTITION p2 VALUES LESS THAN (2000), 
    PARTITION p3 VALUES LESS THAN (MAXVALUE)); 
 
 
三、分区表的创建 
 
    1、创建范围分区表 
 
    使用PARTITION BY RANGE子句来表明范围分区,使用PARTITION子句标识各个分区范围,另外PARTITION子句下级子句可以指定特别用于该分区段的物理属性,如果没有重载,则自动继承基础表的属性。 
 
    重新修改上面的例子: 
 
    CREATE TABLE sales 
    ( invoice_no NUMBER, 
    sale_year INT NOT NULL, 
    sale_month INT NOT NULL, 
    sale_day INT NOT NULL ) 
    STORAGE (INITIAL 100K NEXT 50K) LOGGING 
    PARTITION BY RANGE (sale_year, sale_month, sale_day) 
    ( PARTITION sale_q1 VALUES LESS THAN (1999, 04, 01) 
    TABLLESPACE tsa STORAGE (INITIAL 20K, NEXT 10K), 
    PARTITION sale_q2 VALUES LESS THAN (1999, 07, 01) 
    TABLLESPACE tsb, 
    PARTITION sale_q3 VALUES LESS THAN (1999, 10, 01) 
    TABLLESPACE tsc, 
    PARTITION sale_q4 VALUES LESS THAN (2000, 01, 01) 
    TABLLESPACE tsd ) 
    ENABLE ROW MOVMENT; 
 
    说明:在表层级指定了存储参数个LOGGING属性,而在分区sale_q1中的存储参数进行重置,原因是第一季度业务较少。另外使用ENABLE ROW MOVMENT子句,表示如果键值更改了,就允许将行迁移到新分区。 
 
    另外创建一个范围分区的全局索引如下: 
 
    CREATE INDEX month_ix ON sales(sales_month) 
    GROBAL PARTITION BY RANGE(sales_month) 
    (PARTITION pm1_ix VALUES LESS THAN (2) 
    PARTITION pm2_ix VALUES LESS THAN (3) 
    PARTITION pm3_ix VALUES LESS THAN (4) 
    PARTITION pm4_ix VALUES LESS THAN (5) 
    PARTITION pm5_ix VALUES LESS THAN (6) 
    PARTITION pm6_ix VALUES LESS THAN (7) 
    PARTITION pm7_ix VALUES LESS THAN (8) 
    PARTITION pm8_ix VALUES LESS THAN (9) 
    PARTITION pm9_ix VALUES LESS THAN (10) 
    PARTITION pm10_ix VALUES LESS THAN (11) 
    PARTITION pm11_ix VALUES LESS THAN (12) 
    PARTITION pm12_ix VALUES LESS THAN (MAXVALUE)); 
 
    2、创建散列分区表 
 
    使用PARTITION BY HASH子句来表明散列分区,使用PARTITIONS子句来指定要创建的分区数量,另外使用PARTITION子句来命名各个分区及其表空间,但是只能指定TABLESPACE属性,其他的属性只能继承于表层次。举例如下: 
 
    CREATE TABLE dept (deptno NUMBER, dept name VARCHAR2(32)) 
    STORAGE (INITIAL 10K) 
    PARTITION BY HASH (deptno) 
    (PARTITION p1 TABLESPACE ts1, PARTITION p2 TABLESPACE ts2, 
    PARTITION p3 TABLESPACE ts3, PARTITION p4 TABLESPACE ts4); 
 
    为上表创建局部索引,则Oracle会自动创建一个与基础表同分区的索引。 
 
    CREATE INDEX locd_dept_ix ON dept(deptno) LOCAL 
 
    3、创建列表分区表 
 
    使用PARTITION BY LIST子句来表明列表分区,使用PARTITION子句指定一串文字值,即为分区列的离散值。另外PARTITION子句下级子句可以指定特别用于该分区段的物理属性,如果没有重载,则自动继承基础表的属性。 
 
    此类型基本与上面的举例相同,不再重新举例。 
 
    4、创建组合分区表 
 
    先使用PARTITION BY RANGE子句,然后指定一个与PARTITION BY HASH语句遵从语法和规则的SUBPARTITION BY HASH子句来表明组合分区,各个PARTITION子句后面紧跟SUBPARTITION或SUBPARTITIONS子句。 
 
    另外可以为每个(范围)分区指定不同的属性,另外还可以使用STORE IN子句来指定不同的不同的表空间。 
 
    CREATE TABLE emp (deptno NUMBER, empname VARCHAR(32), grade NUMBER) 
    PARTITION BY RANGE (deptno) SUBPARTITION BY HASH(empname) 
    SUBPARTITIONS 8 STORE IN (ts1, ts3, ts5, ts7) 
    (PARTITION p1 VALUES LESS THAN (1000) PCTFREE 40, 
    PARTITION p2 VALUES LESS THAN (2000) 
    STORE IN (ts2, ts4, ts6, ts8), 
    PARTITION p3 VALUES LESS THAN (MAXVALUE) 
    (SUBPARTITION p3_s1 TABLESPACE ts4, 
    SUBPARTITION p3_s2 TABLESPACE ts5)); 
 
    另创建一个局部索引,且分段分布于表空间ts7、ts8、ts9 
 
    CREATE INDEX emp_ix ON emp(deptno) 
    LOCAL STORE IN (ts7, ts8, ts9); 
 
    5、创建分局索引结构表 
 
    可以对索引结构表使用范围分区或散列分区,只有范围分区索引结构表才能包含LOB数据类型的列。 
 
    创建范围分区或散列分区索引结构表与创建普通表相似,但也有区别,区别在于: 
    ● 创建该表时需要指定ORGANIZATION INDEX子句,需要时还要指定INCLUDING和OVERFLOW子句 
    ● PARTITION或PARTITIONS子句可以有OVERFLOW下级子句,允许在分区层次上指定溢出段的属性 
 
    注:索引结构表的分区列集合必须是主键列的子集,因为索引结构表的行是按表的主键索引存储的,通过将分区键选成主键的子集,插入操作就只需要校验在单个分区中的主键的唯一性,因此对分区的维护就互不依赖了。 
 
    a.创建范围分区索引结构表 
 
    CREATE TABLE sales(acct_no NUMBER(5), 
    acct_name CHAR(30), 
    amount_of_sale NUMBER(6), 
    week_no INTEGER, 
    SALE_DETAILES varchar2(1000), 
    PRIMARY KEY (acct_no, acct_name, week_no)) 
    ORGANIZATION INDEX 
    INCLUDING week_no 
    OVERFLOW TABLESPACE overflow_here 
    PARTITION BY RANGE (week_no) 
    (PARTITION VALUES LESS THAN (5) 
    TABLESPACE ts1, 
    PARTITION VALUES LESS THAN (9) 
    TABLESPACE ts2 OVERFLOW TABLESPACE overflow_ts2, 
    ... 
    PARTITION VALUES LESS THAN (MAXVALUE) 
    TABLESPACE ts13); 
 
    说明: 
    1、INCLUDING子句指定将week_no列之后的所有列都存储在溢出段中。 
    2、每个分区有一个溢出段,都存储在相同的表空间(overflow_here)中。 
    3、通过OVERFLOW TABLESPACE子句指定各个分区层次的溢出表空间。 
 
 
    b. 创建散列分区索引结构表 
 
    CREATE TABLE sales(acct_no NUMBER(5), 
    acct_name CHAR(30), 
    amount_of_sale NUMBER(6), 
    week_no INTEGER, 
    sale_details VARCHAR2(1000), 
    PRIMARY KEY (acct_no, acct_name, week_no)) 
    ORGANIZATION INDEX 
    INCLUDING week_no 
    OVERFLOW 
    PARTITION BY HASH (week_no) 
    PARTITIONS 16 
    STORE IN (ts1, ts2, ts3, ts4) 
    OVERFLOW STORE IN (ts3, ts6, ts9); 
 
    建议在创建具有可变分区键的散列分区索引结构表时,明确指定ROW MOVEMENT ENABLE子句,因为一个好的散列函数会将各行做一个很好的平衡分布,所以改变主键列很有可能会移动到其他分区。 
 
    6 、多个数据块大小的分区限制 
 
    若在具有多个数据块大小的表空间中创建分区对象时需要特别留意,因为分区对象存储到这些表空间时会受到某些限制。例如以下的分区必须存储在具有相同数据块大小的表空间中: 
 
    ● 常规表 
    ● 索引 
    ● 索引结构表的主键索引段 
    ● 索引结构表的溢出段 
    ● 在外存储的LOB列

时间: 2024-07-31 13:38:44

数据库分区分表的相关文章

数据库分区分表以及读写分离

Oracle数据库分区是作为Oracle数据库性能优化的一种重要的手段和方法,做手头的项目以前,只聆听过分区的大名,感觉特神秘,看见某某高手在讨论会上夸夸其谈时,真是骂自己学艺不精,最近作GPS方面的项目,处理的数据量达到了几十GB,为了满足系统的实时性要求,必须提高数据的查询效率,这样就必须通过分区,以解燃眉之急! 先说说分区的好处吧! 1) 增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用; 2) 维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可; 3) 均

海量数据查询关系型数据库存储大数据,要点就是:简单存储、分区分表、高效索引、批量写入

海量数据查询 https://www.cnblogs.com/nnhy/p/DbForBigData.html 相当一部分大数据分析处理的原始数据来自关系型数据库,处理结果也存放在关系型数据库中.原因在于超过99%的软件系统采用传统的关系型数据库,大家对它们很熟悉,用起来得心应手. 在我们正式的大数据团队,数仓(数据仓库Hive+HBase)的数据收集同样来自Oracle或MySql,处理后的统计结果和明细,尽管保存在Hive中,但也会定时推送到Oracle/MySql,供前台系统读取展示,生成

MySql之分区分表

MySql之分区分表 分表的概念 分表:将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件.这些表可以分布在同一块磁盘上,也可以在不同的机器上.app读写的时候根据事先定义好的规则得到对应的表名,然后去操作它. 常用的算法:hash或求余(取模)等方式 分表的好处:减小数据库的负担,缩短查询时间 分表的类型:①垂直切分:是指数据表列的拆分,把一张列比较多的表拆分为多张表 ②水平拆分是指数据表行的拆分,把一张的表的

FreeSql (三十一)分区分表

分区 分区就是把一个数据表的文件和索引分散存储在不同的物理文件中.把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上,数据库不同实现方式有所不同. 与分表不同,一张大表进行分区后,他还是一张表,不会变成二张表,但是他存放数据的区块变多了.分区的概念,我觉得就想突破磁盘I/O瓶颈,想提高磁盘的读写能力,来增加数据库的性能. 分区实现是比较简单的,建立分区表,根建平常的表没什么区别,并且对开发代码端来说是透明. postgresql10以上的自动分区分表功能: 1.首先创

mysql分库分区分表

分表: 分表分为水平分表和垂直分表. 水平分表原理: 分表策略通常是用户ID取模,如果不是整数,可以首先将其进行hash获取到整. 水平分表遇到的问题: 1. 跨表直接连接查询无法进行 2. 我们需要统计数据的时候 3. 如果数据持续增长,达到现有分表的瓶颈,需要增加分表,此时会出现数据重新排列的情况 解决方案建议: 1. 第1,2点可以通过增加汇总的冗余表,虽然数据量很大,但是可以用于后台统计或者查询时效性比较底的情况,而且我们可以提前算好某个时间点或者时间段的数据 2. 第3点解决建议: 1

MySQL分区分表

博文大纲: 1.为什么要分表? 2.MySQL分表 3.利用merge存储引擎实现分表 4.MySQL分区 1.为什么要分表? 数据库数据越来越大,随之而来的是单个表中数据太多.以至于查询速度变慢,而且由于表的锁机制导致应用操作也搜到严重影响,出现了数据库性能瓶颈.mysql中有一种机制是表锁定和行锁定,是为了保证数据的完整性.表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行.行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作.当出现这种情况时,我们可以考虑分

postgresql10以上的自动分区分表功能

一.列分表 1.首先创建主分区表: create table fenbiao(id int,year varchar) partition by list(year)这里设置的是根据year列进行数据分表;创建后使用navicat是看不到的; 2.创建分表: create table fenbiao_2017 partition of fenbiao for values in ('2017')create table fenbiao_2018 partition of fenbiao for

zabbix分区分表

验证脚本运行 mysql -uzabbix -pzabbix zabbix show create table history\G; 运行此脚本的时候,Zabbix库有存量数据,此时,建议清空想表的数据,然后再执行此脚本 use zabbix; truncate table history; optimize table history; truncate table history_str; optimize table history_str; truncate table history_

Atitit数据库层次架构表与知识点 attilax 总结

第一阶段,大概理论(三五天 数据库的类型,网状,层次,树形数据库,kv数据库.Oodb Er模型   sql 并发控制与lock  Acid数据库完整性 关系模型 1NF.2NF.3NF和BCNF 数据库范式 存储过程 触发器 视图 约束 第二阶段  项目使用(工作开始到三年左右 数据库连接池,sql linq 目前我们项目中使用的关系数据库,为主 也少部分nosql数据库,oo数据库,树形数据库. Orm ,ui form映射.. 第10章 复制 第三阶段   项目总结(工作开始 一般需要5年