oracle优化小知识

简介: oracle优化小知识

1.创建索引



CREATE [UNIQUE] INDEX index_name ON table_name(column_name[,column_name…])
1. UNIQUE:指定索引列上的值必须是唯一的。称为唯一索引。
2. index_name:指定索引名。
3. tabl_name:指定要为哪个表创建索引。
4. column_name:指定要对哪个列创建索引。我们也可以对多列创建索引;这种索引称为组合索引。
案例4:为EMP表的ENAME列创建创建唯一索引,为EMP表的工资列创建普通索引,把JOB列先变为小写再创建索引。
CREATE INDEX IDX_JOB_LOWER ON EMP(LOWER(JOB)); 
复制代码


2.数据执行顺序



oracle 过滤条件是从右到左的,所以右边的数据尽量是数据量比较小的一方
复制代码


3.执行计划查看



网络异常,图片无法展示
|


一般按缩进长度来判断,缩进最大的最先执行,如果有2行缩进一样,那么就先执行上面的。
表的访问方式
TABLE ACCESS FULL(全表扫描)
TABLE ACCESS BY INDEX ROWID(通过 ROWID 的表存取)
TABLE ACCESS BY INDEX SCAN(索引扫描)
索引扫描
索引范围扫描(INDEX RANGE SCAN)
引唯一性扫描(INDEX UNIQUE SCAN)
索引全扫描(INDEX FULL SCAN)
索引快速扫描(index fast full scan)
索引跳跃式扫描(INDEX SKIP SCAN)
复制代码


4.优化小知识



4.1.like


通配符%在前面的时候(%a)不会走索引的。
复制代码


4.2.is null 或 is not null


当过滤条件为where a is null 或者 where is not null是不走索引的 
复制代码


4.2.1 is null处理


常见的操作例如:
select * from a
    left join b on a.id=b.id
    where b.id is null;
这时候用函数nvl来处理
where 1=nvl(b.id,1) 
复制代码


4.2.2 is not null处理


常见的操作例如:
select * from a
    left join b on a.id=b.id
    where b.id is not null;
用 exists 来处理 
  select * from a where exists (select 1 from b where b.id=a.id)
用 nvl 大小处理
select * from a
    left join b on a.id=b.id
    where 1=<nvl(b.score,0);
用 length 长度处理
select * from a
    left join b on a.id=b.id
    where 2=<length(nvl(b.score,0));
复制代码


4.3.通过使用>=、<=等,避免使用<>命令


ORACLE遇到NOT <>,他就会停止使用索引转而执行全表扫描.
复制代码


4.4.用union all 代替 union all


4.5.当使用的是组合索引的时候,当第一个索引被引用才会生效


4.6.尽量不要再索引列上使用函数和计算


select * from a where a.wages * 12 > 120000
用下面的
select * from a where a.wages > 120000/12
复制代码


4.7减少对表的查询


比如判断多个字段和另一个表相同的时候
select * from a where a.1=(select b.1 from b where a.id=bi.id) and 
                      a.2=(select b.2 from b where a.id=bi.id)
调整为                      
select * from a where (a.1,a.2)=(select b.1,b.2 from b where a.id=bi.id)
复制代码


5.查询数据库链接数



select count(*) from v$process --当前的连接数
select value from v$parameter where name = 'processes' --数据库允许的最大连接数
复制代码


6.锁表查看



查询锁记录:
SELECT SESS.SID,  SESS.SERIAL#,  LO.ORACLE_USERNAME,  LO.OS_USER_NAME,  AO.OBJECT_NAME 被锁对象名, LO.LOCKED_MODE 锁模式, sess.LOGON_TIME 登录数据库时间,
'ALTER SYSTEM KILL SESSION ''' || SESS.SID || ','||SESS.SERIAL#||'''' FREESQL
FROM V$LOCKED_OBJECT LO,  DBA_OBJECTS AO,  V$SESSION SESS 
WHERE AO.OBJECT_ID = LO.OBJECT_ID AND LO.SESSION_ID = SESS.SID ORDER BY sid, sess.serial#;
精简:
select b.username,b.sid,b.serial#,logon_time 
from v$locked_object a,v$session b 
where a.session_id = b.sid order by b.logon_time; 
干掉锁:
alter system kill session 'sid,serial#';


相关文章
|
1月前
|
SQL Oracle 关系型数据库
Oracle数据库优化方法
【10月更文挑战第25天】Oracle数据库优化方法
56 7
|
1月前
|
存储 Oracle 关系型数据库
Oracle数据库优化策略
【10月更文挑战第25天】Oracle数据库优化策略
33 5
|
4月前
|
监控 Oracle 关系型数据库
"深度剖析:Oracle SGA大小调整策略——从组件解析到动态优化,打造高效数据库性能"
【8月更文挑战第9天】在Oracle数据库性能优化中,系统全局区(SGA)的大小调整至关重要。SGA作为一组共享内存区域,直接影响数据库处理能力和响应速度。本文通过问答形式介绍SGA调整策略:包括SGA的组成(如数据缓冲区、共享池等),如何根据负载与物理内存确定初始大小,手动调整SGA的方法(如使用`ALTER SYSTEM`命令),以及利用自动内存管理(AMM)特性实现智能调整。调整过程中需注意监控与测试,确保稳定性和性能。
396 2
|
6月前
|
SQL Oracle 关系型数据库
Oracle游标的使用和优化技巧
Oracle游标的使用和优化技巧
|
5月前
|
SQL Oracle 关系型数据库
Oracle游标的使用和优化技巧
Oracle游标的使用和优化技巧
|
5月前
|
SQL 存储 Oracle
Oracle数据库中游标的工作原理与优化方法
Oracle数据库中游标的工作原理与优化方法
|
7月前
|
存储 Oracle 数据管理
Oracle 12c的自动数据优化(ADO)与热图:数据管理的“瘦身”与“透视”艺术
【4月更文挑战第19天】Oracle 12c的ADO和热图技术革新数据管理。ADO智能清理无用数据,优化存储,提升查询速度,实现数据&quot;瘦身&quot;;热图则以直观的视觉表示展示数据分布和状态,助力识别性能瓶颈,犹如数据的&quot;透视&quot;工具。这两项技术结合,强化数据管理,为企业业务发展保驾护航。
|
SQL Oracle 关系型数据库
Oracle数据库优化的总结及优化方法
Oracle数据库优化的总结及优化方法
102 0
|
存储 SQL Oracle
Oracle优化避免索引失效
Oracle优化避免索引失效
382 0
|
SQL Oracle 关系型数据库
Oracle优化问题
Oracle优化问题