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

一、表及其操作

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;

Oracle—表、约束、索引、表空间、分区、序列、统计信息的更多相关文章

  1. 分析Hive表和分区的统计信息(Statistics)

    类似于Oracle的分析表,Hive中也提供了分析表和分区的功能,通过自动和手动分析Hive表,将Hive表的一些统计信息存储到元数据中. 表和分区的统计信息主要包括:行数.文件数.原始数据大小.所占 ...

  2. 简单了解,使用oracle中的索引,表分区

    索引的分类 如下: 物理分类 逻辑分类 分区或非分区索引 单列或组合索引 B树索引(标准索引) 唯一或非唯一索引 正常或反向键索引 基于函数索引 位图索引   B树索引 b树索引通常也称为标准索引,索 ...

  3. Oracle数据迁移后由列的直方图统计信息引起的执行计划异常

    (一)问题背景 在使用impdp进行数据导入的时候,往往在导入表和索引的统计信息的时候,速度非常慢,因此我在使用impdp进行导入时,会使用exclude=table_statistics排除表的统计 ...

  4. sql server重建全库索引和更新全库统计信息通用脚本

    重建全库索引: exec sp_msforeachtable 'DBCC DBREINDEX(''?'')' 更新全库统计信息: --更新全部统计信息 exec sp_updatestats 实例反馈 ...

  5. ORACLE 查看当前用户信息(用户,表视图,索引,表空间,同义词,存储过程,约束条件)

    1.用户 查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select ...

  6. Oracle性能优化之oracle里表、索引、列的统计信息

    一.表的统计信息 表的统计信息用于描述表的详细信息,包括记录数(num_rows).表块的数量(blocks).平均行长度(avg_row_len)等典型维度.这些维度可以通过数据字典表DBA_TAB ...

  7. 基于Oracle的SQL优化(崔华著)-整理笔记-第5章“Oracle里的统计信息”

    第5章“Oracle里的统计信息” 详细介绍了Oracle数据库里与统计信息相关的各个方面的内容,包括 Oracle数据库中各种统计信息的分类.含义.收集和查看方法,以及如何在Oracle数据库里正确 ...

  8. Oracle索引梳理系列(五)- Oracle索引种类之表簇索引(cluster index)

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  9. Oracle 执行报错表空间或临时表空间不足,降低水位线方法

    Oracle 执行语句插入临时表报表空间不足,在增加表空间到最大后依然报错,经分析应该为创建的临时表水位线未清除导致,查询降低水位线方法如下: 原文地址:http://blog.itpub.net/2 ...

随机推荐

  1. centos7 永久修改hostname

    1.修改 /etc/sysconfig/network ,重启后还是原来的主机名 2.百度有说明是/etc/rc.d/rc.sysinit下的脚本还原了还来主机名,问题是的我主机上没有这个脚本 3.执 ...

  2. 字符串可以这样加索引,你知吗?《死磕MySQL系列 七》

    系列文章 三.MySQL强人"锁"难<死磕MySQL系列 三> 四.S 锁与 X 锁的爱恨情仇<死磕MySQL系列 四> 五.如何选择普通索引和唯一索引&l ...

  3. 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)

    1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...

  4. C++ 默认拷贝构造函数 深度拷贝和浅拷贝

    C++类默认拷贝构造函数的弊端 C++类的中有两个特殊的构造函数,(1)无参构造函数,(2)拷贝构造函数.它们的特殊之处在于: (1) 当类中没有定义任何构造函数时,编译器会默认提供一个无参构造函数且 ...

  5. 4. 理解Update、Enter、Exit 与 添加、删除元素

    理解Update.Enter.Exit 与 添加.删除元素 在使用data()绑定数据时,例如:现在我们有一个数组[3,6,9,12,15],我们可以将数组每一项与一个<p>绑定,但是,现 ...

  6. 南大《软件分析》课程笔记——Intermediate Representation

    南大<软件分析>--Intermediate Representation @(静态分析) Content 编译器和静态分析的关系 AST vs IR IR:3-地址代码(3AC) 实际静 ...

  7. js实现全选与全部取消功能

    function checkAll() { //把所有参与选择的checkbox使用相同的name,这里为"num_iid"    var eles = document.getE ...

  8. Effective C++ 总结笔记(六)

    七.模板与泛型编程 41.了解隐式接口和编译器多态 1.类和模板都支持接口和多态. 2.类的接口是显式定义的--函数签名.多态是通过虚函数在运行期体现的. 3.模板的接口是隐式的(由模板函数的实现代码 ...

  9. vue3 学习笔记 (五)——vue3 的 setup 如何实现响应式功能?

    setup 是用来写组合式 api ,内部的数据和方法需要通过 return 之后,模板才能使用.在之前 vue2 中,data 返回的数据,可以直接进行双向绑定使用,如果我们把 setup 中数据类 ...

  10. [cf1240F]Football

    (事实上,总是可以让每一场都比,因此$w_{i}$并没有意义) 当$k=2$时,有如下做法-- 新建一个点,向所有奇度数的点连边,并对得到的图求欧拉回路,那么只需要将欧拉回路上的边交替染色,即可保证$ ...