您的位置:首页 > 数据库 > Oracle

学习数据库分区和虚表(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就是虚表(临时表)建立。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: