Oracle概述与视图、索引、序列

一、Oracle的存储结构

1、存储结构分类

2、逻辑存储结构

(1)数据块(Data Blocks)

数据块是Oracle数据库存储结构中最小的逻辑存储单元。

一个数据库块对应一个或者多个物理块,大小由参数DB_BLOCK_SIZE决定

数据块的结构包括块头和存储区的两个部分


(2)数据区(Extent)

数据区是Oracle数据分配的最小单位

数据库由连续的数据块结合而成的

(3)段(Segment)

数据段:存储表中所有数据

索引段:存储表上最佳查询的所有索引数据

临时段:存储表排序操作期间建立的临时表的数据

回滚段:存储修改之前的位置和值

(4)表空间(Tablespace)

表空间是数据库最大的逻辑划分区域

一个表空间由一个或多个数据文件组成,一个数据文件只属于一个表空间

表空间的大小是它对应的数据文件大小的总和

默认创建的表空间


3、物理存储结构

物理存储结构包括三种文件:数据文件、控制文件、重做日志文件


(1)数据文件(.DBF)


(2)控制文件(.CTL)


(3)日志文件(.LOG)


二、查询

查询的SQL语句绝大部分与MySQL相同,在这里说一些以前没有提到的。

1、在查询结果中排除重复行

为了排除重复行,需要使用DISTINCT关键字

select distinct job from emp;
说明:distinct的作用是消除重复内容,但是所谓的消除重复的内容,是指一条完整的数据全部是重复的,如果多行记录只有一列重复而其他列不重复,那么也是无法消除的。
当查询比较大的表时应尽可能地避免使用DISTINCT关键字
2、伪列:一种数据类型,唯一标识一条记录,物理位置的一个id,基于64位编码的18个字符。

(1)伪列的用途

1.能以最快的方式访问表中的一行
2.能显示表的行是如何存储的
3.作为表中唯一标识

(2)常用伪列

rowid和rownum

rowid:数据库每一行都有一个行地址,rowid返回改行地址,可以使用rowid来标记表中的一行,通常情况下,rowid值可以唯一地标识数据库的一行。

查询emp表中的rowid列
select rowuid from emp;

rownum:对于一个查询返回的每一行,rownum伪列返回一个数值代表的次序。返回第一行的rownum值为1,第二行的rownum值为2,以此类推。通过使用rownum伪列,用户可以限制查询返回的行数

查询emp表中的前5行记录
select * from emp where rowid <6;

三、视图

         视图是一个虚拟表(不占内存),它由存储的查询构成,可以将它的输出看作是一个表。视图同真的表一样,也可以包含一系列带有名称的列和行数据。但是,视图并不在数据库中存储数据值,其数据值来自定义视图的查询语句所引用的表,数据库只在数据字典中存储视图的定义信息。

       通过视图修改数据时,实际上就是在修改基本表中的数据。与之相对应,改变基本表中的数据也会反映到由该表组成的视图

1、创建视图

create [or replace] view <view_name> [alias[,alias]…) ]
as <subquery>
[with check option] [constraint constraint_name]
[with read only]

2、查询视图

用户可以通过select语句像查表一样查询视图

select *from emp_view;

3、更新视图

可更新视图满足以下条件:
(1)没有使用连接函数、聚合函数和组函数;
(2)创建视图的SELECT语句中没有聚合函数且没有GROUP BY、ONNECT BY、START WITH子句及DISTINCT关键字;
(3)创建视图的SELECT语句中不包括从基表列通过计算所得的列;
(4)创建视图没有包含只读属性

使用UPDATE语句可以通过视图修改基本表的数据

4、删除视图

 当视图不再需要时,用户可以执行DROP VIEW语句删除视图。用户可以直接删除其自身模式中的视图,但如果要删除其它用户模式中的视图,要求该用户必须具有DROP ANY VIEW 系统权限。

四、索引

如果要在表中查询指定的记录,在没有索引的情况下,必须遍历整个表,而有了索引之后,只需要在索引中找到符合查询条件的索引字段值,就可以通过保存在索引中的rowid快速找到表中对应的记录。

1、建立索引的注意事项

(1)索引应该建立在WHERE子句频繁引用表列上,如果在大表上频繁使用某列或某几个列作为条件执行索引操作,并且检索行数低于总行数15%,那么应该考虑在这些列上建立索引。
(2)限制表中索引的个数(因为索引占内存)。索引主要用于加快查询速度,但会降低DML操作的速度。索引越多,DML操作速度越慢,尤其会极大地影响INSERT和DELETE操作的速度。因此,规划索引时,必须仔细权衡查询和DML的需求。
(3)指定索引块空间的使用参数。基于表建立索引时,Oracle会将相应表列数据添加到索引块。为索引块添加数据时,Oracle会按照PCTFREE参数在索引块上预留部分空间,该预留空间时为将来的INSERT操作准备的。如果将来在表上执行大量INSERT操作,那么应该在建立索引时设置较大的PCTFREE。
(4)将表和索引部署到相同的表空间,可以简化表空间的管理;将表和索引部署到不同的表空间,可以提高访问性能。
(5)为了提高多表连接的性能,应该在连接列上建立索引

2、创建索引


创建B树的方法:CREATE INDEX 索引名 ON 表名 (列名 [ASC|DESC],…);

创建位图索引:CREATE BITMAP INDEX 索引名 ON 表名 (列名 [ASC|DESC],…);

五、数据的完整性和约束性

1、禁用约束

       约束创建之后,如果没有经过特殊处理,就一直起作用。但也可以根据实际需要,临时禁用某个约束。当某个约束被禁用后,该约束就不再起作用了,但它还存在于数据库中。

       那么,为什么要禁用约束呢?这是因为约束的存在会降低插入和更改数据的效率,系统必须确认这些数据是否满足定义的约束条件。当执行一些特殊操作时,比如,使用SQL*Loader从外部数据源向表中导入大量数据,并且事先知道这些数据是满足约束条件的,为提高运行效率,就可以禁用这些约束。

(1)禁用已经存在的约束

对于已存在的约束,则可以使用ALTER TABLE…DISABLE CONSTRAINT语句禁止该约束。

(2)激活约束

alter table table_name
enable [novalidate | validate] constraint con_name;

(3)删除约束

alter table table_name drop constraint con_name;

六、序列

1、创建序列

create sequence <seq_name>
[start with n]
[increment by n]
[minvalue n | nomainvalue]
[maxvalue n | nomaxvalue]
[cache n | nocycle]
[cycle | nocycle]
[order | noorder];
序列有两个“伪列”:
  nextval 序列将要产生的下一个数字
  currval  序列当前的值

2、管理序列

使用ALTER SEQUENCE语句可以对序列进行修改。需要注意,除了序列的起始值START WITH不能被修改外,其它可以设置序列的任何子句和参数都可以被修改。如果要修改序列的起始值,则必须先删除序列,然后重键该序列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值