位图索引
注: bitmap 强调的是二进制,图中的块相当于数据区块的块,位图索引适合数据种类小和数据量小的,DML少的。
视图
一,普通视图
视图(view),也称虚表,不占用物理空间,这个也是相对概念,因为视图本身的定义语句还是要存储在数据字典里的。
视图只有逻辑定义。每次使用的时候,只是重新执行SQL。
视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。
二,创建
create [ or replace ] [ { force | noforce} ] view view_name as select 查询 [ with read only constratint ]
语法解析:
1, or replace:如果视图已经存在,则替换旧视图
2,force : 即使基表不存在,也可以创建该视图。到那时该视图不能正常使用,当基表创建成功后,视图才能正常使用。
3,noforce : 如果基表不存在,无法创建视图,该项是默认选项,
4,with read only : 默认可以通过视图对基表执行增删改操作,但是有很多在基表上的限制(比如: 基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert 操作),with read only 说明视图是只读视图,不能通过该视图进行增删改操作。显示开发中,基本上不通过视图对表中的数据进行增删改操作。
三,使用
select * from view_name
视图的作用:
1,减少篇幅,如图片描述

2,用实体权限将基表锁定,给检索出部分字段的视图公开权限,做到数据的隐藏保障安全(解释: 因为视图在搜索时不会体现出和基表不同,程序员在拿到数据库结构时,不知道是真是表或视图,保证隐藏字段安全,像银行核心数据库)
注: 视图不会给程序运行提速! 只会降低运行速度但是可以显著降低部分代码的开发成本。

**注: 查单表 是简单视图,都查出带约束字段或触发器含盖的,全部搜出,复杂视图只查**
**视图要注意的地方!!!!
尽量不要基于视图创建视图,更不要基于视图和该视图使用过的基表创建视图。(重复使用基表)**
物化视图(可以抵消笛卡尔的消耗)
create materialzed view mv_name
[ refresh [ fast | complete | force ] //刷新方式 快速| 全刷(不配合commit)| 自动
[ on demand | commit] //刷新时机 定时|自动
[ start with date ] [ next date ] // create 执行后 会创建一个视图也就是sql。和一个表。这个是判断什么时候创建表 ,根据as后的结构创建表, next date 配合刷新实际里的定时刷新,
[ with { primary key | rowid } ] ] //能否进行表联查
as ?
1,创建方式(build methods),build immediate 和 build deferred 两种。build immediate 是在创建物化视图的时候就生成数据,而build deferred 则在创建时不生成数据,以后根据需要在生成数据。默认为build immediate。
2,查询重写(query rewrite) : enable query rewrite 和 disable query rewrite 两种。分别指出创建的物化视图是否支持查询重写。查询重写时指当对物化视图的基表进行查询时,Oracle 会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,则直接从已经计算好的物化视图中读取数据。默认为 disable query rewrite。
3,刷新(refresh) : 指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。
刷新的模式有两种: on demand 和 on commit。 on demand 指物化视图在用户需要的时候进行刷新,可以手工通过dbms_mview,refresh等方法来进行刷新,也可以通过JOB 定时进行刷新。on commit 指物化视图在对基表的DML操作提交的同时进行刷新。
刷新的方式有四种: fast 、complete 、 force 、和 never。 fast 刷新采用增量刷新,只刷新自上次刷新以后进行的修改。
complete 刷新对整个物化视图进行完全的刷新。如果选择force方式,则Oracle 在刷新时会去判断是否可以进行快速刷新,如果可以采用fast方式,否则采用complete 的方式。never 指物化视图不进行任何刷新。默认值是force on demand。
在建立物化视图的时候可以指定order by 语句,使生成的数据按照一定的顺序进行保存。不过这个语句不会写入物化视图的定义中,而且对以后的刷新也无效。
** 注:在复杂查询上只能建立全刷新的物化视图。**
4,删除物化视图有两种顺序,一是先删除物化视图在删除日志; 二使 先删除日志在删除物化视图。
如果原数据表只被一个物化视图引用,那么可以采用先删除日志,再删除物化视图,这样删除的速度较快。
drop materialized view log on view_name;
drop materialized view view_name;
如果日志上建立了多个物化视图,那么致删除物化视图即可,因为删除日志后,其他引用该日志的物化视图将无法刷新。
dql语法要求
所有快速刷新的物化视图都必须满足的条件
定义物化视图的查询语句现状和如下:
1,物化视图中不能含有非重复表达式的引用,例如 sysdate 和 rownum
2,物化视图中不能出现raw 或 long raw 数据类型的引用。
3,查询语句的select 部分语不能出现子查询。
4,select 子句部分不能包含分析性质的函数,例如 rank
5,不能含有model子句
6,子查询中不能含有having子句
7,不能出现含有 any,all 或not exists 的嵌套子查询
8,不能含有 [ start with…] connect by 子句
9,不能包含不同站点的多个明细表。
10,on commit 刷新方式的物化视图不能有远程明细表的引用,
11,嵌套物化视图必须含有表连接或者聚合计算
12,物化视图包含连接和 group by 子句的聚合计算时,不能 select from 一个有索引的表。
-------------------------------------------------------------------------------------------------------------------------------
只包含连接的物化视图快速刷新限制条件
定义物化视图的查询语句只含有连接且没有聚合计算,实现快速刷新满足通用条件外还要满足条件如下:
1,不能含有 group by 子句或聚合计算。
2,from 中出现的每个基表的rowid 必须出现在select子句中。
3,from 中出现的每个基表都必须创建基于rowid的物化视图日志(materialized view log)。
4,select 子句中不能含有object类型的列。
另外,一下情况将会影响快速刷新的效率:
1,定义的查询语句含有外联接,如果这样的话,请考虑重写查询语句改为内连接。
2,select 子句中含有多个表的列运算。
-------------------------------------------------------------------------------------------------------------------------
包含聚合的物化视图快速刷新限制
定义物化视图的查询语句包含有聚合计算,实现快速刷新满足通用条件外,还要满足条件如下:
1,所有基表必须建立物化视图日志,创建日志必须满足:
1.1,包含在物化视图中引用的所有列,确保这些列没有被加密。
1.2,需要指定rowid 和 including new vaues。
1.3,如果基表会有插入/ 直接导入,删除,更新数据的混合操作,需要指定sequence子句。
2,只有sum,count, avg, stddev , variance,min,max,才支持快速刷新。
3,必须有写 count(*)。
4,聚合函数必须出现在表达式的最外层,也就是说像avg(avg(x))或avg(x)+avg(x)都是不允许的。
5,对每一个聚集计算如 avg(expr),相应的count (expr)也必须要有,Oracle建议sum(expr)也写上。
6,如果含有 variance(expr) 或 stddev(expr),count(expr)sum(expr)都必须写,Oracle建议sum(expr*expr)也写上。
7,查询中定义的select列不能是来自多个表的列复杂运算,可以考虑使用嵌套物化视图作变通方案。
8,group by 中的列都要在select里出现。
9,如果物化视图日志中过滤列字段类型为char,那么基表所在的数据量和物化视图所在的数据库的字符集必须要一样。
10,如果物化视图有以下情况,增量刷新只支持DML操作中的insert和直接装载(direct loads)操作,这种物化视图叫 只能插入(insert-only) 的物化视图。
10.1,物化视图有min或者max聚合计算
10.2,物化视图有sum(expr)但是没有 count(expr)。
10.3,物化视图没有指定 cont(*)
11,含有max或min聚合计算的物化视图如果没有where子句,是支持基表增删改的增量刷新的。
12,物化视图的from子句中有普通视图或者子查询,如果普通视图可以被完全合并是可以支持增量刷新的。(ps。不懂嘛意思)
13,如果没有外连接,where 子句没有限制。
14,有外连接和聚合计算的物化视图是支持增量刷新的,只有外接表数据变更的时候。另外,唯一约束必须存在于表的内连接上。如果有外连接,所有连接必须用and和=操作符。
15,对于含有cube,rollup,grouping sets 的物化视图,会有以下限制:
15.1,select列表要包含group by 所有字段的grouping_id或grouping。例如:group by子句是 group by cube(a,b),那么select列表中应该包含 grouping_id(a,b)或grouping( a),grouping(b),这样才会使物化视图增量刷新。
15.2,group by 不能能导致多个groupings的情况,比如,group by 啊,rollup(a,b)就不会增量刷新,因为这个会导致多个grouping(a),(a,b),(a)。
在这里插入代码片
--定时全刷新 ,适合定期报表
create materialized view mv_demo1_1
refresh complete on demand
start with sysdate
next sysdate+1/24/60/6
as
select c2,c3 from demo1
--根据刚才创建的物化视图查询
select * from mv_demo1_1
--删除
drop materialized view mv_demo1_1
--添日志的
create materialized view log on demo2 with rowid;
--删日志的
drop materialized view log on demo2
--定时增量刷新,数据归档
--物化视图默认根据主键刷新,要标记为rowid
create materialized view mv_demo1_2
refresh fast on demand
start with sysdate
next sysdate+1/24/60/6
with rowid
as
select c2,c3 from demo2
--提交刷新,保持数据一致性,数据冗余时,用来数据同步。
create materialized view mv_demo1_23
refresh fast on commit
start with sysdate
with rowid
as
select c2,c3 from demo1
多表的物化视图