Oracle学习笔记

勿传网上!严禁谋利! Oracle学习笔记

create or replace view beijing as select * from haidian union all select * from haidian1 union all select * from xicheng union all select * from changping eg:每个客户选择了哪些资费标准 方式一: create or replace view cost_account_service as select a.real_name,s.unix_host,c.name from account a join service s on a.id=s.account_id join cost c on s.cost_id=c.id; 方式二: create or replace view cost_account_service as select a.real_name,s.unix_host,c.name from account a left join service s on a.id=s.account_id left join cost c on s.cost_id=c.id; 方式三: create or replace view cost_account_service as select a.real_name,t.unix_host,t.name from account a left join (select s.account_id,s.unix_host,c.name from service s join cost c on s.cost_id = c.id) t on a.id = t.account_id; 常彦博

18.6视图的分类 1)简单视图:基于单张表并且不包含函数或表达式的视图,在该视图上可以执行DML语句(即可执行增、删、改操作)。 2)复杂视图:包含函数、表达式或者分组数据的视图,在该视图上执行DML语句时必须要符合特定条件。 在定义复杂视图时必须为函数或表达式定义别名。

3)连接视图:基于多个表建立的视图,一般来说不会在该视图上执行insert、update、delete操作(即不可进行DML操作)。

18.7视图的维护

1)视图中的with check option约束

create or replace view test_ck as select * from test where c1=1 with check option;

通过“视图”插入数据时,必须符合条件才能插入(避免不符合逻辑的问题:能插

入其他值,但通过视图查询时看不到其他值的情况,即能操作却不能看)。

39

勿传网上!严禁谋利! Oracle学习笔记

2)视图中的with read only约束

create or replace view test_ck as select * from test where c1=1 with read only;

只读视图,只能看不能操作,报错提示这些是虚拟列。 3)视图的DDL语句

create or replace view view_name alter view drop view

常彦博

40

勿传网上!严禁谋利! Oracle学习笔记

常彦博

十九、数据库对象:索引index

19.1创建index

create index index_name on table_name(colname); eg:创建service表中的account_id索引 create index service_account_id_idx on service(account_id); 19.2扫描表的方式

1)全表扫描FTS(Full Table Scan)

高水位线HWM(High Water Mark):曾经插入数据的最远块(数据存储的最小单元数1□2|口口,1、2被删掉后,高水位线不动,所以叫曾经?? 据块)。数据块:口口口□delete from tabname中delete也同理,清除数据但不释放空间,高水位线不动,count(*)花很长时间,但结果为0;同时数据也要写入rollback回滚段,因此时间又长了,但好处是不提交数据是可恢复的;若等了半天,出现回滚段空间不足,则又会把数据返回表中 -_-!所以,delete不适合删除大表的所有数据! truncate table tabname;DDL操作,空间释放,高水位线前移,时间短,不写回滚段,数据是不可恢复的(删除表中的所有行,但表结构及其列、约束、索引等保持不变)。 eg:将扫描高水位线以下的所有数据块 select real_name from account where id=1010;不建立索引,则会扫描全表 2)通过rowid(伪列)来扫描数据 rowid:标识一条记录的物理位置(唯一标识),rowid的数据类型就是rowid,会隐式把字符转成rowid类型。 rowid包含如下信息: ①该记录属于哪张表的(哪个数据库对象):data_object_id ②该记录在数据文件的第几个数据块里:block_id ③该记录在数据块里是第几条记录:row_id 而索引则会记录:key,rowid键值对,即为index entry索引项。 19.3索引的结构 叶子块1 分支块1 叶子块2 根块 叶子块3 分支块2 叶子块4 B*tree索引由根块(root block)、分支块(branch block)、叶子块(leaf block)组成。

1)根块下面是分支块,用于导航结构,包含了索引列范围和另一非根块(可以是分支块或叶子块)的地址。

2)最底层为叶子块,包含索引项(index entry),索引由key值(被索引列的值)和该列所在行的rowid组成。

3)叶子块实际上是双向链表的表。一旦找到叶子块的“开始”点(一旦找到第一个值),

41

勿传网上!严禁谋利! Oracle学习笔记

常彦博

对值进行顺序扫描(索引范围扫描)是很容易的。不必再做结构导航,只要通过叶子块转发就行。最主要的就是索引对数据进行了排序。

19.4为什么要使用索引

1)Oracle server通过rowid快速定位要找的行。

2)通过rowid定位数据能有效降低读取数据块(data block)的数量。 3)索引的使用和维护是自动的,一般情况下不需要用户干预。

19.5哪些列适合建索引

1)经常出现在where子句的列。 2)经常用于表连接的列。 ? 注意事项:A、B两表连接,B表有引用A表的外键,则从外键约束角度看A表为父表,B表为子表;一般父表数据量小,子表数据量大,所以从表连接角度看A表应作为驱动表,B表应作匹配表,把匹配表作索引,则匹配时不再进行全表扫描,效率将提高。 3)该列是高基数数据列(高基数数据列是指有很多不同的值)。 4)该列包含许多null值。 ? 注意事项:where is null一定是全表扫描,因为索引不记录null值。 5)表很大,查询的结果集小。 6)主键(PK)列、唯一键(UK)列。 7)外键(FK)列。 8)经常需要排序(order by)和分组(group by)的列。 ? 注意事项: ? 索引不是万能的,结果集和源表数据差不多时,使用索引就不好了,因为系统还要去读索引。 ? 但没有索引是万万不能的。 19.6索引的类型 1)唯一性索引(unique):等价于唯一性约束,唯一性约束用唯一性索引实现的。 2)非唯一性索引:用于提高查询效率 eg:创建唯一性索引 create unique index test_c1_uniidx on test(c1); insert into test values (1); insert into test values (1); ERROR at line 1: ORA-00001: unique constraint (JSD1302.TEST_C1_UNIIDX) violated 注意:唯一性约束的名字是唯一性索引的名字 结论:唯一性约束是通过唯一性索引实现的,二者是等价的。 3)单列索引:索引建在一列上 4)联合索引:索引建在多列上 eg:创建联合索引 create unique index srt_cour_pkid on stu_cour(sid,cid);联合主键索引:则 index entry存储的为1011,10,rowid where c1=2 and c2=1;联合列索引:则index entry存储的为2,1,rowid 42

联系客服:779662525#qq.com(#替换为@)