`

转:ORACLE SQL TUNING

阅读更多

 转载

 

ORACLE SQL TUNING  

 

一.优化器模式

   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语句的方法有如下几种:

              1SQL TRACE10046跟踪某个模块。

              2PERFSTAT性能统计包,使用方法见附录二。

              3V$SQLV$SESSION_WAITV$SQL_TEXT

五.如何查看执行计划

       查看SQL语句的执行计划有以下几种:

       1Set autotrace on(set autotrace traceonly exp)

       2Explain plan for …..

              @?/rdbms/admin/utlxpls.sql

       3V$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表是否可以被CacheHash_area_size的大小将决定Hash Join的主要成本。可以看出Hash Join成本返回集合并没有直接的关系,所以当返回结果集比较大的时候一般具有较好的性能。

 

为了加快hash join的速度,可以调大hash_area_sizepga_aggregate_target(默认为25M)的值。

 

 

c)      Sort Merge join

 

每一个Row SourceJoin列上均排序。

    然后两个排序后的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);

 

 

2Indexes 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

    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 ...

    oracle sql_tuning

    SQL_Tuning是Oracle官方提供的一个专题,旨在帮助管理员和开发人员优化SQL查询,从而提高数据库的效率和响应时间。以下是一些关于"Oracle SQL Tuning"的重要知识点: 1. **SQL执行计划**:SQL执行计划是Oracle解析...

    oracle sqltuning workshop

    在这个"Oracle SQLTuning Workshop"中,虽然资料可能源自2004年,但它依然包含了许多至今仍具价值的基础知识和实践经验。以下是一些核心知识点的详细说明: 1. **SQL基础**:SQL(结构化查询语言)是用于管理和处理...

    Oracle SQL Tuning.pdf

    本文将基于“Oracle SQL Tuning”这一主题,深入探讨Oracle SQL调优的核心概念、策略及实践方法。 一、SQL语句处理概览 SQL语句的执行效率对数据库性能有决定性影响。在Oracle环境中,SQL语句的处理流程主要包括...

    使用ORACLE SQL Tuning advisor快速优化低效的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,Oracle SQL Tuning with Oracle SQLTXPLAIN

    Oracle 12C SQL Tuning for Developers

    2. **自动SQL调优**:Oracle 12C引入了Automatic SQL Tuning,它自动识别性能瓶颈并提出优化建议。通过Advisor工具,如SQL Tuning Advisor,系统会分析SQL语句并提供改进建议,如创建索引、重写查询或调整绑定变量。...

    Oracle SQL Tuning Pocket Reference

    ### Oracle SQL Tuning Pocket Reference 知识点解析 #### 一、引言 《Oracle SQL Tuning Pocket Reference》是一本由 Mark Gurry 编写的快速参考指南书籍,旨在为 Oracle SQL 的调优提供实用建议与策略。该书不是...

    Oracle 9i database:advanced instance tuning

    ### Oracle 9i 数据库:高级实例调优 #### 知识点概览: 1. **Oracle 9i 数据库架构概述** 2. **数据库实例的组成部分** 3. **性能监控与诊断工具** 4. **SQL 语句优化技术** 5. **内存管理与调整策略** 6. **等待...

    Oracle SQL Tuning with Oracle SQLTXPLAIN(Apress,2013)

    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 Tuning详解 #### 一、Oracle SQL性能调优概述 在Oracle数据库管理中,SQL性能调优是一项至关重要的任务,它直接影响到应用程序的响应时间和系统的整体性能。SQL性能调优通常涉及对SQL语句进行分析...

    Oracle Database 11g: SQL Tuning Workshop

    根据所提供的文件内容,该文件名为《Oracle Database 11g: SQL Tuning Workshop》学生指南,其版号为D52163GC20,第二版,发布于2010年10月。它是由Oracle公司内部和Oracle学院专用发布的文档。文件中提到了该指南的...

    ORACLE SQL PERFORMANCE TUNING AND OPTIMIZATION

    《Oracle SQL Performance Tuning and Optimization》是一本专为数据库管理员和开发人员设计的指南,旨在帮助读者深入理解如何优化Oracle数据库中的SQL查询性能。这本书详细介绍了Oracle SQL调优的各个方面,包括...

    SQL Tuning Advisor使用总结

    SQL Tuning Advisor(STA)是Oracle数据库中的一个强大工具,用于优化SQL语句的性能。通过自动化的诊断过程,STA能够帮助数据库管理员(DBA)识别出低效的SQL语句,并提供改进建议。本文将详细介绍如何利用SQL ...

    SQL Tuning使用指南

    **SQL Tuning** 是一种专为 **Oracle 数据库** 设计的强大工具,用于分析、测试和优化 SQL 语句,旨在提高应用系统的整体性能。该工具覆盖了数据库应用的各个阶段:开发、试运行以及生产阶段。 ##### 功能特点: - ...

    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.pdf

    ### Oracle SQL Tuning with Oracle SQLTXPLAIN #### 引言 本书旨在介绍一款非常有用的工具——Oracle SQLTXPLAIN(简称SQLT)。对于从事Oracle数据库优化的人员来说,SQLT是必不可少且极为实用的一款工具,更重要...

    Tosska SQL Tuning Expert for Oracle

    《Tosska SQL Tuning Expert for Oracle:解锁Oracle数据库性能优化的艺术》 Oracle数据库系统作为全球广泛使用的数据库管理系统,其性能优化是系统管理员和DBA(数据库管理员)至关重要的任务。Tosska SQL Tuning ...

    高清完整版 Oracle 高性能SQL引擎剖析SQL优化与调优机制详解

    例如,SQL Tuning Advisor工具,它可以帮助用户自动诊断SQL性能问题并提供调优建议。使用SQL Advisor时,可以设置优化目标,比如减少资源消耗或者缩短响应时间。另外,Oracle还提供了统计信息的收集与管理,这些统计...

    Apress Oracle SQL Tuning with Oracle SQLTXPLAIN 2013

    《Apress Oracle SQL Tuning with Oracle SQLTXPLAIN 2013》这本书是关于使用Oracle提供的工具SQLTXPLAIN来优化SQL语句的专业指南。SQL优化是提高数据库性能的关键环节,而本书深入介绍了如何分析和解决Oracle SQL...

Global site tag (gtag.js) - Google Analytics