没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
1. SQL 语句分析
1) 通过 SQLPLUS 中的 SET TRACE 功能对 Sql 语句的性能进行分析
2) 通过 Toad 或 PL/SQL Developer 对语句的性能进行和索引的使用情况进行分析
3) 对 Oracle 缺省的优化不满意可以强制使用 Hint,但一般不推荐使用
4) 对 Flag 等只存储是或否信息的字段,一般不推荐建立索引。必要可以采用位图索引
5) *存在递归查询情况如果关联 Table 太多对性能会造成较大影响,往往推荐采用临时表
转为分步骤操作提高性能
6) *尽量使用表关联查询而不使用函数,但涉及类似于代码表要重复关联多次取数据问题
时候又适合使用函数
7) 上述的相关内容就是对 Oracle 存储过程编写经验和优化措施的描述,希望会给你带来
一些帮助在此方面。
2. 全表扫描和索引扫描
1. 大数据量表尽量要避免全表扫描,全部扫描会按顺序每条记录扫描,对于 >100 万数据
表影响很大。
2. Oracle 中通过 RowID 访问数据是最快的方式
3. 对字段进行函数转换,或者前模糊查询都会导致无法应用索引而进行全表扫描
4. 对 Oracle 共享池和缓冲区中的 Sql 必须要大小写都完全用上才能够匹配上
3. 索引方面
1) 记录数少的表保留有主键索引就可以了,不要再去建其它索引,全表扫描也很快
2) 索引最好单独建立表空间,必要时候对索引进行重建
3) 必要时候可以使用函数索引,但不推荐使用
4) Oracle 中的视图也可以增加索引,但一般不推荐使用
5) *Sql 语句中大量使用函数时候会导致很多索引无法使用上,要针对具体问题分析
4. WHERE 子句中的连接顺序
1) Oracle 按照从右到左的顺序对数据表进行解析。因此 From 最后面的表为基础表,一般
要选择记录数最少的表作为基础表。
2) 表之间的连接必须写在其他 WHERE 条件之前, 那些可以过滤掉最大数量记录的条件必
须写在 WHERE 子句的末尾.。
3) Where 条件中涉及到使用复杂函数判定的必须注意要写到 Where 条件的最前面
5. 选择最有效率的表名顺序(只在基于规则的优化器中有效, 将记录
最少的表放在最后)
ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中的表名,FROM 子句中写在最
后的表(基础表 driving table)将被最先处理,在 FROM 子句中包含多个表的情况下,你必须选
择记录条数最少的表作为基础表。如果有 3 个以上的表连接查询, 那就需要选择交叉表作为
基础表, 交叉表是指那个被其他表所引用的表(关联关系表).
例如:
(1)基础表放下面,当两表进行关联时数据量少的表的表名放右边
表或视图:
Student_info (30000 条数据)
Descrip9on_info (30 条数据)
低效
select *
from descrip9on_info di
,student_info si --学生信息表
where si.student_id = di.lookup_code(+)
and di.lookup_type(+) = 'STUDENT_ID'
高效
select *
from student_info si--学生信息表
,descrip9on_info di
where si.student_id = di.lookup_code(+)
and di.lookup_type(+) = 'STUDENT_ID'
(2) 当出现多个表时,关联表被称之为交叉表,交叉表作为基础表
低效
select *
from descrip9on_info di
,descrip9on_info di2
,student_info si --学生信息表
where si.student_id = di.lookup_code(+)
and di.lookup_type(+) = 'STUDENT_ID'
and si.school_id = di.lookup_code(+)
and di.lookup_type(+) = 'SCHOOL_ID'
高效
select *
from student_info si--学生信息表
,descrip9on_info di
,descrip9on_info di2
where si.student_id = di.lookup_code(+)
and di.lookup_type(+) = 'STUDENT_ID'
and si.school_id = di.lookup_code(+)
and di.lookup_type(+) = 'SCHOOL_ID'
6. 用直接的表关联来代替 Exist.用 Exist 或 Not Exists 来代理 In。In
进行子查询效率很差。
7. SELECT 子句中避免使用”*”,改成具体的字段
ORACLE 在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典
完成的, 这意味着将耗费更多的时间
8. 减少访问数据库的次数:
ORACLE 在内部执行了许多工作: 解析 SQL 语句, 估算索引的利用率, 绑定变量,读数据块
等;
9. 在 SQL*Plus , SQL*Forms 和 Pro*C 中重新设置 ARRAYSIZE 参数, 可
以增加每次数据库访问的检索数据量 ,建议值为 200
10. 使用 DECODE 函数来减少处理时间:
使用 DECODE 函数可以避免重复扫描相同记录或重复连接相同的表.
例如:
SELECT COUNT(*),SUM(SAL)
FROM EMP
WHERE DEPT_NO = 0020
AND ENAME LIKE ‘SMITH%’;
SELECT COUNT(*),SUM(SAL)
FROM EMP
WHERE DEPT_NO = 0030
AND ENAME LIKE ‘SMITH%’;
你可以用 DECODE 函数高效地得到相同结果
SELECT COUNT(DECODE(DEPT_NO,0020,’X’,NULL)) D0020_COUNT,
COUNT(DECODE(DEPT_NO,0030,’X’,NULL)) D0030_COUNT,
SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,
SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL
FROM EMP WHERE ENAME LIKE ‘SMITH%’;
类似的,DECODE 函数也可以运用于 GROUP BY 和 ORDER BY 子句中.
剩余18页未读,继续阅读
资源评论
guorun18
- 粉丝: 17
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功