学习数据库分区和虚表(Oracle)
2018-03-13 19:59
323 查看
之前工作时候接触到了数据库分区,数据库的数据特别大,记得使用分区后还有14w数据,因为刚开始疏漏,没有加入分区字段参数,导致查询时间过久,还好系统没上线,之后补习下分区知识,使用分区可以在页面加载时候查询时间不会很久。
这里笔记是水平分区,根据数据量长度分区,看过文章说到分区后可以存储到磁盘不同位置,进行IO操作还可以不互相影响,操作失误也只是在同一分区,只是操作更新也只能是一个一个分区去操作。
在业务上说,只是关心对应部分数据,在用户体验上也是快速,减轻后端访问数据库压力(就不说缓存了)。
例子:把表分成10段,只是需要查询你需要那段数据,好比范围查询,但并不需要全表遍历。
一篇学习的笔记:-- oracle数据库分区
CREATE TABLE WINNER(
WINNER_ID NUMBER NOT NULL PRIMARY KEY,
FIRST_NAME VARCHAR2(30) NOT NULL,
LAST_NAME VARCHAR2(30) NOT NULL,
MOBILE VARCHAR2(15) NOT NULL,
EMAIL VARCHAR2(80),
STATUS CHAR(1),
PARTNAME NUMBER NOT NULL,
UP_DATE DATE
)
-- 第一种方法 根据ID分区,水平分区
-- 表中由 200000条数据
PARTITION BY RANGE(WINNER_ID)(
PARTITION WIN_PART1 VALUES LESS THAN(100000) tablespace WIN_TD01,
PARTITION WIN_PART2 VALUES LESS THAN(200000) tablespace WIN_TD02
)
-- 第二种方法 按时间划分
PARTITION BY RANGE(UP_DAYE)(
PARTITION WIN_DATE_PART01 VALUES LESS THAN(TO_DATE('2017-01-01',YY-MM-DD''))tablespace WIN_TD01,
PARTITION WIN_DATE_PART02 VALUES LESS THAN(TO_DATE('2017-04-01',YY-MM-DD''))tablespace WIN_TD02,
PARTITION WIN_DATE_PART03 VALUES LESS THAN(TO_DATE('2017-07-01',YY-MM-DD''))tablespace WIN_TD03
)
-- 第三种方法 根据字段值得范围
PARTITION BY RANGE(WINNER_ID)(
PARTITION WIN_PART01 VALUES LESS THAN(2000)tablespace WIN_TD01,
PARTITION WIN_PART02 VALUES LESS THAN(6000)tablespace WIN_TD02,
PARTITION WIN_PART03 VALUES LESS THAN(10000)tablespace WIN_TD03
PARTITION WIN_PART04 VALUES LESS THAN(MAXVALUE)tablespace WIN_TD04
)
-- 第四种方法
-- 根据字段划分
PARTITION BY LIST(STATUS)(
PARTITION WIN_PART01 VALUES('ACTIVE')tablespace WIN_TD01,
PARTITION WIN_PART02 VALUES('INACTIVE')tablespace WIN_TD02
)
-- 列表分区
PARTITION BY LIST(PARTNAME)(
PARTITION WIN_DATE_PART01 VALUES(1)tablespace WIN_TD01
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
),
PARTITION WIN_DATE_PART02 VALUES(2)tablespace WIN_TD02
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
)
)
-- 第五种和方法 散列分区
PARTITION BY HASH(PARTNAME)(
PARTITION WIN_DATE_PART01 tablespace HASH_TD01,
PARTITION WIN_DATE_PART02 tablespace HASH_TD02
)
-- 可以在建表后添加
PARTITION BY HASH(PARTNAME) PARTITION 5
STORE IN (PART1,PART2,PART3,PART4,PART5);
-- 组合散列分区(range-list)
PARTITION BY RANGE(PARTNAME) SUBPARTITION BY LIST (STATUS)(
PARTITION WIN_PART01 VALUES(1)tablespace WIN_TD01(
SUBPARTITION STATUS_PART01 VALUES('ACTIVE') tablespace WIN_TD01,
SUBPARTITION STATUS_PART02 VALUES('INACTIVE') tablespace WIN_TD01
),
PARTITION WIN_PART01 VALUES(2)tablespace WIN_TD02(
SUBPARTITION STATUS_PART03 VALUES('ACTIVE') tablespace WIN_TD02,
SUBPARTITION STATUS_PART04 VALUES('INACTIVE') tablespace WIN_TD02
)
)
-- 组合范围列表分区
PARTITION BY RANGE(PARTNAME) SUBPARTITION BY LIST (STATUS) SUBPARTITION 3 STORE IN (part1,part2,part3)
(
PARTITION WIN_DATE_PART01 VALUES LESS THAN(TO_DATE('2017-01-01',YY-MM-DD''))tablespace WIN_TD01,
PARTITION WIN_DATE_PART02 VALUES LESS THAN(TO_DATE('2017-04-01',YY-MM-DD''))tablespace WIN_TD02,
PARTITION WIN_DATE_PART03 VALUES LESS THAN(MAXVALUE)tablespace WIN_TD03
);
然后,在工作朋友@GIN那里学到虚表的使用,在大数据查询时候,建立一个虚表可以减少查询时间和数据库压力(有点类似视图,快照)INSERT INTO user_detail
SELECT W.WINNER_ID
W.FIRST_NAME
W.LAST_NAME
W.MOBILE
W.EMAIL
W.STATUS
W.PARTNAME
W.UP_DATE
FROM WINNER W
WHERE W.STATUS = 'ACTIVE'
AND EXISTS (WITH KM AS(SELECT USER_NAME,USER_ID from T_USER WHERE AGE=18)
SELECT USER_NAME FROM KM WHERE KM.USER_Id = W.WINNER_ID)
这里exists里的sql就是虚表(临时表)建立。
这里笔记是水平分区,根据数据量长度分区,看过文章说到分区后可以存储到磁盘不同位置,进行IO操作还可以不互相影响,操作失误也只是在同一分区,只是操作更新也只能是一个一个分区去操作。
在业务上说,只是关心对应部分数据,在用户体验上也是快速,减轻后端访问数据库压力(就不说缓存了)。
例子:把表分成10段,只是需要查询你需要那段数据,好比范围查询,但并不需要全表遍历。
一篇学习的笔记:-- oracle数据库分区
CREATE TABLE WINNER(
WINNER_ID NUMBER NOT NULL PRIMARY KEY,
FIRST_NAME VARCHAR2(30) NOT NULL,
LAST_NAME VARCHAR2(30) NOT NULL,
MOBILE VARCHAR2(15) NOT NULL,
EMAIL VARCHAR2(80),
STATUS CHAR(1),
PARTNAME NUMBER NOT NULL,
UP_DATE DATE
)
-- 第一种方法 根据ID分区,水平分区
-- 表中由 200000条数据
PARTITION BY RANGE(WINNER_ID)(
PARTITION WIN_PART1 VALUES LESS THAN(100000) tablespace WIN_TD01,
PARTITION WIN_PART2 VALUES LESS THAN(200000) tablespace WIN_TD02
)
-- 第二种方法 按时间划分
PARTITION BY RANGE(UP_DAYE)(
PARTITION WIN_DATE_PART01 VALUES LESS THAN(TO_DATE('2017-01-01',YY-MM-DD''))tablespace WIN_TD01,
PARTITION WIN_DATE_PART02 VALUES LESS THAN(TO_DATE('2017-04-01',YY-MM-DD''))tablespace WIN_TD02,
PARTITION WIN_DATE_PART03 VALUES LESS THAN(TO_DATE('2017-07-01',YY-MM-DD''))tablespace WIN_TD03
)
-- 第三种方法 根据字段值得范围
PARTITION BY RANGE(WINNER_ID)(
PARTITION WIN_PART01 VALUES LESS THAN(2000)tablespace WIN_TD01,
PARTITION WIN_PART02 VALUES LESS THAN(6000)tablespace WIN_TD02,
PARTITION WIN_PART03 VALUES LESS THAN(10000)tablespace WIN_TD03
PARTITION WIN_PART04 VALUES LESS THAN(MAXVALUE)tablespace WIN_TD04
)
-- 第四种方法
-- 根据字段划分
PARTITION BY LIST(STATUS)(
PARTITION WIN_PART01 VALUES('ACTIVE')tablespace WIN_TD01,
PARTITION WIN_PART02 VALUES('INACTIVE')tablespace WIN_TD02
)
-- 列表分区
PARTITION BY LIST(PARTNAME)(
PARTITION WIN_DATE_PART01 VALUES(1)tablespace WIN_TD01
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
),
PARTITION WIN_DATE_PART02 VALUES(2)tablespace WIN_TD02
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
)
)
-- 第五种和方法 散列分区
PARTITION BY HASH(PARTNAME)(
PARTITION WIN_DATE_PART01 tablespace HASH_TD01,
PARTITION WIN_DATE_PART02 tablespace HASH_TD02
)
-- 可以在建表后添加
PARTITION BY HASH(PARTNAME) PARTITION 5
STORE IN (PART1,PART2,PART3,PART4,PART5);
-- 组合散列分区(range-list)
PARTITION BY RANGE(PARTNAME) SUBPARTITION BY LIST (STATUS)(
PARTITION WIN_PART01 VALUES(1)tablespace WIN_TD01(
SUBPARTITION STATUS_PART01 VALUES('ACTIVE') tablespace WIN_TD01,
SUBPARTITION STATUS_PART02 VALUES('INACTIVE') tablespace WIN_TD01
),
PARTITION WIN_PART01 VALUES(2)tablespace WIN_TD02(
SUBPARTITION STATUS_PART03 VALUES('ACTIVE') tablespace WIN_TD02,
SUBPARTITION STATUS_PART04 VALUES('INACTIVE') tablespace WIN_TD02
)
)
-- 组合范围列表分区
PARTITION BY RANGE(PARTNAME) SUBPARTITION BY LIST (STATUS) SUBPARTITION 3 STORE IN (part1,part2,part3)
(
PARTITION WIN_DATE_PART01 VALUES LESS THAN(TO_DATE('2017-01-01',YY-MM-DD''))tablespace WIN_TD01,
PARTITION WIN_DATE_PART02 VALUES LESS THAN(TO_DATE('2017-04-01',YY-MM-DD''))tablespace WIN_TD02,
PARTITION WIN_DATE_PART03 VALUES LESS THAN(MAXVALUE)tablespace WIN_TD03
);
然后,在工作朋友@GIN那里学到虚表的使用,在大数据查询时候,建立一个虚表可以减少查询时间和数据库压力(有点类似视图,快照)INSERT INTO user_detail
SELECT W.WINNER_ID
W.FIRST_NAME
W.LAST_NAME
W.MOBILE
W.EMAIL
W.STATUS
W.PARTNAME
W.UP_DATE
FROM WINNER W
WHERE W.STATUS = 'ACTIVE'
AND EXISTS (WITH KM AS(SELECT USER_NAME,USER_ID from T_USER WHERE AGE=18)
SELECT USER_NAME FROM KM WHERE KM.USER_Id = W.WINNER_ID)
这里exists里的sql就是虚表(临时表)建立。
相关文章推荐
- oracle三大分区(好久没碰数据库拉,今天突然有人问然后就重新学习了一下嘿嘿嘿嘿)
- oracle数据库学习之表分区
- oracle 数据库隔离级别学习
- Oracle学习笔记 --- 数据库的字段类型
- Oracle DBA 数据库备份与恢复学习笔记
- Oracle 11g学习笔记--数据库事务
- 2. oracle学习入门系列之二 数据库基础知识
- oracle数据库学习总结:数据库概念及相关信息查看
- oracle学习笔记----数据库导入导出
- oracle 学习笔记 - 数据库事务
- 【数据库学习笔记】Oracle_03_PL/SQL深入:游标编程,自定义异常
- 【转】深入学习Oracle分区表及分区索引
- ORACLE DBA学习笔记--启动和关闭数据库
- oracle学习之asm实例的数据库启动方式
- Oracle 数据库基础学习 (三) Oracle 四个表结构
- Oracle数据库学习1之简单的理论知识
- 学习操作oracle.sql.Blob数据类型,向数据库插入Blob数据类型的数据
- 深入学习Oracle分区表及分区索引(4) --创建list分区
- 【oracle学习】数据库存储管理中遇到的问题
- TimesTen 应用层数据库缓存学习:21. AWT复制Oracle事务失败时的处理