zoukankan      html  css  js  c++  java
  • Oracle基础维护02-表、主键、索引、表结构维护手册

    目录

    一、项目新建表、主键、索引注意事项

    二、举例说明建表、主建、索引的操作方法

    2.1 设定需求如下

    2.2 普通表操作方法

    2.3 分区表操作方法

    三、表、主键、索引的常规维护操作

    3.1 表结构修改的方法举例

    3.2 表、主建、索引的日常维护举例

    一、项目新建表、主键、索引注意事项

    • 需要显示指定表和索引所属表空间,具体语法可参考下文中的示例。
    • 表是否分区根据业务实际需求确定,一般单表数据量超过千万以上,并有周期性删除历史数据需求的表需要考虑使用分区表。
    • 如果是分区表,需要注意对应的索引是本地(local)索引。
    • 主键默认就包含了一个唯一性索引,同样需要注意所属表空间问题。
    • PL/SQL工具获取的分区表的建表语句,主建和索引部分获取不到local关键字,需要手动添加上。

    二、举例说明建表、主建、索引的操作方法

    下面就对上面所说的注意事项,举例说明实际建表、主建、索引的操作方法。

    2.1 设定需求如下

    1. 建普通表t_normal, 字段id, name, start_time, content,
    设定id列为表t_normal的主建,主键名称为pk_t_normal_id,
    建立id,name两列的组合索引,索引名称为idx_t_normal。
    
    2. 建分区表t_part, 字段id, name, start_time, content, 
    分区字段是start_time,按天分区,
    建立start_time,id两列为表t_part的主建,主键名称为pk_t_part_id,
    建立start_time,id,name三列的组合索引,索引名称为idx_t_part。
    

    2.1.1查询数据库有哪些表空间

    select name from v$tablespace;
    

    2.1.2本文档假设数据库有这两个业务用户的表空间:

    DBS_D_XXX     存放数据的表空间
    DBS_I_XXX      存放索引的表空间
    

    注:新建表及其索引属于哪个表空间根据项目自己的规划自行判断。实际网优项目中用户自定义的表空间都是DBS_D开头的是存放数据,DBS_I开头的是存放索引。

    2.2 普通表操作方法

    2.2.1新建普通表示例

    create table t_normal(
    id number, 
    name varchar2(20), 
    start_time date, 
    content varchar2(200)
    )tablespace dbs_d_xxx;
    

    注:表示建立的t_normal表数据存放在dbs_d_xxx表空间中。

    2.2.2普通表建立主建示例

    alter table t_normal add constraint pk_t_normal_id primary key(id) using index tablespace dbs_i_xxx;
    

    注:表示建立的主建pk_t_normal_id对应的唯一性索引pk_t_normal_id数据存放在dbs_i_xxx表空间中。

    2.2.3普通表建立索引示例

    create index idx_t_normal on t_normal(id, name) tablespace dbs_i_xxx;
    

    注:表示建立的索引idx_t_normal数据存放在dbs_i_xxx表空间中。

    2.3 分区表操作方法

    项目中新建表,一般常用的分区表基本都是range分区,这里就以range分区举例说明。

    2.3.1新建分区表示例

    create table t_part(
    id number, 
    name varchar2(20), 
    start_time date, 
    content varchar2(200)
    )partition by range(start_time)
    (
      partition P20150101 values less than (TO_DATE(' 2015-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
        tablespace dbs_d_xxx,
      partition P20150102 values less than (TO_DATE(' 2015-01-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
        tablespace dbs_d_xxx,
      partition P20150103 values less than (TO_DATE(' 2015-01-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
        tablespace dbs_d_xxx
    );
    

    注:partition by range() 括号中是分区字段,下面的括号中就是包含的具体分区,每个分区都需要显示指定存放表空间名称。
    上面示例建了3个分区,实际项目可能需要创建半年的分区,格式与上面一样,这里给出一个15年上半年的分区示例,便于参考。只需根据项目实际情况更改分区字段和表空间名称即可。

    2.3.2分区表建立主建示例

     alter table t_part add constraint pk_t_part_id primary key(start_time, id) using index local tablespace dbs_i_xxx;
    

    注:分区表这里多了local关键字,如果没有这个关键字,分区类操作(比如删除历史分区)会导致对应的索引失效,所以除非有特殊需求建立全局索引,否则都应该建立本地索引,即必须加上local关键字。

    2.3.3分区表建立索引示例

    create index idx_t_part on t_part(start_time, id, name) local tablespace dbs_i_xxx;
    

    注:同样注意要加local关键字。

    2.3.4分区表添加一个分区

    alter table t_part add partition P20150104 values less than (TO_DATE(' 2015-01-04 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
        tablespace dbs_d_xxx;   
    

    注:分区表t_part添加一个分区P20150104,这里对应存放的是20150103的数据。

    2.3.5分区表删除一个分区

    alter table t_part drop partition P20150104;
    

    注:分区表t_part删除分区P20150104。

    三、表、主键、索引的常规维护操作

    3.1 表结构修改的方法举例:

    3.1.1表添加一个字段

    alter table t_part add content2 varchar2(50);
    

    注:t_part表添加字段content2 数据类型varchar2(50)

    3.1.2表添加多个字段

    alter table t_part add (
    content3 varchar2(50),
    content4 varchar2(50),
    content5 varchar2(50)
    );
    

    注:t_part表添加3个字段content3, content4, content5 数据类型都为varchar2(50)

    3.1.3表删除一个字段

    alter table t_part drop column content5;
    

    注:t_part表删除字段content5,一般不推荐删除表的字段。

    3.1.4表删除多个字段

    alter table t_part drop(content3, content4);
    

    注:t_part表删除多个字段content3,content4,一般不推荐删除表的字段。

    3.1.5表修改一个字段的数据类型

    alter table t_part modify id number(7,0);
    

    注:t_part表修改id字段的数据类型为number(7,0)

    3.1.6表修改多个字段的数据类型

    alter table t_part modify(
         name varchar2(50),
         content varchar2(50)
    );
    

    注:t_part表修改name字段的数据类型为varchar2(50), 修改content字段的数据类型为varchar2(50)

    3.2 表、主建、索引的日常维护举例:

    3.2.1删除表的主建

    alter table t_normal drop primary key;
    alter table t_part drop primary key;
    

    注:删除普通表t_normal的主建,删除分区表t_part的主建。语法相同。

    3.2.2删除表的索引

    drop index idx_t_normal;
    drop index idx_t_part;
    

    注:删除普通表的普通索引,删除分区表的分区索引。语法相同。

    3.2.3重建/新建表的主建

    普通表t_normal建立主建:
    alter table t_normal add constraint pk_t_normal_id primary key(id) using index tablespace dbs_i_xxx;
    

    分区表t_part建立主建:

    alter table t_part add constraint pk_t_part_id primary key(start_time, id) using index local tablespace dbs_i_xxx;
    

    注:上文已经提到过,这里再次重点强调,表的主建对应了一个唯一性索引,需要明确指定这个索引的存储表空间,另外,分区表建立主建语句中要有local关键字。
    若表中的数据量在百万级别以上请慎重考虑需求是否合理,大表操作请跟DBA沟通后再操作。

    3.2.4重建/新建表的索引

    普通表在线建立索引:
    create index idx_t_normal on t_normal(id, name) tablespace dbs_i_xxx online;
    

    分区表在线建立索引:

    create index idx_t_part on t_part(start_time, id, name) local tablespace dbs_i_xxx online;
    

    注:跟上面新建表时建立索引方法一样,只是这里多了online参数可选,加上online参数的意思是在线建立索引,可以避免创建索引过程中,影响到其他会话对此表的DML操作。
    每张表的索引个数不宜超过4个,否则会对此表的入库性能有影响。
    若表中的数据量在千万级别以上,且确认要新建索引,请跟DBA沟通后再操作。

  • 相关阅读:
    【JZOJ3188】找数【数论,数学】
    【JZOJ3187】的士【模拟】
    【JZOJ3187】的士【模拟】
    【洛谷P1641】生成字符串【数论,数学】
    【洛谷P1896】互不侵犯【状压dp】
    聚集索引与非聚集索引
    哈希索引
    索引能提高检索速度,降低维护速度
    MySQL索引基本知识
    注解
  • 原文地址:https://www.cnblogs.com/jyzhao/p/4626440.html
Copyright © 2011-2022 走看看