暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片
Oracle SQL性能优化40条
6414
9页
652次
2020-03-28
免费下载
性能优化
条
1. SQL
语句执行步骤
语法分析
语义分析
视图转换
表达式转换
选择优化器
选择连接方式
选择连
接顺序
选择数据的搜索路径
运行“执行计划”
2.
选用适合的
Oracle
优化器
(基于规则)、
(基于成本) 、
(选择性)
3.
访问
Table
的方式
全表扫描
全 表 扫 描 就 是 顺 序 地 访 问 表 中 每 条 记 录 ,

采 用 一 次 读 入 多 个 数 据 块
的方式优化全表扫描。
通过
ROWID
访问表
包含了表中记录的物理位置信息,

采用索引实现了数据和存放数据的
物理位置
之间的联系,通常索引提供了快速访问
的方法,因此那些
基于索引列的查询就可以得到性能上的提高。
4.
共享
SQL
语句
提供对执行过的
语句进行高速缓冲的机制。被解析过并且确定了执行路径
的
语句存放在
的共享池中。
执行一个
语句之前每次先从
共享池中查找是否有缓冲的
语句,
如果有则直接执行该
语句。
可以通过适当调整
共享池大小来达到提高
执行性能的目的。
5.
选择最有效率的表名顺序

的解析器按照从右到左的顺序处理
!"
子句中的表名,因此
!"
子句中
写在最后的表
基础表
#$#%&
将被最先处理。
当

处理多个表时,会运用排序及合并的方式连接它们,并且是从右往左的顺
序处理
!"
子句。首先,扫描第一个表
!"
子句中最后的那个表
并对记录进行
排序,然后扫描第二个表
!"
子句中倒数第二个表
,最后将所有从第二个表中检索
出的记录与第一个表中合适记录进行合并。
只在基于规则的优化器中有效。
举例:
表
'(()*+,
条记录
表
'-(
条记录
/*
选 择
TAB2
作 为 基 础 表
(
最 好 的 方 法
)*/SELECT COUNT(*) FROM
TAB1,TAB2/*
执行时间
0.96
秒
*/
/*
选 择
TAB1
作 为 基 础 表
(
不 佳 的 方 法
)*/SELECT COUNT(*) FROM
TAB2,TAB1 /*
执行时间
26.09
秒
*/
如果有
+
个以上的表连接查询
*
那就需要选择交叉表
#%#%
作为基础表
*
交叉表是指那个被其他表所引用的表。
/*
高效的
SQL*/
SELECT * FROM LOCATION L, CATEGORY C, EMP E
WHERE E.EMP_NO BETWEEN 1000 AND 2000AND E.CAT_NO = C.CAT_NOAN
D E.LOCN = L.LOCN
将比下列
更有效率
/*
低效的
SQL*/SELECT * FROM EMP E, LOCATION L, CATEGORY CWHERE
E.CAT_NO = C.CAT_NOAND E.LOCN =
L.LOCNAND E.EMP_NO BETWEEN 1000 AND 2000
6. Where
子句中的连接顺序
采用自下而上或自右向左的顺序解析
子句。根据这个原理
*
表之间的连
接必须写在其他
条件之前,那些可以过滤掉最大数量记录的条件必须写在
子句的末尾。
/*
低效
,
执行时间
156.3
秒
*/SELECT Column1,Column2 FROM EMP E WHERE
E.SAL > 50000 AND E.JOB = 'MANAGER'AND 25 < (SELECT COUNT(*)
FROM EMP WHERE MGR = E.EMPNO)
/*
高效
,
执行时间
10.6
秒
*/SELECT Column1,Column2FROM EMP EWHERE 25
< (SELECT COUNT(*) FROM EMPWHERE MGR=E.EMPNO)AND E.SAL >
50000 AND E.JOB = 'MANAGER'
7. SELECT
子句中避免使用“
*”
在解析
语句的时候,对于“
./
将通过查询数据库字典来将其转换成对应的
列名。
如果在
子句中需要列出所有的
01%
时,建议列出所有的
01%
名称,
而不是简单的用“
./
来替代,这样可以减少多于的数据库查询开销。
8.
减少访问数据库的次数
当执行每条
语句时
*
在内部执行了许多工作:解析
语句
估算索
引的利用率
绑定变量
读数据块等等
由此可见
*
减少访问数据库的次数
*
就能实际上减少

的工作量。
9.
整个简单无关联的数据库访问
如果有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没
有关系),以减少多于的数据库
开销。
虽然采取这种方法,效率得到提高,但是程序的可读性大大降低,所以还是要权衡之间
的利弊。
10.
使用
Truncate
而非
Delete
表 中 记 录 的 时 候 ,
会 在

段 中 保 存 删 除 信 息 以 备 恢 复 。
0%
删除表中记录的时候不保存删除信息,不能恢复。因此
0%
删除记录
比
快,而且占用资源少。
删除表 中记录的 时候, 如果不需 要 恢 复的情况 之下应 该 尽量使用
0%
而不是
。
0%
仅适用于删除全表的记录。
11.
尽量多使用
COMMIT
只要有可能
*
在程序中尽量多使用
""*
这样程序的性能得到提高
*
需求也会因为
""
所释放的资源而减少。
""
所释放的资源:
of 9
免费下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜