zoukankan      html  css  js  c++  java
  • day11_分区表——分区表常用维护

    分区表存放在不同表空间,放在不同磁盘中,I/O就分散了,性能提高

    公司的主要表一定是分区表


    SQL> sqlplus / as sysdba
    SQL> grant create tablespace to scott;

    conn scott/lipengfei

    create tablespace ts01 logging datafile '/oracle/app/oradata/ecom/ts01.dbf' size 10m;
    create tablespace ts02 logging datafile '/oracle/app/oradata/ecom/ts02.dbf' size 10m;
    create tablespace ts03 logging datafile '/oracle/app/oradata/ecom/ts03.dbf' size 10m;
    create tablespace ts04 logging datafile '/oracle/app/oradata/ecom/ts04.dbf' size 10m;



    范围分区
    SQL> create table test123(id number,createdate date)
        partition by range(createdate)
        (
        partition p1 values less than (to_date('2001-01-01','yyyy-mm-dd')) tablespace ts01,
        partition p2 values less than (to_date('2002-01-01','yyyy-mm-dd')) tablespace ts02,
        partition p3 values less than (to_date('2003-01-01','yyyy-mm-dd')) tablespace ts03,
        partition pmax values less than (maxvalue) tablespace ts04
       );

    ------------------------------------------------------
    创建hash 分区表(按hash算法打散了,再分区,通常应用在不能划分范围的表)

    SQL> create table test6 (id number,name varchar2(10))
        partition by hash(name)
        partitions 4
        store in (ts01,ts02,ts03,ts04);


    ------------------------------------------------------
    创建列表分区
    该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。
    比如城市,省份

    SQL> create table test122 (id number,name varchar2(10),city varchar2(10))
        partition by list(city)
        (
        partition p1 values('bj','sh') tablespace ts01,
        partition p2 values('gz','sz') tablespace ts02,
        partition p3 values('cc','jl') tablespace ts03,
        partition p4 values(default) tablespace ts04
        );


    查看分区表
    SQL> select * from user_tab_partitions


    ===========================================
    分区合并
    范围分区合并
    SQL> alter table test123 merge partitions p1,p2 into partition p12;

    SQL> select * from user_tab_partitions order by table_name

    ----------------------
    拆分分区

    SQL> alter table test123 split partition pmax at(to_date('2004-01-01','yyyy-mm-dd')) into (partition p5,partition pmax);
    把原来的pmax分区 拆分成2个分区

    -----------------------
    创建新的分区
    create tablespace ts05 logging datafile '/oracle/app/oradata/ecom/ts05.dbf' size 10m;

    SQL> alter table test123 drop partition pmax;

    SQL> alter table test123 add partition p15 values less than(to_date('2005-01-01','yyyy-mm-dd'))tablespace ts05;

    create tablespace ts06 logging datafile '/oracle/app/oradata/ecom/ts06.dbf' size 10m;

    SQL> alter table test123 add partition pnimei values less than(maxvalue)tablespace ts06;





    ----------------------额外赠送-------------------------

    有关表分区的一些维护性操作: 
    一、添加分区 
    以下代码给SALES表添加了一个P3分区

    ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));

    注意:以上添加的分区界限应该高于最后一个分区界限。


    以下代码给SALES表的P3分区添加了一个P3SUB1子分区
    ALTER TABLE SALES MODIFY PARTITION P3 ADD SUBPARTITION P3SUB1 VALUES('COMPLETE');

    二、删除分区 
    以下代码删除了P3表分区:

    ALTER TABLE SALES DROP PARTITION P3;

    在以下代码删除了P4SUB1子分区:

    ALTER TABLE SALES DROP SUBPARTITION P4SUB1;

    注意:如果删除的分区是表中唯一的分区,那么此分区将不能被删除,要想删除此分区,必须删除表。

    三、截断分区 
    截断某个分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。当表中即使只有一个分区时,也可以截断该分区。通过以下代码截断分区:

    ALTER TABLE SALES TRUNCATE PARTITION P2;

    通过以下代码截断子分区:

    ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;

    四、合并分区 
    合并分区是将相邻的分区合并成一个分区,结果分区将采用较高分区的界限,值得注意的是,不能将分区合并到界限较低的分区。以下代码实现了P1 P2分区的合并:

    ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2;

    五、拆分分区 
    拆分分区将一个分区拆分两个新分区,拆分后原来分区不再存在。注意不能对HASH类型的分区进行拆分。

    ALTER TABLE SALES SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22);

    六、接合分区(coalesca) 
    结合分区是将散列分区中的数据接合到其它分区中,当散列分区中的数据比较大时,可以增加散列分区,然后进行接合,值得注意的是,接合分区只能用于散列分区中。通过以下代码进行接合分区:
    ALTER TABLE SALES COALESCA PARTITION;

    七、重命名表分区 
    以下代码将P21更改为P2
    ALTER TABLE SALES RENAME PARTITION P21 TO P2;

    八、查询
         select count(*) from t_table_SS PARTITION (P200709_1);【查看指定分区数据】    


    查询表上有多少分区
    SELECT * FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='tableName';


     
    --显示数据库所有分区表的信息:
    select * from DBA_PART_TABLES
     
    --显示当前用户可访问的所有分区表信息:
    select * from ALL_PART_TABLES
     
    --显示当前用户所有分区表的信息:
    select * from USER_PART_TABLES
     
    --显示表分区信息 显示数据库所有分区表的详细分区信息:
    select * from DBA_TAB_PARTITIONS
     
    --显示当前用户可访问的所有分区表的详细分区信息:
    select * from ALL_TAB_PARTITIONS
     
    --显示当前用户所有分区表的详细分区信息:
    select * from USER_TAB_PARTITIONS
     
    --显示子分区信息 显示数据库所有组合分区表的子分区信息:
    select * from DBA_TAB_SUBPARTITIONS
     
    --显示当前用户可访问的所有组合分区表的子分区信息:
    select * from ALL_TAB_SUBPARTITIONS
     
    --显示当前用户所有组合分区表的子分区信息:
    select * from USER_TAB_SUBPARTITIONS
     
    --显示分区列 显示数据库所有分区表的分区列信息:
    select * from DBA_PART_KEY_COLUMNS
     
    --显示当前用户可访问的所有分区表的分区列信息:
    select * from ALL_PART_KEY_COLUMNS
     
    --显示当前用户所有分区表的分区列信息:
    select * from USER_PART_KEY_COLUMNS
     
    --显示子分区列 显示数据库所有分区表的子分区列信息:
    select * from DBA_SUBPART_KEY_COLUMNS
     
    --显示当前用户可访问的所有分区表的子分区列信息:
    select * from ALL_SUBPART_KEY_COLUMNS
     
    --显示当前用户所有分区表的子分区列信息:
    select * from USER_SUBPART_KEY_COLUMNS
     
    --怎样查询出oracle数据库中所有的的分区表
    select * from user_tables a where a.partitioned='YES'
     
    --删除一个表的数据是
    truncate table table_name;
     
    --删除分区表一个分区的数据是
    alter table table_name truncate partition p5;




  • 相关阅读:
    MySQL 删除有外键约束的表数据
    Python 类装饰器解析
    保持SSH连接的linux服务器不断线
    数字货币交易所常用概念
    Python f-string
    Linux sed命令
    CAS机制详解
    MySQL缓存机制
    PHP网络请求优化
    Java三大特性---继承
  • 原文地址:https://www.cnblogs.com/xiaoxiao5ya/p/9ff8933333c9d60eb36e135bfb97e352.html
Copyright © 2011-2022 走看看