• Oracle—表、约束、索引、表空间、分区、序列、统计信息


    表、约束、索引、表空间、分区、序列、统计信息

    一、表及其操作
    1、创建表
    create table 表名 (
      字段名1 字段类型 默认值 是否为空 ,
      字段名2 字段类型 默认值 是否为空,
      字段名3 字段类型 默认值 是否为空,
      ......
    字段名n 字段类型 默认值 是否为空
    );

    2、删除表
    delete from 表名;
      delete删除数据是一条一条的删除数据,后面可以添加where条件,不删除表结构。注意:如果表中有identity产生的自增id列,delete from后仍然从上次的数开始增加。
    truncate table 表名;
      truncate是一次性删掉所有数据,不删除表结构。注意:如果表中有identity产生的自增id列,truncate后,会恢复初始值。
    drop table 表名;
      drop删除所有数据,会删除表结构。

    3、修改表
    (1)添加新字段
    alter table 表名 add(字段名 字段类型 默认值 是否为空);
    (2)修改字段
    alter table 表名 modify (字段名 字段类型 默认值 是否为空);
    (3)删除字段
    alter table 表名 drop column 字段名;

    4、重命名
    重命名表: rename 旧表名 to 新表名;
    重命名列: alter table 表名 rename column 旧列名 to 新列名;

    5、查看表及表结构
    select * from user_tables;
    select * from all_tables;
    select * from dba_tables;

    select * from user_tab_columns;
    select * from all_tab_columns;
    select * from dba_tab_columns;

    二、约束及其操作
    约束类型有5种:非空(not null)、唯一(unique)、主键(primary key)、外键(foreign key)、检查(check)。
    1、添加约束
    alter table 表名 add constraint 约束名称 约束类型(字段)[选项]
    添加主键约束: alter table 表名 add constraint 约束名称 primary key (字段);
    添加外键约束: alter table 表名 add constraint 约束名称 foreign key (字段) references 表名(字段);
    添加唯一约束: alter table 表名 add constraint 约束名称 unique(字段);
    添加检查约束: alter table 表名 add constraint 约束名称 check(表达式);
    添加非空约束: 以上语法不适用于非空约束,添加非空约束只有一种方法,那就是修改表结构.
    alter table 表名 modify (字段名 字段类型 默认值 not null);

    2、删除约束
    alter table 表名 drop constraint 约束名;

    3、查看约束
    select * from user_constraints;
    select * from all_constraints;
    select * from dba_constraints;

    三、索引及其操作
    1、创建索引
    create [unique] index 索引名 on 表名(列名1 ASC|DESC,列名2 ASC|DESC,...,列名n ASC|DESC) [tablespace 表空间名];
    注:基表中的列名,一个索引最多有16列,long列、long raw列不能建索引列.DESC、ASC 缺省为ASC即升序排序.

    2、修改索引
    alter [unique] index 索引名 ...
    重建索引: alter [unique] index 索引名 rebuild
    合并无用的索引空间: alter [unique] index 索引名 coalesce;

    3、删除索引
    drop index 索引名;

    4、查看索引
    select * from user_indexes;
    select * from all_indexes;
    select * from dba_indexes;

    select * from user_ind_columns;
    select * from all_ind_columns;
    select * from dba_ind_columns;

    四、序列及其操作
    1、创建序列
    create sequence 序列名
    [increment by n]
    [start with n]
    [{maxvalue/ minvalue n| nomaxvalue}]
    [{cycle|nocycle}]
    [{cache n| nocache}];
    注:
    (1)MAXVALUE 定义序列生成器能产生的最大值。选项NOMAXVALUE是默认选项,代表没有最大值定义,这时对于递增Oracle序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。
    (2)MINVALUE定义序列生成器能产生的最小值。选项NOMAXVALUE是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是10的26次方;对于递增序列,最小值是1。

    2、使用序列
    select 序列名.nextval from dual;
    select 序列名.currentval from dual;

    3、修改序列
    alter sequence 序列名 ...
    修改序列步长: alter sequence 序列名 increment by n; -- n为修改后的步长

    4、删除序列
    drop sequence 序列名;
    5、查询序列
    select * from user_sequences;
    select * from all_sequences;
    select * from dba_sequences;

    五、表空间及其操作
    1、创建表空间
    create tablespace 表空间名
    datafile '数据文件路径' size 500M --存储地址 初始大小500M
    autoextend on next 10M maxsize 200M --每次扩展10M,无限制扩展 unlimited
    extent management local autoallocate
    segment space management auto;

    --创建临时表空间
    create temporary tablespace 表空间名
    tempfile '数据文件路径' size 50m
    autoextend on next 50m maxsize 20480m
    extent management local;

    --建立UNDO表空间
    create undo tablespace 表空间名
    datafile '数据文件路径' SIZE 50M
    注意:在OPEN状态下某些时刻只能用一个UNDO表空间,如果要用新建的表空间,必须切换到该表空间:
    ALTER SYSTEM SET undo_tablespace=表空间名;

    2、扩展表空间
    (1)首先查看表空间的名字和所属文件
    select tablespace_name, file_id, file_name, round(bytes/(10241024),0) total_space from dba_data_files order by tablespace_name;
    (2)增加数据文件
    alter tablespace 表空间名 add datafile '数据文件路径' size 1000M;
    (3)手动增加数据文件尺寸
    alter database datafile '数据文件路径' resize 4000M;
    (4)设定数据文件自动扩展
    alter database datafile '数据文件路径' autoextend on next 100M maxsize 10000M;
    (5)设定后查看表空间信息
    select a.tablespace_name,a.bytes total,b.bytes used, c.bytes free, (b.bytes
    100)/a.bytes "% used",(c.bytes*100)/a.bytes "% free"
    from sys.sm$ts_avail a,sys.sm$ts_used b,sys.sm$ts_free c where a.tablespace_name=b.tablespace_name and a.tablespace_name=c.tablespace_name;

    3、删除表空间
    drop tablespace 表空间名 including comments and datafiles;

    4、改变表空间状态
    (1)使表空间脱机
    alter tablespace 表空间名 offline;
    如果是意外删除了数据文件,则必须带有recover选项
    alter tablespace 表空间名 offline for recover;
    (2)使表空间联机
    alter tablespace 表空间名 online;
    (3)使数据文件脱机
    alter database datafile '数据文件路径' offline;
    (4)使数据文件联机
    alter database datafile '数据文件路径' online;
    (5)使表空间只读
    alter tablespace 表空间名 read only;
    (6)使表空间可读写
    alter tablespace 表空间名 read write;

    5、查询表空间
    select * from dba_data_files;

    六、分区及其操作
    [1]oracle表分区详解 https://www.cnblogs.com/andy6/p/6238512.html
    [2]oracle表分区增加分区 https://www.cnblogs.com/jadic/archive/2012/10/16/2725454.html
    [3]Oracle删除表分区 https://www.cnblogs.com/lj821022/p/4958262.html
    [4]Oracle 分区表的新增、修改、删除、合并。普通表转分区表方法 https://www.cnblogs.com/flowerszhong/p/4535206.html
    [5]Oracle分区表及分区索引的创建 https://blog.csdn.net/linux__xu/article/details/80957783

    当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表.
    分区种类:Range分区、Hash分区、List分区、组合分区(Range-hash、Range-list、RANGE-RANGE、LIST-RANGE、LIST-HASH、LIST-LIST).
    下面以Range分区为例:
    1、创建分区表
    CREATE TABLE part_test
    (
    andy_ID NUMBER NOT NULL PRIMARY KEY,
    FIRST_NAME VARCHAR2(30) NOT NULL,
    LAST_NAME VARCHAR2(30) NOT NULL,
    PHONE VARCHAR2(15) NOT NULL,
    EMAIL VARCHAR2(80),
    STATUS CHAR(1)
    )
    PARTITION BY RANGE (andy_ID)
    (
    PARTITION PART1 VALUES LESS THAN (10000),
    PARTITION PART2 VALUES LESS THAN (20000),
    PARTITION PART2 VALUES LESS THAN (maxvalue)
    );

    2、增加分区
    alter table 表名 add partition 分区名 ... [tablespace 表空间名];
    如:
    alter table part_test add partition PART3 values less than (3000);

    3、删除分区
    alter table 表名 drop partition 分区名 UPDATE GLOBAL INDEXES;
    ALTER INDEX 索引名 REBUILD(如果含有全局索引);
    如:
    alter table part_test drop partition PART3 UPDATE GLOBAL INDEXES;

    注:truncate分区
    ①truncate一个分区
    alter table 表名 truncate partition 分区名;
    alter index 索引名 rebuild;
    ②如果存在约束的情况,先disable约束
    alter table 表名 disable constraint 约束名;
    alter table 表名 truncate partittion 分区名;
    alter table 表名 enable constraint 约束名;

    4、修改分区
    重命名一个分区: alter table 表名 rename partition 旧分区名 to 新分区名
    移动一个分区: alter table 表名 move partition 分区名 tablespace 表空间名 nologging;
    合并分区: alter table 表名 merge partitions 分区名1, 分区名2 into partition 分区名3;
    一个分区拆分为两个分区: alter table 表名 split partition 分区名1 at (分区临界值)
    into (partition 分区名2 tablespace 表空间名1,
    partition 分区名3 tablespace 表空间名2);
    重建一个local索引: alter index 索引名 rebuild partition 分区名;

    5、查询分区
    select * from user_part_tables;
    select * from all_part_tables;
    select * from dba_part_tables;

    七、统计信息
    [1]收集oracle统计信息 https://www.cnblogs.com/rootq/archive/2010/02/04/1663622.html
    [2]DBMS_STATS包方法详解 https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_stats.htm#CIHGBFIC
    [3]DBMS_STATS常用方法(收集oracle信息) https://www.cnblogs.com/rusking/p/5867712.html
    [4]使用DBMS_STATS来收集统计信息 https://www.cnblogs.com/perfei/archive/2004/01/13/5143171.html
    [5]DBMS_STATS分析表 https://www.cnblogs.com/rootq/archive/2008/12/01/1345049.html

    统计信息可以通过ANALYZE命令或者DBMS_STATS包来收集。在COB模式下,DBMS_STATS包是DBA管理统计信息的有力工具。DBMS_STATS包允许管理员以调用过程的方式创建,编辑,查看和删除统计信息。它可以收集表、索引、列、分区和模式的统计信息,但是它不可以生成cluster的统计信息。

    1、收集统计信息
    dbms_stats.gather_database_stats 收集数据库统计信息
    dbms_stats.gather_schema_stats 收集schema下所有对象的统计信息
    dbms_stats.gather_table_stats 收集表、列和索引的统计信息
    dbms_stats.gather_index_stats 收集索引的统计信息
    dbms_stats.gather_system_stats 收集系统统计信息

    2、删除统计信息
    dbms_stats.delete_database_stats 删除数据库统计信息
    dbms_stats.delete_schema_stats 删除schema下所有对象的统计信息
    dbms_stats.delete_table_stats 删除表的统计信息
    dbms_stats.delete_column_stats 删除列的统计信息
    dbms_stats.delete_index_stats 删除索引的统计信息

    3、手动设置统计信息
    dbms_stats.set_table_stats 设置表的统计信息
    dbms_stats.set_column_stats 设置列的统计信息
    dbms_stats.set_index_stats 设置索引的统计信息

    4、查看统计信息
    (1)表级的统计信息
    select table_name,num_rows,blocks,empty_blocks,avg_space from user_tables where table_name = 表名;
    (2)表上列的统计信息
    select table_name,column_name,num_distinct,density from user_tab_columns where table_name = 表名;
    (3)表上列的直方图信息
    select table_name,column_name,endpoint_number,endpoint_value from user_tab_histograms
    where table_name = 表名 and column_name = 列名;
    (4)分区的统计信息
    select partition_name,num_rows,blocks,empty_blocks,avg_space from user_tab_partitions where table_name = 表名;
    (5)分区上列的统计信息
    select column_name,num_distinct,density,num_nulls from user_part_col_statistics
    where table_name = 表名 and partition_name = 分区名;
    (6)分区上列的直方图信息
    select column_name,bucket_number,endpoint_value from user_part_histograms
    where table_name = 表名 and partition_name = 分区名 and column_name = 列名;
    (7)子分区的统计信息
    select subpartition_name,num_rows,blocks,empty_blocks from user_tab_subpartitions
    where table_name = 表名 and partition_name = 子分区名;
    (8)子分区上的列的统计信息
    select column_name,num_distinct,density from user_subpart_col_statistics
    where table_name = 表名 and subpartition_name = 子分区名;
    (9)子分区上的列的直方图信息
    select column_name,bucket_number,endpoint_value from user_subpart_histograms
    where table_name = 表名 and subpartition_name = 子分区名 and column_name = 列名;

    5、统计信息定时任务
    从10g开始,Oracle在建库后就默认创建了一个名为GATHER_STATS_JOB的定时任务,用于自动收集CBO的统计信息。
    这个自动任务默认情况下在工作日晚上10:00-6:00和周末全天开启。
    调用DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC收集统计信息。该过程首先检测统计信息缺失和陈旧的对象。然后确定优先级,再开始进行统计信息。

    可以通过以下查询这个JOB的运行情况:
    SELECT * FROM Dba_Scheduler_Jobs WHERE Job_Name = 'GATHER_STATS_JOB';
    然而这个自动化功能已经影响了很多系统的正常运行,晚上10点对于大部分生产系统也并非空闲时段。
    而自动分析可能导致极为严重的闩锁竞争,进而可能导致数据库Hang或者Crash。
    所以建议最好关闭这个自动统计信息收集功能:
    关闭及开启自动搜集功能,有两种方法,分别如下:
    方法一:
    exec dbms_scheduler.disable('SYS.GATHER_STATS_JOB');
    exec dbms_scheduler.enable('SYS.GATHER_STATS_JOB');
    方法二:
    alter system set "_optimizer_autostats_job"=false scope=spfile;
    alter system set "_optimizer_autostats_job"=true scope=spfile;

  • 相关阅读:
    log4j
    【表单验证】几个常用的正则表达式子
    【代码健壮性】善用data-属性来关联,慎用parent()之类的查找结构
    【javascript闭包】转载一篇不错的解释,也有几个大牛的链接
    【CSS】三栏布局的经典实现
    【转载】sublime text3 全攻略
    【CSS】text-align:justify 的使用
    javascript与jquery删除元素节点
    【Jquery对象】jquery与dom对象的区别
    【Jquery】this和event.target的区别
  • 原文地址:https://www.cnblogs.com/shujk/p/13907156.html
Copyright © 2020-2023  润新知