一、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的作用是消除重复内容,但是所谓的消除重复的内容,是指一条完整的数据全部是重复的,如果多行记录只有一列重复而其他列不重复,那么也是无法消除的。
(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 [alias[,alias]…) ]
as
[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
[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不能被修改外,其它可以设置序列的任何子句和参数都可以被修改。如果要修改序列的起始值,则必须先删除序列,然后重键该序列。