精华内容
下载资源
问答
  • 中科院分区表.xlsx

    2020-05-13 14:18:00
    中科院2019年最新分区表新,包括中科院SCI 1区,2区,3区,4区,录用程度,审稿周期,学科大类,学科小类,影响因子,热度,ISSN号,热度,期刊投稿及评阅周期等。
  • 2018年sci期刊中科院分区表完整版,不仅包含一区,二区,三区sci期刊分类,也包含ISSN,期刊名,影响因子,中科院分区,大类学科,小类学科 SCI/SCIE,是否OA,录用比例,审稿周期,近期文章,热度(浏览量)等多个...
  • 该资源为海思Hi3798MV100芯片电信HG680-J固件烧写的分区表
  • Oracle分区表(Partition Table)使用详解

    千人学习 2018-06-17 10:24:29
    本课程详细介绍了Oracle数据库的分区表机制、分区表应用场景、分区表与分区索引类型/创建/维护操作、分区裁剪等,结合大量的案例程序,对Oracle分区表的使用进行了详细的分析讲解。
  • Doris 创建复合分区表和动态分区表

    千次阅读 2020-07-07 21:11:15
    Doris 创建复合分区表和动态分区表 一、分区与分桶 二、创建复合分区表 1.Partition 2.Bucker 3.关于 Partition 和 Bucket 的数量和数据量的建议 4.增加分区 三、创建动态分区表 一、分区与分桶 Doris 支持两层的...

    一、分区与分桶

    Doris 支持两层的数据划分。createdate是字段。
    第一层是 Partition,PARTITION BY RANGE(createdate)。
    第二层是 Bucket(Tablet),DISTRIBUTED BY HASH(createdate) BUCKETS 10。
    在 Doris 的存储引擎中,用户数据被水平划分为若干个数据分片(Tablet,也称作数据分桶)。每个 Tablet 包含若干数据行。各个 Tablet 之间的数据没有交集,并且在物理上是独立存储的。
    多个 Tablet 在逻辑上归属于不同的分区(Partition)。一个 Tablet 只属于一个 Partition。而一个 Partition 包含若干个 Tablet。因为 Tablet 在物理上是独立存储的,所以可以视为 Partition 在物理上也是独立。Tablet 是数据移动、复制等操作的最小物理存储

    展开全文
  • Oracle 通过脚本一键生成按月分区表

    千次阅读 多人点赞 2021-07-03 00:11:28
    分区表作为Oracle三大组件之一,在Oracle数据库中,起着至关重要的作用。

    前言

    分区表作为Oracle三大组件之一,在Oracle数据库中,起着至关重要的作用。

    分区表有什么优点?

    • 普通表转分区表:应用程序无感知,DML 语句无需修改即可访问分区表。
    • 高可用性:部分分区不可用不影响整个分区表使用。
    • 方便管理:可以单独对分区进行DDL操作,列入重建索引或扩展分区,不影响分区表的使用。
    • 减少OLTP系统资源争用:因为DML分布在很多段上进行操作。
    • 增强数据仓库的查询性能:可按时间进行分区查询,加速查询。

    在运维开发过程中,发现有部分应用厂商在建表之初并未考虑到数据体量的问题,导致很多大表都没有建成分区表。在系统运行过程中,这些表的数据量一直在增大,当达到一定体量时,我们就需要考虑对其进行分区表转换,以提高数据库的性能。那么,如何操作呢?

    一、介绍

    普通表转换为分区表,Oracle给我们提供了哪些方式呢?

    • 数据泵导入
    • 子查询方式插入
    • 分区交换
    • 在线重定义
    • ALTER TABLE…MODIFY…方式(12.2之后支持)

    以上几种方式中,我比较常用的是:数据泵导入,子查询插入,在线重定义。这三种方式的共同点都是 需要提前创建分区表结构的中间表或者目标表。

    二、脚本

    在长时间的重复性工作中,“懒癌”发作的我就想着是否能通过自动化的方式构建分区表的建表语句呢?然后我发现了 梁敬彬大佬普通表自动转化为按月分区表的脚本

    经加工和提炼,将以上脚本修改为契合自己使用的脚本:

    • 用于生成CTAS完整分区表建表语句:ctas_par.prc
    • 用于CTAS直接转换为分区表:par_tab_deal.pkg

    点我跳转文末 可以获取 分区表脚本 以及博主的联系方式

    par_tab_deal.pkg 的使用方式为:

    --创建日志表 PART_TAB_LOG
    create table PART_TAB_LOG
    (
     TAB_NAME     VARCHAR2(200),
     DEAL_MODEL   VARCHAR2(200),
     SQL_TEXT     clob,
     DEAL_TIME    DATE,
     remark       VARCHAR2(4000),
     exec_order1  number,
     exec_order2  number
    );
    
    --执行分区表转换
    BEGIN
      pkg_deal_part_tab.p_main(p_tab            => 't1',
                               p_deal_flag      => 1,
                               p_parallel       => 8,
                               p_part_colum     => 'created_date',
                               p_part_nums      => 24,
                               p_tab_tablespace => 'users',
                               p_idx_tablespace => 'users');
    END;
    
    --查看日志
    select DBMS_LOB.SUBSTR(sql_text,1000)||';' from part_tab_log t where tab_name='T1' order by exec_order1,exec_order2;
    select sql_text||';' from part_tab_log t where tab_name='T1' order by exec_order1,exec_order2;
    

    ctas_par.prc 的使用方式:

    --直接执行输出即可
    BEGIN
      ctas_par(p_tab        => 't1',
               p_part_colum => 'created_date',
               p_part_nums  => 24,
               p_tablespace => 'users');
    END;
    

    三、实战应用

    1、创建测试表T1

    由于实验需要一张基础表,因此通过下方步骤创建表 T1:

    --删除t1表
    DROP TABLE t1 PURGE;
    --创建t1表
    CREATE TABLE t1 (
      id           NUMBER,
      description  VARCHAR2(50),
      created_date DATE,
      CONSTRAINT t1_pk PRIMARY KEY (id)
    );
    --创建索引
    CREATE INDEX t1_created_date_idx ON t1(created_date);
    --插入数据
    INSERT INTO t1
    SELECT level,
           'Description for ' || level,
           ADD_MONTHS(TO_DATE('01-JAN-2017', 'DD-MON-YYYY'), -TRUNC(DBMS_RANDOM.value(1,4)-1)*12)
    FROM   dual
    CONNECT BY level <= 10000;
    COMMIT;
    

    2、创建procedure

    执行脚本创建procedure:

    select  'alter  '||object_type||'   '||owner||'.'||object_name||'   compile;'
    from  dba_objects t
    where t.object_type='PROCEDURE'
    and t.object_name='CTAS_PAR' ;
    


    📢 注意:确认procedure已成功创建。

    3 执行procedure

    执行procedure生成CTAS创建分区表语句:

    • 表名:T1
    • 分区键:CREATED_DATE
    • 建立分区月数:24
    • 分区所在表空间:USERS
    alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss";
    BEGIN
      ctas_par(p_tab        => 'T1',
               p_part_colum => 'CREATED_DATE',
               p_part_nums  => 24,
               p_tablespace => 'USERS');
    END;
    


    执行脚本如下:

    --分区表获取分区列最小记录日期:2015-01-01 00:00:00
    --分区表ctas创建的完整语句如下: 
    create table T1
    partition BY RANGE(CREATED_DATE)(
    partition T1_P201501 values less than (TO_DATE(' 2015-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201502 values less than (TO_DATE(' 2015-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201503 values less than (TO_DATE(' 2015-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201504 values less than (TO_DATE(' 2015-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201505 values less than (TO_DATE(' 2015-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201506 values less than (TO_DATE(' 2015-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201507 values less than (TO_DATE(' 2015-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201508 values less than (TO_DATE(' 2015-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201509 values less than (TO_DATE(' 2015-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201510 values less than (TO_DATE(' 2015-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201511 values less than (TO_DATE(' 2015-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201512 values less than (TO_DATE(' 2016-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201601 values less than (TO_DATE(' 2016-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201602 values less than (TO_DATE(' 2016-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201603 values less than (TO_DATE(' 2016-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201604 values less than (TO_DATE(' 2016-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201605 values less than (TO_DATE(' 2016-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201606 values less than (TO_DATE(' 2016-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201607 values less than (TO_DATE(' 2016-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201608 values less than (TO_DATE(' 2016-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201609 values less than (TO_DATE(' 2016-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201610 values less than (TO_DATE(' 2016-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201611 values less than (TO_DATE(' 2016-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201612 values less than (TO_DATE(' 2017-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_MAX values less than (maxvalue) tablespace USERS)
                 nologging
                 parallel 4
                 enable row movement
                 tablespace USERS
                 as select /*+parallel(t,8)*/ * from T1_01 t where 1 = 2;
    --附加日志和取消并行
    alter table T1 logging;
    alter table T1 noparallel; 
    

    如果只是需要分区表的建表语句,这里已经可以很简单的拼接出来:

    create table T1
    (
      id           NUMBER,
      description  VARCHAR2(50),
      created_date DATE
    )
    partition BY RANGE(CREATED_DATE)(
    partition T1_P201501 values less than (TO_DATE(' 2015-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201502 values less than (TO_DATE(' 2015-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201503 values less than (TO_DATE(' 2015-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201504 values less than (TO_DATE(' 2015-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201505 values less than (TO_DATE(' 2015-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201506 values less than (TO_DATE(' 2015-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201507 values less than (TO_DATE(' 2015-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201508 values less than (TO_DATE(' 2015-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201509 values less than (TO_DATE(' 2015-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201510 values less than (TO_DATE(' 2015-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201511 values less than (TO_DATE(' 2015-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201512 values less than (TO_DATE(' 2016-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201601 values less than (TO_DATE(' 2016-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201602 values less than (TO_DATE(' 2016-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201603 values less than (TO_DATE(' 2016-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201604 values less than (TO_DATE(' 2016-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201605 values less than (TO_DATE(' 2016-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201606 values less than (TO_DATE(' 2016-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201607 values less than (TO_DATE(' 2016-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201608 values less than (TO_DATE(' 2016-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201609 values less than (TO_DATE(' 2016-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201610 values less than (TO_DATE(' 2016-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201611 values less than (TO_DATE(' 2016-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_P201612 values less than (TO_DATE(' 2017-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace USERS,
    partition T1_MAX values less than (maxvalue) tablespace USERS)
    ENABLE ROW MOVEMENT
    TABLESPACE USERS;
    

    4、CTAS创建分区表

    实际执行前,需要先将原表T1进行 rename 操作:

    alter table lucifer.T1 RENAME TO T1_01;
    

    rename原表T1
    📢 注意: 如需创建分区表结构,无需修改以上脚本;如需直接创建分区表包含数据,需要将 where 1 = 2 修改为 where 1 = 1

    确保当前表T1已经rename为T1_01,执行CTAS创建分区表:

    查看分区表结构:
    分区表结构
    📢 注意: 由于CTAS不会继承 注释,默认值,因此需要手动比对是否缺失。

    COMMENT ON TABLE T1 IS '';
    COMMENT ON COLUMN T1.ID IS '';
    COMMENT ON COLUMN T1.CREATED_DATE IS '';
    COMMENT ON COLUMN T1.DESCRIPTION IS '';
    

    重命名原表的索引和约束:

    --重命名索引
    ALTER INDEX T1_CREATED_DATE_IDX RENAME TO T1_CREATED_DATE_IDX_01;
    ALTER INDEX T1_PK RENAME TO T1_PK_01;
    --重命名唯一约束
    ALTER TABLE T1_01 RENAME CONSTRAINT T1_PK TO T1_PK_01;
    

    重命名原表索引
    分区表新建本地索引:

    create index T1_CREATED_DATE_IDX on T1 (CREATED_DATE) tablespace users;
    alter table T1 add constraint T1_PK primary key (ID) using index  tablespace users;
    


    查询分区表:

    通过以下查询可以发现,数据已被按月分到对应分区下。

    SELECT COUNT(1) FROM t1;
    SELECT COUNT(1) FROM t1 PARTITION(T1_P201501);
    SELECT COUNT(1) FROM t1 PARTITION(T1_P201601);
    SELECT COUNT(1) FROM t1 PARTITION(T1_MAX);
    


    至此,脚本已经介绍完毕。

    ❤️ 可以扫码关注下方👇公众号,私信 分区表脚本 即可获取!❤️
    展开全文
  • DB2分区表的建立详解

    2013-01-09 10:12:39
    一个大型表的分区表改造方案以及详细步骤。
  • 临时表、分区表、拉链表

    千次阅读 2019-08-15 16:12:08
    文章目录一、临时表二、分区表三、拉链表 一、临时表 二、分区表 三、拉链表

    一、临时表

    概念:
    临时表就是用来暂时保存临时数据的一个数据库对象,它和普通表有些类似,然而又有很大区别。它只能存储在 临时表空间 ,而非用户的表空间。ORACLE临时表分为会话和事务级别,只对当前会话或事务可见。每个会话只能查看和修改自己的数据。
    作用:
    当查询语句非常复杂时,我们就可以创建一个临时表时保存查询结果,并进行一系列操作。即:优化查询

    ①会话级临时表

    会话级临时表是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。执行commit或者rollback操作,表内数据依然存在,新建一个命令窗口(相当于开启了一个新的会话),表内的数据就查询不到了。
    创建语法:

    Create Global Temporary Table Temp_Name --创建表名为Temp_Name的临时表
    (
    Col1 Type1,
    Col2 Type2
    ...
    )
    On Commit Preserve Rows;
    

    ②事务级临时表

    事务级临时表是指临时表中的数据只在事务生命周期中存在,当一个事务结束(commit or rollback),Oracle自动清除临时表中数据。
    创建语法:

    Create Global Temporary Table Temp_Name --创建表名为Temp_Name的临时表
    (
    Col1 Type1,
    Col2 Type2
    ...
    )
    On Commit Delete Rows;
    

    ③临时表注意事项

    • 临时表不支持主外键关系
    • 临时表不能永久的保存数据。
    • 临时表的数据不会备份,恢复,对其的修改也不会有任何日志信息
    • 临时表不会有DML 锁
    • 临时表可以创建临时的索引、视图、触发器。
    • 如果要DROP会话级别临时表,并且其中包含数据时,必须先截断其中的数据。否则会报错。

    二、分区表

    概念:
    将一张表拆分后分别存储在不同表空间的表存储方式。分区表类型:范围分区(range),列表分区(list),散列分区(hash)和复合分区
    作用:

    • 增强可用性,一个分区损坏不影响其他分区的使用
    • 便于维护和恢复,管理表分区比整个表要轻松的多
    • 均衡存储(I/O),可以分配不同表空间(磁盘)存储数据
    • 改善性能,对一个表的操作分配到表分区将大大提高效率

    ①范围分区表

    创建语法:

    create table 表名
    (列名 数据类型
    ...)
    partition by range (字段)
    ( 
    partition 分区名1 values less than (1或日期1),
    partition 分区名2 values less than (2或日期2),
    partition 分区名3 values less than (3或日期3),...
    partition 分区名4 values less than (maxvalue)
    );
    /*values less than 特点:
    values <值1 存储在分区1中
    values>=值1 and values <值2 存储在分区2中
    values>=值2 and values <值3 存储在分区3中
    values>=值3 and values <值4...
    */
    

    新增分区:
    首先表一定是分区表才能新增,新增分区高于最后一个分区界限值

    alter table 表名 add partition 分区名 values less than (值或日期);
    

    删除分区:

    alter table 表名 drop partition 分区名;
    

    ②列表分区表

    创建语法:

    create table 表名
    (列名 数据类型
    ...)
    partition by list (字段)
    ( 
    partition 分区名1 values (),
    partition 分区名2 values (),
    partition 分区名3 values (),...
    );
    /*values less than 特点:
    values =值1 存储在分区1中
    values=值2 存储在分区2中
    values=值3 存储在分区3中
    values=值4 ...
    */
    

    新增分区:

    alter table 表名 add partition 分区名 values ();
    

    删除分区:

    alter table 表名 drop partition 分区名;
    

    ③散裂分区表

    创建语法:

    create table 表名
    (列名 数据类型
    ...)
    partition by hash (字段)
    ( 
    partition 分区名1,
    partition 分区名2,
    partition 分区名3,...
    );
    --通过数据库中自带的hash算法分区,缺点:不能确定某条数据的存储分区
    

    新增分区:

    alter table 表名 add partition 分区名;
    

    查询分区:

    select .. from 表名 partition(分区名);
    

    ④复合分区表

    创建方式:就是将上面分区方式组合起来使用
    创建语法:

    create table testfuhe
    (
    v_date date,
    v_month varchar2(6),
    v_day varchar2(8),
    client_no varchar2(4),
    fee number
    ) partition by range (v_date) subpartition by list (fee)
    (
       partition p_201712 values less than (to_date('2018-01-01', 'YYYY-MM-DD'))
       (subpartition p1 values ('10'),--存储fee=10并且v_date时间早于18年一月一号的数据
        subpartition p2 values ('20'),
        subpartition p3 values ('30')
       ),
       partition p_201801 values less than (to_date('2018-02-01', 'YYYY-MM-DD'))
       (subpartition p4 values ('40'),
        subpartition p5 values ('50'),
        subpartition p6 values ('60')
       )
    );
    

    三、拉链表

    概念:
    拉链表不是数据库中实际存在的表而是为节约存储空间而提出的解决方案。具体就是记录数据在某一时间区间内的状态以及数据在某一时点上的变化的数据存储方式。
    作用:

    • 节约存储空间
    • 记录数据变化

    缺点:
    一旦断链比较难恢复,需要人工恢复。

    拉链算法:

    • 建立临时表 VT_NEW 用于存放转换、处理后的数据
    • 建立临时表 VT_INC 用于存放比对出的增量数据
    • 修改目标表进行关链更新操作
    • 修改目标表进行开链插入操作

    详细过程说明:
    源表SRC(快照表):

    IDnamebaldate
    001张三10002018-01-01
    001张三10002018-01-02
    001张三1002018-01-03
    002李四2002018-01-03

    我们明确目标表TAG(拉链表)的实现:

    IDnamebalstart_dateend_date
    001张三10002018-01-012018-01-03
    001张三1002018-01-032999-12-31
    002李四2002018-01-032999-12-31

    第一步:

    要实现上面整个转换过程需要先建立临时表 VT_NEW 转换一下
    临时表VT_NEW

    IDnamebalstart_dateend_date
    001张三10002018-01-012999-12-31
    001张三10002018-01-022999-12-31
    001张三1002018-01-032999-12-31
    002李四2002018-01-032999-12-31

    实现SQL:

    INSERT	INTO VT_NEW(ID,NAME,BAL,START_DATE,END_DATE)
    SELECT	ID,NAME,BAL,DATE,'2999-12-31'
    FROM SRC;
    

    第二步:

    建立临时表 VT_INC 用于存放比对出的增量数据
    这里我们假设:
    001 张三 1000 2018-01-01
    这条数据以及在拉链表中已存在:
    001 张三 1000 2018-01-01 2999-12-31
    那么这条数据我们就不抽取了。

    INSERT	INTO VT_INC(ID,NAME,BAL,START_DATE,END_DATE)
    SELECT	ID,NAME,BAL,START_DATE,END_DATE
    FROM	VT_NEW
    WHERE	(ID,NAME,BAL) NOT IN (
    SELECT	ID,NAME,BAL 
    FROM	TAG 
    WHERE	END_DATE = '2999-12-31');
    

    临时表VT_INC

    IDnamebalstart_dateend_date
    001张三1002018-01-032999-12-31
    002李四2002018-01-032999-12-31

    以下两条记录被排除
    001 张三 1000 2018-01-01 2999-12-31
    001 张三 1000 2018-01-02 2999-12-31

    第三步:

    修改目标表进行关链更新操作

    UPDATE TAR
    SET END_DT = '2018-01-03' --一般用sysdate-1表示
    WHERE END_DT = '2999-12-31' AND ID IN (SELECT ID FROM VT_INC);
    

    目标表TAG(拉链表):

    IDnamebalstart_dateend_date
    001张三10002018-01-012018-01-03

    第四步:

    修改目标表进行开链插入操作

    INSERT INTO TAR(ID,NAME,BAL,START_DT,END_DT)
    SELECT ID,NAME,BAL,START_DT,END_DT
    FROM VT_INC;
    

    目标表TAG(拉链表):

    IDnamebalstart_dateend_date
    001张三10002018-01-012018-01-03
    001张三1002018-01-032999-12-31
    002李四2002018-01-032999-12-31
    展开全文
  • 为什么阿里不推荐使用MySQL分区表

    千次阅读 2021-06-03 20:25:27
    分区表有什么问题,为什么公司规范不让使用分区表呢? 什么是分区表 在示例表插入两条记录,按分区规则,记录分别落在p_2018和p_2019分区。 可见,该表包含了一个.frm文件和4个.ibd文件,每个分区对应一个.ibd文件...

    分区表有什么问题,为什么公司规范不让使用分区表呢?

    什么是分区表


    在示例表插入两条记录,按分区规则,记录分别落在p_2018p_2019分区。
    可见,该表包含了一个.frm文件和4个.ibd文件,每个分区对应一个.ibd文件:

    • 对于引擎层,这是4个表
    • 对于Server层,这是1个表

    分区表的引擎层行为

    举个在分区表加间隙锁的例子,目的是说明对于InnoDB来说,这是4个表。

    • 分区表间隙锁
    session_1session_2
    T1begin;
    select * from tt
    where ftime=‘2017-5-1’
    for update;
    T2insert into tt values (‘2018-2-1’, 1); (Query OK)
    insert into tt values (‘2017-12-1’, 1); (阻塞)

    初始化表tt时,只插入两行数据。session1的select语句对索引ftime上这两个记录之间的间隙加了锁。如果是一个普通表的话,T1时刻,在表t的ftime索引上,间隙和加锁状态应该如下

    • 普通表的加锁范围

    即‘2017-4-1’ 和’2018-4-1’ 这两个记录之间的间隙会被锁住。
    那sesion2的两条插入语句应该都要进入锁等待状态。

    但session2的第一个insert成功。因为对于引擎,p_2018和p_2019是两个不同表,即2017-4-1的下一个记录并不是2018-4-1,而是p_2018分区的supremum。
    所以T1,在表t的ftime索引上,间隙和加锁的状态其实:

    • 分区表tt的加锁范围

    由于分区表规则,session1的select只操作了分区p_2018,因此加锁范围就是上图绿色。

    所以,session2写2018-2-1成功,而要写2017-12-1,就要等session1的间隙锁。

    这时show engine innodb status的部分结果:

    • session2被锁住信息

    MyISAM分区表

    # 把表tt改成MyISAM表
    alter table t engine=myisam
    

    对于MyISAM引擎来说,这是4个表。

    • 用MyISAM表锁验证
    session_1session_2
    alter table t engine=myisam;
    update tt set c=sleep(100)
    where ftime=‘2017-4-1’;
    select * from tt where ftime=‘2018-4-1’;
    (Query OK)
    select * from tt where ftime=‘2017-5-1’;
    (阻塞)

    在session1,sleep(100)将该语句的执行时间设为100s。由于MyISAM引擎只支持表锁,所以这条update语句会锁住整个表tt上的读。

    但session2的第一条查询语句可以正常执行,第二条语句才进入锁等待。

    因为MyISAM的表锁实现在引擎层,session1加的表锁,其实是锁在分区p_2018。因此,只会堵住在这个分区上执行的查询,其他分区查询不受影响。

    分区表使用起来看来挺好使的呀,为啥禁用?
    使用分区表的一个重要原因就是单表过大。那若不使用分区表,就要手动分表。

    手动分表 V.S 分区表

    比如,按年份划分,分别创建普通表t_2017t_2018t_2019等。手工分表也要找到需要更新的所有分表,然后依次执行更新。
    性能上和分区表没有差别。

    • 分区表由server层决定使用哪个分区
    • 手动分表由应用层代码决定使用哪个分表

    所以从引擎层看,也没啥区别。

    两种方式的区别,主要在server层。server层的分区表一个严重问题就是打开表的行为。

    分区策略

    第一次访问一个分区表时,MySQL需要把所有分区都访问一遍。
    一个典型的报错场景:若一个分区表的分区很多,比如超过1000,而MySQL启动时,open_files_limit参数默认值1024,则在访问该表时,由于需要打开所有文件,导致打开表文件的个数超过了上限而报错。

    比如对一个包含很多分区的表,执行insert直接报错:

    这条insert其实只需要访问一个分区,但语句报错了。这个表是MyISAM,如果使用InnoDB,不会出现该问题。

    MyISAM分区表使用通用分区策略(generic partitioning),每次访问分区都由server层控制。通用分区策略,是MySQL一开始支持分区表的时候就存在的代码,在文件管理、表管理的实现上很粗糙,性能问题很严重。

    MySQL 5.7.9开始,InnoDB引入本地分区策略(native partitioning),在InnoDB内部自己管理打开分区的行为。

    MySQL 5.7.17开始,将MyISAM分区表标记为deprecated。
    MySQL 8.0开始,已经禁止创建MyISAM分区表,只允许创建已经实现了本地分区策略的引擎。

    目前只有InnoDB和NDB引擎支持本地分区策略。

    分区表的server层行为

    对于server层,一个分区表就只是一个表。

    如图,分别是该例的操作序列和执行结果图。

    • 分区表的MDL锁
    session_1session_2
    begin;
    select * from tt
    where ftime=‘2018-4-1’;
    alter table tt truncate partition p_2017
    (阻塞)


    • show processlist

      虽然session2只需操作p_2107分区,但因为session1持有整个表tt的MDL锁,导致session2的alter语句被阻塞。

    所以分区表在做DDL时,影响会更大。若使用的普通分表,则当你在truncate一个分表时,肯定不会跟另外一个分表上的查询语句,出现MDL锁冲突。

    小结

    在server层,认为这是同一张表,因此所有分区共用同一MDL锁
    在引擎层,认为这是不同表,因此MDL锁之后的执行过程,会根据分区表规则,只访问必要的分区。

    什么是必要的分区
    根据SQL语句中的where条件,结合分区规则。比如上面的where ftime=‘2018-4-1’,根据分区规则year函数算出来的值是2018,那么就会落在p_2019分区。

    但若这个where 条件改成 where ftime>='2018-4-1',虽然查询结果相同,但这时根据where条件,就要访问p_2019p_others俩分区。

    若查询语句的where条件没有分区key,就只能访问所有分区了。当然,这并非分区表的问题。即使是使用业务分表,where条件中没有使用分表的key,也必须访问所有的分表。

    分区表的应用场景

    一大优势是对业务透明,相对于用户分表来说,使用分区表的业务代码更简洁。还有,分区表可以很方便的清理历史数据。

    如果一项业务跑的时间足够长,往往就会有根据时间删除历史数据的需求。这时按时间分区的分区表,就可直接通过alter table t drop partition …这个语法删掉分区,从而删掉过期的历史数据。

    alter table t drop partition …是直接删除分区文件,跟drop普通表类似。与delete相比,优势是速度快、对系统影响小。

    需要注意的是,我是以范围分区(range)为例和你介绍的。实际上,MySQL还支持hash分区、list分区等分区方法。
    实际使用时,分区表跟用户分表,有两个问题:

    • 第一次访问时,需要访问所有分区
    • 共用MDL锁

    因此,如果要使用分区表,就不要创建太多分区。我见过一个用户做了按天分区策略,然后预先创建了10年的分区。这种情况下,访问分区表的性能自然是不好的。这里有两个问题:

    • 分区并不是越细越好
      单表或单分区的数据一千万行,只要没有特别大的索引,对于现在的硬件能力来说都已是小表
    • 分区不要提前预留太多,在使用之前预先创建即可
      比如,如果是按月分区,每年年底时再把下一年度的12个新分区创建上即可。对于没有数据的历史分区,及时drop

    分区表的其他问题,比如查询需要跨多个分区取数据,查询性能就会比较慢,基本上就不是分区表本身的问题,而是数据量或说使用方式问题。
    如果你的团队已经维护了成熟的分库分表中间件,用业务分表,对业务开发同学没有额外的复杂性,对DBA也更直观,自然更好。

    展开全文
  • 分区表的概念与创建

    千次阅读 2019-10-10 16:37:47
     如果已经存在的表需要改分区表,就需要将当前表 rename后,再创建新表,然后复制数据到新表,然后删除旧表就可以了。  分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中。分区完全对应用透明。 ...
  • MySQL高级特性一:分区表

    万次阅读 2019-01-22 17:31:26
    对用户来说,分区表时一个独立的罗技表,但是底层由多个无力字表组成。实现分区的代码实际上是对一组底层表的句柄对象的封装。对分区表的请求,都会通过句柄对象转化成对存储引擎的接口调用。所以分区对于SQL层来说...
  • Oracle分区表

    万次阅读 2018-07-08 10:53:25
    分区对应用透明,即对访问数据库的应用而言,逻辑上讲只有一个或一个索引(相当于应用“看到”的只是一个或索引),但在物理上这个或索引可能由数十个物理分区组成。每个分区都是一个独立的对象,可以独自处理...
  • Oracle分区表详解,分区表创建,分区表按日期划分

    万次阅读 多人点赞 2019-05-26 19:41:09
    最近接手一个项目,要求与Oracle数据库做对接,分区表还是要做的,可是网上根本涉及内容很少,没办法,用一下午才弄明白,截至发稿,饭都没吃呢。。。。。。。。 分区表概念: 正常增删改查都行,SQL语句正常写,...
  • 硬盘分区表知识——详解硬盘MBR

    万次阅读 多人点赞 2019-05-07 10:26:15
    硬盘是现在计算机上最常用的存储器之一。我们都知道,计算机之所以神奇,是因为它具有高速分析处理数据...当我们创建分区时,就已经设置好了硬盘的各项物理参数,指定了硬盘主引导记录(即Master Boot Record,一般...
  • Hadoop之Hive的分区表

    千次阅读 2021-05-03 10:23:47
    ????前几天的课程我们学习了Hive数据的导入、导出、查询和排序,有兴趣的小伙伴可以查看以往的文章?...分区表1.1 分区表的建立1.2 查询分区表中数据1.3 增加分区1.4 删除分区1.5 查看分区1.6 查看分区表结构2.
  • GreenPlum分区表原理

    千次阅读 2018-10-27 19:47:59
    Greenplum分区表的原理和PostgreSQL的原理相同,都是把一张大表按照适合的维度进行分割,通过表的继承,规则,约束实现。 与PostgreSQL分区表的区别: 在PostgreSQL中,通过一个父表,多个子表来实现分区表。插入...
  • MySQL 分区表简单操作记录

    千次阅读 2020-07-10 12:23:01
    分区表无法使用外键约束 应用 目前有一个工作流的操作日志表已经解决2000W的数据量,查询速度非常的慢,为了解决查询的问题,对此表进行分区操作。 分区时建议创建一个 pnull 的空分区和一个 pmax 的最大值分区,p...
  • Oracle分区表及分区索引的创建

    万次阅读 多人点赞 2018-07-08 11:21:22
    关于分区表和分区索引(About Partitioned Tables and Indexes)对于10gR2而言,基本上可以分成几类:• Range(范围)分区• Hash(哈希)分区• List(列表)分区• 以及组合分区:Range-Hash,Range-List。 对于表而...
  • 目前PostgreSQL社区版本的分区表功能比较弱,需要通过继承和触发器或RULE来实现分区表的功能,由于查询和更新涉及约束的检查、插入则涉及触发器或规则重写,导致分区功能性能较差。 商业版本EDB,以及数据仓库...
  • 磁盘分区类型和分区表的区别

    千次阅读 2020-05-30 19:51:30
    任务1 罗列磁盘分区的类型并做比较性介绍 分类: FAT16、FAT32、NTFS、EXT2、EXT3、EXT4 FAT16: 磁盘分区最大只能到2GB、 使用簇的大小不恰当、 FAT16使用了16位的空间来表示每个扇区 文件名长度有限制 FAT32: 相比...
  • Hive partition 分区表

    万次阅读 2019-05-01 08:21:38
    分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所...
  • 分区表与分桶表

    千次阅读 2019-11-22 10:40:43
    分区表: 在大数据中,最常用的一种思想就是分治,我们可以把大的文件切割划分成一个个的小的文件,这样每次操作一个小的文件就会很容易了,同样的道理,在hive当中也是支持这种思想的,就是我们可以把大的数据,...
  • PostgreSQL 创建分区表

    万次阅读 多人点赞 2018-04-28 16:49:27
     加速数据库的方法很多,如添加特定的索引,将日志目录换到单独的磁盘分区,调整数据库引擎的参数等。这些方法都能将数据库的查询性能提高到一定程度。 对于许多应用数据库来说,许多数据是历史数据并且随着时间的...
  • SQL server 如何创建分区表

    万次阅读 2018-12-07 13:54:17
    一、分区表的定义:  一般情况下,我们建立数据库表时,表数据都存放在一个文件里。但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小...
  • postgresql查询分区表怎么查?

    千次阅读 2020-12-24 14:01:03
    分区表的几个查询,方便维护和管理分区表。 查询指定分区表信息 SELECT nmsp_parent.nspname AS parent_schema , parent.relname AS parent , nmsp_child.nspname AS child , child.relname AS child_schema...
  • oracle分区表和分区索引的概念

    千次阅读 2019-01-17 16:55:18
    Partitioning Key 分区键 就是决定分区的规则的一列或多列,...但是分区表不能有LONG or LONG RAW 类型的行,可以有CLOB or BLOB 类型的行。 建议使用分区的表: 大于2GB的表 历史数据表,更新最新数据到新...
  • MySQL分区表

    千次阅读 2019-04-07 02:01:18
    1.确认Mysql服务是否支持分区表 命令: 2.Mysql分区表特点 1.在逻辑上为一个表,在物理上存储在多个文件中, 2.创建分区表语句: 注意:区别 生成的文件: 非分区表分区表: 3.按...
  • PosgtreSQL 11 支持分区表上的 FOR EACH ROW 触发器。目前,只能创建 AFTER 触发器,还不支持 BEFORE 触发器。另外,定义触发器时不能指定 WHEN 子句,也就是不能指定触发条件。
  • 静态分区表和动态分区表

    千次阅读 2018-01-09 23:15:57
    在Hive中处理数据时,当处理的一张表的数据量过大的时候,每次查询都是遍历整张表,显然对于计算机来说,是负担比较重的。...静态分区表静态分区表的创建 create table order_partition( number string, tim
  • 分区表的几种类型

    千次阅读 2019-10-11 14:17:08
    Oracle 提供了以下几种分区类型: 范围分区(range) 哈希分区(hash) 列表分区(list) 范围-哈希复合分区(range-hash) 范围-列表复合分区(range-list) 文章目录1 范围分区(RANGE)例1:按指定要求划分例2...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 321,963
精华内容 128,785
关键字:

分区表