一.优化器模式
ORACLE的优化器共有3种:
a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性)
为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须定期更新统计信息,以保证数据库中的对象统计信息(object statistics)的准确性.
如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关. 如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器。
二.访问Table的方式
ORACLE 采用两种访问表中记录的方式:
a. 全表扫描
全表扫描就是顺序地访问表中每条记录. ORACLE采用一次读入多个数 据块(database block)的方式优化全表扫描。
b. 索引扫描
你可以采用基于ROWID的访问方式情况,提高访问表的效率, ROWID包含了表中记录的物理位置信息.ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系. 通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高.
其中ORACLE对索引又有两种访问模式.
a)索引唯一扫描 ( INDEX UNIQUE SCAN)
大多数情况下, 优化器通过WHERE子句访问INDEX.
例如:
表LOADING有两个索引 : 建立在LOADING列上的唯一性索引LOADING_PK和建立在MANAGER列上的非唯一性索引IDX_MANAGER.
SELECT loading
FROM LOADING
WHERE LOADING = ‘ROSE HILL’;
在内部 , 上述SQL将被分成两步执行, 首先 , LOADING_PK 索引将通过索引唯一扫描的方式被访问 , 获得相对应的ROWID, 通过ROWID访问表的方式执行下一步检索.
如果被检索返回的列包括在INDEX列中,ORACLE将不执行第二步的处理(通过ROWID访问表). 因为检索数据保存在索引中, 单单访问索引就可以完全满足查询结果.
下面SQL只需要INDEX UNIQUE SCAN 操作.
SELECT LOADING
FROM LOADING
WHERE LOADING = ‘ROSE HILL’;
b)索引范围查询(INDEX RANGE SCAN)
适用于两种情况:
1. 基于一个范围的检索
2. 基于非唯一性索引的检索
例1:
SELECT LOADING
FROM LOADING
WHERE LOADING LIKE ‘M%’;
WHERE子句条件包括一系列值, ORACLE将通过索引范围查询的方式查询LODGING_PK . 由于索引范围查询将返回一组值, 它的效率就要比索引唯一扫描
低一些.
例2:
SELECT LOADING
FROM LOADING
WHERE MANAGER = ‘BILL GATES’;
这个SQL的执行分两步, IDX_MANAGER的索引范围查询(得到所有符合条件记录的ROWID) 和下一步同过ROWID访问表得到LOADING列的值. 由于IDX_MANAGER是一个非唯一性的索引,数据库不能对它执行索引唯一扫描.
由于SQL返回LOADING列,而它并不存在于IDX_MANAGER索引中, 所以在索引范围查询后会执行一个通过ROWID访问表的操作.
WHERE子句中, 如果索引列所对应的值的第一个字符由通配符(WILDCARD)开始, 索引将不被采用.
SELECT LOADING
FROM LOADING
WHERE MANAGER LIKE ‘%HANMAN’;
在这种情况下,ORACLE将使用全表扫描.
三.SQL调优的本质就是调整执行计划。
在好多情况下,oracle自动选择的执行计划并不是最优的,这时需要我们人工去干预。(什么是执行计划?)
对SQL调优基本步骤:
a) 捕获SQL语句
b) 产生SQL语句的执行计划;
c) 验证统计信息(SQL语句涉及到的表格是否做过分析),表格信息(结果集的记录数,索引),字段上面数据分布特点
d) 通过手工收集到的信息,形成自己理想的执行计划。
e) 如果做过分析,则重新分析相关表格或者做柱状图分析。
f) 如果没有做过分析,则通过尝试不同的Hint,从而获得合适的执行计划。
g) 当我们正常无法调优到位时,可以打开10053事件打开优化器的跟踪,看看Oracle如何选择的.
alter session set events='10053 trace name context forever,level 2';
四.如何捕获SQL语句
捕获SQL语句的方法有如下几种:
1.SQL TRACE或10046跟踪某个模块。
2.PERFSTAT性能统计包,使用方法见附录二。
3.V$SQL,V$SESSION_WAIT,V$SQL_TEXT
五.如何查看执行计划
查看SQL语句的执行计划有以下几种:
1.Set autotrace on(set autotrace traceonly exp)
2.Explain plan for …..
@?/rdbms/admin/utlxpls.sql
3.V$SQL_PLAN视图
column operation format a16
column "Query Plan" format a60
column options format a15
column object_name format a20
column id format 99
select id,lpad(' ',2*(level-1))||operation||' '||options||' '||object_name||' '
||decode(id,0,'Cost = '||position) "Query Plan"
from (select *
from v$sql_plan
where address='&a') sql_plan
start with id = 0
connect by prior id = parent_id
/
4.第三方工具,如pl/sql developer,TOAD
六.SQL语句主要的连接方法
a) Nested-loop join
适合于小表(几千条,几万条记录)与大表做联接
在联接列上有索引。
分内表和外表(驱动表),靠近from子句的是内表。从效率上讲,小表应该作外表,大表应该作内表,即大表查询时走索引。
COST= Access cost of A(驱动表) + (access cost of B * number of rows from A)
成本计算方法:
设小表100行,大表100000行。
两表均有索引:
如果小表在内,大表在外(驱动表)的话,则扫描次数为:
100000+100000*2 (其中2表示IO次数,一次索引,一次数据)
如果大表在内,小表在外(驱动表)的话,则扫描次数为:
100+100*2.
两表均无索引:
如果小表在内,大表在外的话,则扫描次数为:
100000+100*100000
如果大表在内,小表在外的话,则扫描次数为:
100+100000*100
注意:如果一个表有索引,一个表没有索引,ORACLE会将没有索引的表作驱动表。如果两个表都有索引,则外表作驱动表。如果两个都没索引的话,则也是外表作驱动表。
基本的执行计划如下所示:
NESTED LOOPS
TABLE ACCESS (BY ROWID) OF our_outer_table
INDEX (..SCAN) OF outer_table_index(….)
TABLE ACCESS (BY ROWID) OF our_inner_table
INDEX (..SCAN) OF inner_table_index(….)
b) Hash join
适合于大表与大表,小表(几十万,几百万)与大表之间的联连。
联接列上不需要索引。
基本执行计划如下:
HASH JOIN
TABLE ACCESS (….) OF tableA
TABLE ACCESS (….) OF tableB
cost= (access cost of A * number of hash partitions of B) + access cost of B
可以看出主要成本在于A表是否可以被Cache。Hash_area_size的大小将决定Hash Join的主要成本。可以看出Hash Join的成本和返回集合并没有直接的关系,所以当返回结果集比较大的时候一般具有较好的性能。
为了加快hash join的速度,可以调大hash_area_size和pga_aggregate_target(默认为25M)的值。
c) Sort Merge join
每一个Row Source在Join列上均排序。
然后两个排序后的Row Source合并后,作一个结果集返回。
Sort/Merge Join仅仅对equal Join有效。
基本执行计划
MERGE (JOIN)
SORT (JOIN)
TABLE ACCESS (….) OF tableA
SORT (JOIN)
TABLE ACCESS (….) OF tableB
cost= access cost of A + access cost of B +(sort cost of A + sort cost of B)
可以看出Sort的成本是Merge Join的主要构成部分。这样sort_area_size的大小将很大程度决定Merge Join的大小。同样如果A表或者B表已经经过排序的,那么Merge Join往往具有很好的性能。其不会走索引。
没有驱动表的概念,即时响应能力较差。
七.一般情况下最常见的5种问题
1. Statement not written for indexes
|
25%
|
2. Indexes are missing or inappropriate
|
16%
|
3. Use of single-column index merge
|
15%
|
4. Misuse of nested loop, sort merge, or hash join
|
12%
|
5. Misuse of IN, EXISTS, NOT IN, NOT EXISTS, or table joins
|
8%
|
不过在我们这里,最常见的问题是在第2条,第3条,第4条。
1.Statement not written for indexes
类似于这样的:
SELECT account_name, trans_date, amount
FROM transaction
WHERE SUBSTR(account_name,1,7) = ' CAPITAL';
WHERE account_name LIKE 'CAPITAL%';
Account_date 日期
To_char(Account_date,’YYYY-MM-DD:HH24:MI:SS’)=’200508XXX’;
Account_date=to_date(‘200508….’,’yyyy-mm-dd);
2.Indexes are missing or inappropriate
例如REP_C021中有这样一句:
select SUBSIDIARYID,260,' 300电话卡',
sum(decode(feetype, 1, ceil(duration / 60))) +
sum(decode(feetype, 0, ceil(duration / 60))),
sum(decode(feetype, 1, ceil(duration / 60))),
sum(decode(feetype, 0, ceil(duration / 60))),0
from cardsusage200508 a, service b
where a.caller = b.servicecode and
(b.property = i_property or i_property is null) and
a.cdrtype = 102
group by SUBSIDIARYID, 260, ' 300电话卡';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=RULE
1 0 SORT (GROUP BY)
2 1 NESTED LOOPS
3 2 TABLE ACCESS (FULL) OF 'CARDSUSAGE200508'
分享到:
相关推荐
Oracle SQL Tuning with Oracle SQLTXPLAIN: Oracle Database 12c Edition by Stelios Charalambides English | 8 May 2017 | ISBN: 1484224353 | 408 Pages | PDF | 24.39 MB Learn through this practical guide ...
SQL_Tuning是Oracle官方提供的一个专题,旨在帮助管理员和开发人员优化SQL查询,从而提高数据库的效率和响应时间。以下是一些关于"Oracle SQL Tuning"的重要知识点: 1. **SQL执行计划**:SQL执行计划是Oracle解析...
在这个"Oracle SQLTuning Workshop"中,虽然资料可能源自2004年,但它依然包含了许多至今仍具价值的基础知识和实践经验。以下是一些核心知识点的详细说明: 1. **SQL基础**:SQL(结构化查询语言)是用于管理和处理...
本文将基于“Oracle SQL Tuning”这一主题,深入探讨Oracle SQL调优的核心概念、策略及实践方法。 一、SQL语句处理概览 SQL语句的执行效率对数据库性能有决定性影响。在Oracle环境中,SQL语句的处理流程主要包括...
使用ORACLE SQL Tuning advisor快速优化低效的SQL语句, 这里是一个使用范例,有9个步骤, 后面 其他语句,都按照这个步骤来做就可以了。
Oracle SQL Tuning with Oracle SQLTXPLAIN,Oracle SQL Tuning with Oracle SQLTXPLAIN,Oracle SQL Tuning with Oracle SQLTXPLAIN
2. **自动SQL调优**:Oracle 12C引入了Automatic SQL Tuning,它自动识别性能瓶颈并提出优化建议。通过Advisor工具,如SQL Tuning Advisor,系统会分析SQL语句并提供改进建议,如创建索引、重写查询或调整绑定变量。...
### Oracle SQL Tuning Pocket Reference 知识点解析 #### 一、引言 《Oracle SQL Tuning Pocket Reference》是一本由 Mark Gurry 编写的快速参考指南书籍,旨在为 Oracle SQL 的调优提供实用建议与策略。该书不是...
### Oracle 9i 数据库:高级实例调优 #### 知识点概览: 1. **Oracle 9i 数据库架构概述** 2. **数据库实例的组成部分** 3. **性能监控与诊断工具** 4. **SQL 语句优化技术** 5. **内存管理与调整策略** 6. **等待...
Oracle SQL Tuning with SQLTXPLAIN is a practical guide to SQL tuning the way Oracle's own experts do it, using a freely downloadable tool called SQLTXPLAIN. Using this simple tool you'll learn how to ...
### Oracle SQL Tuning详解 #### 一、Oracle SQL性能调优概述 在Oracle数据库管理中,SQL性能调优是一项至关重要的任务,它直接影响到应用程序的响应时间和系统的整体性能。SQL性能调优通常涉及对SQL语句进行分析...
根据所提供的文件内容,该文件名为《Oracle Database 11g: SQL Tuning Workshop》学生指南,其版号为D52163GC20,第二版,发布于2010年10月。它是由Oracle公司内部和Oracle学院专用发布的文档。文件中提到了该指南的...
《Oracle SQL Performance Tuning and Optimization》是一本专为数据库管理员和开发人员设计的指南,旨在帮助读者深入理解如何优化Oracle数据库中的SQL查询性能。这本书详细介绍了Oracle SQL调优的各个方面,包括...
SQL Tuning Advisor(STA)是Oracle数据库中的一个强大工具,用于优化SQL语句的性能。通过自动化的诊断过程,STA能够帮助数据库管理员(DBA)识别出低效的SQL语句,并提供改进建议。本文将详细介绍如何利用SQL ...
**SQL Tuning** 是一种专为 **Oracle 数据库** 设计的强大工具,用于分析、测试和优化 SQL 语句,旨在提高应用系统的整体性能。该工具覆盖了数据库应用的各个阶段:开发、试运行以及生产阶段。 ##### 功能特点: - ...
3本经典oracle sql性能优化的的书,值得一看: Oracle.High.Performance.Tuning.for.9i.and.10g.chm Oracle性能优化技术内幕.pdf SQL Performance Tuning -0201791692.chm
### Oracle SQL Tuning with Oracle SQLTXPLAIN #### 引言 本书旨在介绍一款非常有用的工具——Oracle SQLTXPLAIN(简称SQLT)。对于从事Oracle数据库优化的人员来说,SQLT是必不可少且极为实用的一款工具,更重要...
《Tosska SQL Tuning Expert for Oracle:解锁Oracle数据库性能优化的艺术》 Oracle数据库系统作为全球广泛使用的数据库管理系统,其性能优化是系统管理员和DBA(数据库管理员)至关重要的任务。Tosska SQL Tuning ...
例如,SQL Tuning Advisor工具,它可以帮助用户自动诊断SQL性能问题并提供调优建议。使用SQL Advisor时,可以设置优化目标,比如减少资源消耗或者缩短响应时间。另外,Oracle还提供了统计信息的收集与管理,这些统计...
《Apress Oracle SQL Tuning with Oracle SQLTXPLAIN 2013》这本书是关于使用Oracle提供的工具SQLTXPLAIN来优化SQL语句的专业指南。SQL优化是提高数据库性能的关键环节,而本书深入介绍了如何分析和解决Oracle SQL...