作为一个开发人员,我们也许不会接触到复杂sql的操作,按照Tom大叔的话,我们大部分开发人员把数据库当做了一个黑盒子,而且神秘不可控制。如果老是这样的想的话,恐怕迟早有一天我们会被社会淘汰。如今,精明的DBA都在向应用靠拢了,我们这些应用程序员当然也需要加强在数据库的知识,兴许有一天你会很牛,但说起数据库你一问三不知,会被人笑道的。
今天参加了公司组织的一个简短的oracle的培训,讲师是oracle的资深专家,讲的还可以,也顺便让我复习了一下一些基本的概念。
当用户在客户端(sqlplus,java 程序,pl/sql)提交了一个查询后,过了一会就返回一些结果回来了,这个过程是那么神奇,那么后台(oracle server)都干了些什么了?接下来的一些过程会让我们清楚的了解到oracle做了些什么,但是在解释这些过程之请,先回顾一下基本概念。
oracle是什么,没启动之前,他就是一推文件,数据文件,参数文件,日志文件...。启动了后就是文件+进程+内存了,这就是oracle instance。至于文件有那些文件,进程有哪些进程,内存又有那些分类,这里不详细列出了,只说一下和本文有关系的一些。
- 共享池-shared Pool。顾名思义,这个东东是oracle在运行期间共享一些东西的地方,它包括数据字典,一些参数,以及最重要的一些oracle程序。比如我们提交的查询在完成解析之前,会搜索共享池看是否有完成的查询,如果有的话,直接就用这个了。
如果在共享池中找不到和我们一样的查询,那么oracle就开始解析这个查询了,接下来oracle会做哪些事情呢?先看看这个图:
在上图中,其中的消耗最大的是parse阶段。在上图中我不打算深入的了解具体每一步是在干什么,因为本文的目的是关于优化的。默认情况下,oracle会在parse后有一个优化器,这个优化器会去根据一些数据判断后生成一个执行计划,这个执行计划才是我们关注的东西。
影响一个查询优化器的一些因素有:访问路径,join顺序,join方法。
其中访问路径有以下几种:全表扫描、rowid扫描、索引扫描、聚簇扫描、hash扫描。
join方法有以下几种:
- Nested-loop join。内部嵌套,适合驱动表数据量不大,被驱动表有索引的连接。
- Hash join。适合一个大表一个小表的连接。
- Sort-merge join。适合没有索引,但是数据已经排好序了的。
其中hash join是一种效率相对比较高的连接方式尤其适合一个大表和一个小表连接的时候。
更多的关于hash join参考http://www.hellodba.com/Doc/Oracle_Hash_Join.htm
查询优化器的输出是一个执行计划,这个执行计划就是我们衡量一个查询的的相对指标,为什么说是一个相对指标呢?同样的一个业务查询,由于我们的连接方式不同,索引使用的不同会产生不同的查询计划,通过不同的查询计划可以看到谁的效率更高。但是此业务查询和彼业务查询的查询计划是没有可比性的,数据来源,数据逻辑都不一样嘛。
查询计划是优化器的输出,这个输出是优化器自己对多种计划比较后的最优化结果。先来看看查询计划是个什么东东吧,以便有个感性的认识。
上图是我在pl/sql developer中一个查询计划的截图。
查询计划就是优化器在执行sql时一系列的步骤。我们有很多种方式查看查询计划:
- EXPLAIN PLAN命令
- SQLPLUS的autotrace
- V$SQL_PLAN视图
- Automatic Workload Repository:10g的一个新工具
- SQL TRACE
- Statspack
- 以及一些客户端工具,比如pl/sql developer
有了查询计划我们可以通过计划查看我们为表建立的索引是否管用,是否使用了我们所期待的索引,是否按照我们期待连接方式去连接,如果不一样的话那么我们就需要调整了。先解释一下上图中的解释计划。解释计划中缩进最多的是最里层,也就是最先执行的部分。
- 使用索引IDX_EMP扫描emp表,这样获取到了rowid。
- 使用索引IDX_EMP_S扫描emp_salary表。
- 做一个nested loop的连接
- 再通过rowid访问emp_salary过滤id为1001的。
这样看也许还不是很直接的感受执行计划,如果使用hints的话会直观的感受执行计划的改变。
很显然,通过hints,执行计划马上就变了,cost成本上升很快。
更过关于hints的信息,参考http://www.dba-oracle.com/t_sql_hints_tuning.htm
以上的部分只是作为一个检验我们的sql的手段,真正的一些优化手段很多很多,具体根据业务而定,但是每一种手段都有他的利弊,适用条件,学习的时候切勿囫囵吞枣,否则只会越优化越差了。
- 大小: 39.7 KB
- 大小: 21.1 KB
- 大小: 40.6 KB
- 大小: 32.2 KB
- 大小: 28.1 KB
分享到:
相关推荐
【超易懂实用,初学者必看】oracleSQL优化培训,由企业dba切身实际经验总结,超简单易懂超实用,初入门者不看必后悔!!
详细介绍sql执行原来,SQL优化实例和技巧
oracleSQL优化培训(精华整理)(ppt文档).pptx
大量优化实战方法:将主要SQL优化点一一剖析,分享大量SQL优化的实际工作经验 50余改写调优案例:覆盖大多数DBA日常工作场景,具有相当大的实用价值 技巧+案例:可以作为DBA的参考手册,也可以作为开发人员编写SQL...
ORACLE培训SQL性能优化.pptx
ppt详细的介绍了oracle的sql语句性能优化知识,图文并茂,欢迎大家下载
Oracle高级SQL培训与讲解.doc
oracle性能优化高级培训,硬件-->体系结构-->SQL--->索引优化---->等待事件--->跟踪
教主Oracle SQL高级查询优化改写完美培训视频 2.0版,这个我参与培训的,包含视频、SQL文件、教学文档内容完整,分享给大家学习,共同努力进阶转型开发DBA,人称教主,做sql改写十多年了,sql改写功底很强!
Oracle数据库SQL培训 数据库SQL语句编写培训教程 Oracle高级查询SQL优化 集合实际案例讲解 【大纲】 一、高级查询 上期数\上年数\同比\环比 当年累计数 单位占比 单位排名\前N名\后N名 二、SQL优化 什么时候创建...
Oracle SQL 性能优化培训教材,是面向程序员的培训教材,主要讲解程序SQL优化方面的技巧和实例说明,非DB方面
《基于Oracle的SQL优化》...《基于Oracle的SQL优化》适用于使用Oracle数据库的开发人员、OracleDBA和其他对Oracle数据库感兴趣的人员,也可以作为各院校相关专业的教学辅导和参考用书,或作为相关培训机构的培训教材。
《基于Oracle的SQL优化》...《基于Oracle的SQL优化》适用于使用Oracle数据库的开发人员、OracleDBA和其他对Oracle数据库感兴趣的人员,也可以作为各院校相关专业的教学辅导和参考用书,或作为相关培训机构的培训教材。
该培训资料中包括5大内容块: 1>Oracle分区技术及大数据量操作性能优化 2>Oracle性能问题一般解决思路 3>Oracle常用hint 4>Oracle动态图 5>Oracle执行计划和SQL调优
oracle sql 优化精华,公司数据库工程师总结及优化培训资料。
ORACLE培训SQL性能优化.ppt
,表之间的关联,如何得到SQL执行计划,如何分析执行计划等内容,从而由浅到深的方式了解SQL优化的过 程,使大家逐步掌握SQL优化。目录: 优化基础知识 性能调整综述 有效的应用设计 SQL语句的处理过程 Oracle...
Oracle高级SQL培训与讲解
ORACLE_SQL性能优化方法,内部培训资料,共200个ppt页,涵盖sql性能优化的方方面面
主要介绍与SQL调整有关的内容,内容涉及多个方面: 1.SQL语句执行的过程 2.ORACLE优化器 3.表之间的关联 4.如何得到SQL执行计划 5.如何分析执行计划等内容