可以给出联合型非关联型的图例:
【调优TIPS】
出现哈希连接,可以在子查询加个rownum,让优化器先内部查询好再查询外部,不构成哈希连接
索引列有空值是不走索引的,模糊匹配也不能走索引
with as用法,有缓存,可以用于提高性能
select * from emp where deptno in (select deptno from dept where dname='SALES'); with tmp as (select deptno from dept where dname='SALES') select * from emp where deptno in (select * from tmp)虚拟索引
alter session set "_use_nosegment_indexes"=true; create index index_name on table_name(col_name) nosegment;物化视图
create materialized view [视图名称] build immediate | deferred refresh fase | complete | force on demand | commit start with [start time] next [next time] with primary key | rowid //可以省略,一般默认是主键物化视图 as [要执行的SQL]ok,解释一下这些语法用意:
build immediate | deferred (视图创建的方式):
(1) immediate:表示创建物化视图的时候是生成数据的;
(2) deferre:就相反了,只创建物化视图,不生成数据
refresh fase | complete | force (视图刷新的方式):
(1) fase:增量刷新,也就是距离上次刷新时间到当前时间所有改变的数据都刷新到物化视图,注意,fase模式必须创建视图日志
(2) complete:全量更新的,complete方式相当于创建视图重新全部查一遍
(3) force:视图刷新方式的默认方式,当增量刷新可用则增量刷新,当增量刷新不可用,则全量刷新,一般不要用默认方式
on demand | commit start with ... next ...(视图刷新时间):
(1) demand:根据用户需要刷新时间,也就是说用户要手动刷新
(2) commit:事务一提交,就自动刷新视图
(3) start with:指定首次刷新的时间,一般用当前时间
(4) next:物化视图刷新数据的周期,格式一般为“startTime+时间间隔”
Oracle体系结构Oracle体系结构由实例和一组数据文件组成,实例由SGA内存区,SGA意思是共享内存区,由share pool(共享池)、data buffer(数据缓冲区)、log buffer(日志缓冲区)组成
SGA内存区的share pool是解析SQL并保存执行计划的,然后SQL根据执行计划获取数据时先看data buffer里是否有数据,没数据才从磁盘读,然后还是读到data buffer里,下次就直接读data buffer的,当SQL更新时,data buffer的数据就必须写入磁盘备份,为了保护这些数据,才有log buffer,这就是大概的原理简介
系统结构关系图如:
未绑定遍历SQL查询
create table t_bind_sql as select sql_text,module from v$sqlarea; alter table t_bind_sql add sql_text_wo_constants varchar2(1000); create or replace function remove_constants( p_query in varchar2 ) return varchar2 as l_query long; l_char varchar2(10); l_in_quotes boolean default FALSE; begin for i in 1 .. length( p_query ) loop l_char := substr(p_query,i,1); if ( l_char = '''' and l_in_quotes ) then l_in_quotes := FALSE; elsif ( l_char = '''' and NOT l_in_quotes ) then l_in_quotes := TRUE; l_query := l_query || '''#'; end if; if ( NOT l_in_quotes ) then l_query := l_query || l_char; end if; end loop; l_query := translate( l_query, '0123456789', '@@@@@@@@@@' ); for i in 0 .. 8 loop l_query := replace( l_query, lpad('@',10-i,'@'), '@' ); l_query := replace( l_query, lpad(' ',10-i,' '), ' ' ); end loop; return upper(l_query); end; / update t_bind_sql set sql_text_wo_constants = remove_constants(sql_text); commit; select sql_text_wo_constants, module,count(*) CNT from t_bind_sql group by sql_text_wo_constants,module having count(*) > 100 order by 3 desc;