没有合适的资源?快使用搜索试试~ 我知道了~
首页OracleSql脚本书写规范
资源详情
资源评论
资源推荐
SQL 书写规范
1 SQL 书写规范.................................................................................................................................2
1.1 选择最有效率的表名顺序(只在基于规则的优化器中有效)..........................................2
1.2 where 子句中的连接顺序...................................................................................................3
1.3 @Select 子句中避免使用'*'................................................................................................4
1.4 减少访问数据库的次数......................................................................................................4
1.5 使用 decode 函数来减少处理时间.....................................................................................5
1.6 用 where 子句替换 having 子句..........................................................................................6
1.7 减少对表的查询..................................................................................................................6
1.8 使用表的别名(alias)............................................................................................................7
1.9 @用 exists 替代 in...............................................................................................................8
1.10 @用 not exists 替代 not in.................................................................................................8
1.11 @用表连接替换 exists......................................................................................................9
1.12 > 及 < 操作符(大于或小于操作符),尽量使用大于等于.....................................10
1.13 @用 exists 替换 distinct...................................................................................................10
1.14 @使用 union-all 和 union................................................................................................10
1.15 用索引提高效率..............................................................................................................11
1.15.1 索引的操作...........................................................................................................12
1.15.2 建立索引...............................................................................................................13
1.15.3 索引失效:...........................................................................................................14
1.15.3.1 IN、OR 子句常会使用工作表,使索引失效。....................................14
1.15.3.2 使用 IS NULL 或 IS NOT NULL,使索引失效.....................................14
1.15.3.3 @条件字段使用函数和表达式................................................................15
1.15.3.4 @比较不匹配的数据类型........................................................................15
1.15.3.5 带通配符(%)的 like 语句....................................................................16
1.15.3.6 Order by 语句............................................................................................16
数据库的优化通常可以通过对网络、硬件、操作系统、数据库参数和应用
程序的优化来进行。最常见的优化手段就是对硬件的升级。根据统计,对网络、
硬件、操作系统、数据库参数进行优化所获得的性能提升,全部加起来只占数
据库系统性能提升的40%左右,其余的60%系统性能提升来自对应用程序的优
化。许多优化专家认为,对应用程序的优化可以得到80%的系统性能的提升。
因此,在此整理一些SQL书写规范,以期通过优化SQL达到提升系统性能的目的。
1 SQL 书写规范
1.1 选择最有效率的表名顺序(只在基于规则的优化器中有
效)
ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中的表名,因此
FROM 子句中写在最后的表(基础表 driving table)将被最先处理. 在 FROM 子
句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当
ORACLE 处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表
(FROM 子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM 子
句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适
记录进行合并.
Joet 注:栈
例如:
表 TAB1 16,384 条记录
表 TAB2 1 条记录
选择 TAB2 作为基础表 (最好的方法)
select count(*) from tab1,tab2 执行时间 0.96 秒
选择 TAB1 作为基础表 (不佳的方法)
select count(*) from tab2,tab1 执行时间 26.09 秒
如果有 3 个以上的表连接查询, 那就需要选择交叉表(intersection table)作为
基础表, 交叉表是指那个被其他表所引用的表.
例如:
EMP 表描述了 LOCATION 表和 CATEGORY 表的交集.
SELECT *
FROM LOCATION L ,
CATEGORY C,
EMP E
WHERE E.EMP_NO BETWEEN 1000 AND 2000
AND E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN
将比下列 SQL 更有效率
SELECT *
FROM EMP E ,
LOCATION L ,
CATEGORY C
WHERE E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN
AND E.EMP_NO BETWEEN 1000 AND 2000
1.2 where 子句中的连接顺序
Oracle采用自下而上的顺序解析where子句
根据这个原理,表之间的连接必须写在其他where条件之前,那些可以过滤
掉最大数量记录的条件必须写在where子句的末尾
例如:
(低效,执行时间156.3秒)
select *
from emp e
where sal > 50000
and job = 'manager'
and 25 < (select count(*) from emp where mgr=e.empno);
(高效,执行时间10.6秒)
select *
from emp e
where 25 < (select count(*) from emp where mgr=e.empno)
and sal > 50000
and job = 'manager';
1.3 @Select 子句中避免使用'*'
当你想在select子句中列出所有的column时,使用动态sql列引用'*'是一个
方便的方法,不幸的是,这是一个非常低效的方法
实际上,oracle在解析的过程中,会将'*'依次转换成所有的列名
这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间
1.4 减少访问数据库的次数
当执行每条sql语句时,oracle在内部执行了许多工作:解析sql语句,估算
索引的利用率,绑定变量,读数据块等等
由此可见,减少访问数据库的次数,就能实际上减少oracle的工作量
Joefit注:是否可以认为是减少select子句的数量
例如:
以下有两种方法可以检索出雇员号等于0342或0291的职员
方法1 (低效)
select emp_name, salary, grade
from emp
where emp_no = 342;
select emp_name, salary, grade
from emp
where emp_no = 291;
剩余15页未读,继续阅读
karmong
- 粉丝: 0
- 资源: 21
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- stc12c5a60s2 例程
- Android通过全局变量传递数据
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0