查看执行过缓存的解析Sql
select name , executions from v$db_object_cache where name like 'select *from sys_yh%'
- 优化器参数选择
- 尽量避免使用Choose 模式 采用基于Rule Select 的优化模式
- Rule模式的 为了使用基于成本的优化器(CBO,Cost—Based Optimizer),必须经常运行analyze命令,以增加数据库中的对象统计信息(object statistics)的准确性. 如果数据库的优化器模式设置为基于选择,那么实际的优化器模式将和是否运行过analyze命令有关。如果数据表已经被analyze过,优化器模式将自动切换成CBO,反之,数据库将采用RULE形式的优化器
访问数据表的方式
① 全表扫描
全表扫描就是顺序地访问表中每条记录。Oracle采用一次读入多个数据块(database block)的方式优化全表扫描。
② 通过ROWID访问表
ROWID包含了表中记录的物理位置信息。可以采用基于ROWID的访问方式情况提高访问表的效率。Oracle采用索引实现了数据和存放数据的物理位置(ROWID)之间的联系 通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能的提高
带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的
SQL语句会启动SQL引擎执行耗费资源的排序(SORT)功能.
DISTINCT需要一次排序操作, 而其他的至少需要执行两次
排序.
例如,一个UNION查询,其中每个查询都带有GROUP BY子句
, GROUP BY会触发嵌入排序(NESTED SORT) ; 这样, 每个
查询需要执行一次排序, 然后在执行UNION时, 又一个唯一
排序(SORT UNIQUE)操作被执行而且它只能在前面的嵌入
排序结束后才能开始执行. 嵌入的排序的深度会大大影响查
询的效率.
通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以
用其他方式重写
用EXISTS替换DISTINCt
低效:
SELECT DISTINCT DEPT_NO,DEPT_NAME
FROM DEPT D,EMP E
WHERE D.DEPT_NO = E.DEPT_NO
高效:
SELECT DEPT_NO,DEPT_NAME
FROM DEPT D
WHERE EXISTS ( SELECT ‘X’
FROM EMP E
WHERE E.DEPT_NO = D.DEPT_NO);
用UNION ALL 替代 Union
避免 索引列上使用函数