版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、广告 落落教你征服SQL优化 郑重承诺:无效退款究竟有哪些DBA?开发DBA运维DBA打杂DBAORACLE专家/技术顾问开发DBA是干嘛的?l参与数据库设计,或者审核数据库设计 。记住性能是设计出来的,而不是调出来的l配合应用系统架构师,纠正架构师所犯的错误,高级开发DBA也承担了部分架构师职责l定制数据库开发规范,表名字不能乱取,SQL/存储过程/函数不能乱写,必须要符合规范l审核开发人员编写的SQL,是否符合数据库规范,并且要纠正存在的性能问题l编写复杂的SQL,编写复杂的存储过程l对整个数据库进行高效的设计与规划,通常要与运维DBA配合lORACLE日常管理与维护,表空间容量规划,数据
2、库对象管理,性能监控51JOB初中级开发DBA招聘要求51JOB资深开发DBA招聘要求开发DBA待遇初级开发DBA月薪8K-12K 一般待遇10K左右中级开发DBA月薪12K-20K 一般待遇15K左右资深开发DBA月薪18K-30K 一般待遇25K左右哪些人好转开发DBA?SQL/PLSQL开发人员JAVA/.NET开发人员ORACLE初学者开发DBA晋升?如果有JAVA/.NET背景,可以晋升为系统架构师如果没有JAVA/.NET背景,可以晋升为数据架构师如果不行做系统架构师,可以专门做性能优化工程师如果非常热爱ORACLE,可以学习运维DBA知识,成为ORACLE专家工作案例分享(参与数
3、据库设计)有这样的需求,某个表可能因为一些新来的需求要添加字段,但是这些需求过一段时间又可能撤了。然后过一段时间又可能来一些新需求要添加字段怎么设计数据库?工作案例分享(纠正架构师所犯错误)应用架构师写了一个分页框架代码如下:select * from (select rownum as rn, a.* from (-这里面写SQL-) a) where rn = 1 and rn = 20;大家觉得有没有问题?工作案例分享(纠正架构师所犯错误)正确的分页框架代码如下:select * from (select * from (select a.*, rownum rn from (-这里写S
4、QL-) a) where rownum = 1;验证上诉理论测试环境:ORACLE11gR2create table test as select * from dba_objects;create index idx_object_id on test(object_id);alter table test modify object_id not null;要被分页的语句select object_id, owner, object_name, object_type from test order by object_id desc错误的框架select * from (select
5、rownum as rn, a.* from (select object_id, owner, object_name, object_type from test order by object_id desc) a) where rn = 1 and rn = 20; 正确的框架 select * from (select * from (select a.*, rownum rn from (select object_id, owner, object_name, object_type from test order by object_id desc) a) where rown
6、um = 1;工作案例分享(纠正架构师所犯错误)有某个功能,多个SQL都会调用,应用架构师为了开发人员编写SQL方便,定义了一个自定义的函数,函数里面有5-8个表关联查询,这样这个函数就变成了一个通用功能的函数。开发人员写的SQL类似如下:SELECT f_getsomething(.) FROM 表1SELECT f_getsomething(.) FROM 表2SELECT f_getsomething(.) FROM 表3SELECT f_getsomething(.) FROM 表4同学们觉得架构师的做法是对的还是错误的?工作案例分享(审核开发人员SQL)开发人员写了如下SQL SEL
7、ECTCOUNT(0)FROMPLEFTJOINRONP.ID=R.ID;P 有200W 数据 R 有 100W 数据 ID 列是主键这个SQL第一次跑12秒(物理读),第二次2秒(缓存读)这个SQL有问题没?如何优化?工作案例分享(审核开发人员SQL)请注意ID列是主键既然ID列是主键,那么P与R他们的关系是不是1对1?既然是1对1关系,那么P与R关联之后数据量会不会增大?原始SQL是 P LEFT JOIN R因为是 LEFT JOIN,P与R即使没关联上,也要输出P对不对?所以SQL可以改写为 SELECTCOUNT(0)FROMP;改写之后SQL跑0.1秒更多的优化案例请参考 http
8、:/ view)半连接/反连接什么是标量子查询?标量子查询就是select后面再套一个select的子查询,例如:select deptno, e.ename, e.sal, (select sum(sal) from emp d where d.sal = e.sal) as sum_total from emp e order by 3;上面sql基于scott 同学们想一下,这个SQL有没有性能问题?标量子查询优化回忆一下昨天讲课内容,自定义函数,还有印象没?标量子查询其实与自定义函数一个道理所以上面的标量子查询需要改写,改写sql如下:select deptno, e.ename, e
9、.sal, sum(sal) over(order by sal) from emp e; 标量子查询优化续以后遇到标量子查询如何优化呢?标量子查询是不是select后面套子查询?那么这个子查询是不是有可能返回空?那么标量子查询是不是可以改写为JOIN?注意标量子查询可能返回NULL,那么改写成JOIN就要改写为外连接标量子查询优化续create table a as select * from dba_objects where object_id=900 and object_id (select avg(sal) from emp) emp1, dept where emp1.deptn
10、o = dept.deptno;内联视图优化内联视图同学们写得多吗?大家在写sql的时候,为什么要写内联视图呢?是因为这样写逻辑上清晰,还是因为其他原因?请大家注意啦,如果sql里面有内联视图很可能发生性能问题(待会有案例)内联视图优化续其实不仅仅是内联视图可能出问题写sql的时候,我们还会经常的遇到真正的视图(create view as select)select . from view where .;有时候更变态的是,视图里面还套视图,一直给你套n个视图在oracle ebs/sap/erp系统中经常遇见,要优化这样的sql,必须改代码其实,视图套视图.套一堆的视图,这种设计就是垃圾如
11、果非要这么设计,必须严格测试性能什么是半连接?半连接就是where条件后面有in/exists 这种子查询,例如:select department_namefrom hr.departments deptwhere department_id IN (select department_id from hr.employees emp);上面的sql可以直接在Oracle11gR2 HR账户运行半连接改写上面的SQL其实可以改写为select department_name from hr.departments dept where EXISTS (select null from hr.
12、employees emp where emp.department_id = dept.department_id);上面的SQL的效率与最原始的SQL效率是一样的PS: 怎么判断2个sql效率是否一样? 只要执行计划一样,那么sql的效率就一样其实还可以改写为select distinct department_name from hr.departments dept, hr.employees emp where dept.department_id = emp.department_id;上面的sql效率高吗?利用半连接优化SQL有如下sqlselect distinct a.xx
13、from a,b where a.id=b.id;A 表有100W,B表有300W,A与B是1:n关系A与B是1:n关系,那么是不是A与B关联数据量会远远超过A的100W但是我们最终的结果是从A表出来那么上面的sql写法是不是会导致最终结果排序远远超过100W?改写成半连接select distinct a.xx from a where a.id in (select id from b);改写过后,是不是要排序的数据量小于100W?这样就提升了sql性能辟谣什么时候用in,什么时候用exists网上有很多结论,什么时候用in,什么时候用exists甚至还有一些书籍,什么时候用in,什么时候
14、用exists其实网上的结论,包括某些书籍的结论通通是错误的大家千万不要被迷惑了,这个话题暂时不讲,因为涉及面比较广如果同学们对这个话题敢兴趣,请参考本人博客http:/ in/not exists 这种子查询,例如:select department_name from hr.departments dept where NOT EXISTS (select null from hr.employees emp where emp.department_id = dept.department_id);为什么叫反连接?Why?反连接改写上面的sql能与半连接一样改写吗?select depa
15、rtment_name from hr.departments dept where department_id NOT IN (select department_id from hr.employees emp);上面的sql是对的吗?-错了 正确的改写如下:select department_name from hr.departments dept where department_id NOT IN (select department_id from hr.employees emp where department_id is not null);注意:not in (如果里面有
16、null) 最终结果返回空反连接改写续其实反连接还能进行如下改写:select department_name from hr.departments dept, hr.employees emp where dept.department_id = emp.department_id(+) and emp.department_id is null;原始SQL的意思是不是求出dept与emp无法关联的数据?那么我这里dept与emp进行外连接,没关联的数据是不是返回null?请看红色部分,当我们加了红色过滤条件,是不是求出没关联的数据SQL三段分拆法SQL可以分为3段1.SELECT 部分,重点关注SELECT 部分有没有标量子查询,有没有自定义函数2.FROM 后面,重点关注有没有 内联视图,有没有视图,看有没有进行视图合并3.WHERE 条件部分,看
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度医疗咨询服务正式协议版B版
- 2024年工程人员劳务合作协议模板版B版
- 2024年商业空铺租赁协议细则版B版
- 2024年企业间股权转让标准化协议样本版B版
- 2024年室内隔断装修工程协议标准样式版B版
- 2024专业施工协议模板版B版
- 2024年度35kv电力工程服务协议范本版B版
- 2024年基金公司商业秘密保护合同范本版B版
- 2024年专业协议履行可靠性证明版B版
- 2024年发布:人工智能语音助手开发合同
- 《服务业行销》课件
- 海尔集团物流模式课件
- 生物医药行业大数据应用分析报告
- 成长赛道职业生涯规划
- 医院感染科护士业务学习基本知识
- 注意力训练教案(合集5篇)
- 施工电梯安装(拆卸)安全技术交底
- 2024届湖南衡阳八中高三下学期期末联考数学试题
- 全国优质课一等奖初中七年级上册数学《直线、射线、线段》课件
- 注塑车间总结
- 鲜肉类产品采购供货服务方案投标方案(技术方案)
评论
0/150
提交评论