学习数据库分区和虚表(Oracle)

        之前工作时候接触到了数据库分区,数据库的数据特别大,记得使用分区后还有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就是虚表(临时表)建立。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值