`

sql trace与执行计划

 
阅读更多

627

----执行计划
oracle在执行一个SQL之前,首先要分析一下语句的执行计划,然后再按执行计划去执行。
分析语句的执行计划的工作是由优化器(Optimizer)来完成的。不同的情况,一条
SQL可能有多种执行计划,但在某一时点,一定只有一种执行计划是最优的,花费时间是最少的。

--oracle优化器
-------------优化器的优化方式--------------------
1、基于规则的优化方式RBO
  遵循oracle内部预定的一些规则,如当一个where子句中的一列有索引时去走索引。
2、基于代价的优化方式CBO
  代价主要指cpu和内存,优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。
--------------------------------------------------

--------------优化器的优化模式--------------------
优化模式包括Rule,Choose,First rows,All rows这四种方式
1、Rule:基于规则的方式
2、Choose:默认,指的是当一个表或索引有统计信息,则走CBO的方式,如果表或索引没统计信息,
          表又不是特别的小,而且相应的列有索引时,那么就走索引,走RBO的方式。
3、First Row:与Choose类似,所不同的是当一个表有统计信息时,它将是以最快的方式返回查询
              的最先的几行,从总体上减少了响应时间。
4、All Rows:基于代价的方式,当一个表有统计信息时,它将以最快的方式返回表的所有的行,从
             总体上提高查询的吞吐量。没有统计信息则走基于规则的方式。
------------------------------------------------------

----------------设定优化模式---------------------
1、instance级别
在init<SID>.ora文件中设置
2、session级别
SQL> ALTER SESSION SET OPTIMIZER_MODE=<Mode>;
3、语句级别
Hint???
SQL> SELECT /*+ RULE */ a.userid, b.name, b.depart_name FROM tf_f_yhda a,
tf_f_depart b WHERE a.userid=b.userid;
----------------------------------------------------

----------------不走索引的原因及解决方案-------------
1、原因
  ♀在Instance级别所用的是all_rows的方式
  ♀的表的统计信息让Oracle 认为在CBO方式下不走索引更合理(最可能的原因)
  ♀的表很小,上文提到过的,Oracle的优化器认为不值得走索引。
2、解决方案
  ♀可以修改init<SID>.ora中的OPTIMIZER_MODE这个参数,把它改为Rule或
    Choose,重起数据库。
  ♀删除统计信息
    SQL>analyze table table_name delete statistics;
  ♀表小不走索引是对的,不用调的。
------------------------------------------------------

------------------相关知识补充-----------------------
1、查看表或索引是否是统计信息
SQL>SELECT * FROM user_tables WHERE table_name=<table_name> AND
num_rows is not null;
SQL>SELECT * FROM user_indexes WHERE table_name=<table_name> AND
num_rows is not null;
备注:user_tables 是个视图,自动过滤Schema.

2、用CBO方式,要及时更新表和索引的统计信息,以免生成不切合实际的执行计划
SQL> ANALYZE TABLE table_name COMPUTE STATISTICS;
SQL> ANALYZE INDEX index_name ESTIMATE STATISTICS;
-----------------------------------------------------


--执行计划解读
    1、Oracle用来运行一个语句的步骤就叫做执行计划(execution plan),执行计划包
       含了语句所涉及的每个表的访问路径和连接顺序。
    2、查看执行计划:在Sql window中,输入要执行的sql语句,然后按 F5 可以得到执行计划
    3、解读顺序:按照从里到外,从上到下的次序解读分析的结果

-------------------Full Table Scans(全表扫描)----------------
    Oracle 的I/O 是针对数据块的,通常一个数据块中存储着多条记录,被请
求的记录要么聚集在少数几个块中,要么分散在大量的数据块中。而oracle 对某个表
进行全表扫描时,究竟应该读哪些数据块是根据全表扫描范围的标记-HWM(High
Water Mark) 进行的。
    全表扫描将读取HWM 之下的所有数据块,访问表中的所有行,每一行都要经
WHERE 子句判断是否满足检索条件。当Oracle 执行全表扫描时会按顺序读取每个块
且只读一次,因此如果能够一次读取多个数据块,可以提高扫描效率,初始化参数
DB_FILE_MULTIBLOCK_READ_COUNT 用来设置在一次I/O 中可以读取数据块的
最大数量。
    当一个表被大量删除记录之后,HWM 下面的大量数据块是空的,此时若对此表进
行全表扫描,Oracle 仍然会读到HWM 位置,会对全表扫描的性能产生极坏的影响。

1、无可用索引
SELECT last_name, first_name FROM employees WHERE UPPER(last_name)='TOM'
create index index_name on employees(UPPER(last_name));
2、大量数据
   如果优化器认为查询将访问表中绝大多数的数据块,此时就算索引可用,也会全表扫描
3、小表
   如果一个表HWM 之下的数据块比DB_FILE_MULTIBLOCK_READ_COUNT
要少,只需要一次I/O 就能扫完,则使用全表扫描要比使用索引的成本低,此时会使
用全表扫描。
4、并行
   如果在表一级设置了较高的并行度,如alter table table_name
parallel(degree 10),通常会使CBO 错误的选择全表扫描。通常不建议在表级的设
置并行。
5、全表扫描hints
-------------------------------------------------------------------

------------------TABLE ACCESS BY INDEX ROWID (ROWID 扫描)----------------
    Rowid 就是一个记录在数据块中的位置,由于指定了记录在数据库中的精确位
置,因此rowid 是检索单条记录的最快方式。如果通过rowid 来访问表,Oracle 首
先需要获得被检索记录的rowid,Oracle 可以在WHERE 子句中得到rowid,但更多
的是通过扫描索引来获得,然后Oracle 基于rowid 来定位被检索的每条记录。

select * from employees where last_name='King'

rowid组成(采用64位编码)
  数据对象编号   文件编号   块编号  行编号
  OOOOOO          FFF       BBBBBB   RRR
64位编码
A-Z <==> 0 - 25 (26)
a-z <==> 26 - 51 (26)
0-9 <==> 52 - 61 (10)
+/ <==> 62 - 63 (2)

查询rowid的详细信息
select dbms_rowid.rowid_object(rowid) object_id,
       dbms_rowid.rowid_relative_fno(rowid) file_id,
       dbms_rowid.rowid_block_number(rowid) block_id,
       dbms_rowid.rowid_row_number(rowid) num
  from employees
where rownum < 5;
----------------------------------------------------------------------------

--------------------INDEX FULL SCAN(索引全扫描)------------------------------
    全索引扫描就是对整个索引进行一次逐条扫描,只需要一次I/O。进行全索引扫描
时因为有些查询条件必须对整个索引进行一次逐条扫描。
----------------------------------------------------------------------------

----------------INDEX UNIQUE SCAN(索引唯一扫描)-----------------------------
    这种扫描通常发生在对一个主键字段或含有唯一约束的字段指定相等条件时,只有
单行记录被访问。
----------------------------------------------------------------------------

------------------INDEX RANGE SCAN(索引范围扫描)----------------------------
    索引范围扫描通常发生在对一个索引字段指定范围条件时,有多行记录被访问。是
检索数据的常用方式,返回的数据返照索引字段升序排列,字段值相同的则按照rowid
升序排列。如果在语句中指定了order by字句,而且排序字段是索引字段时Oracle将
忽略order by子句。
---------------------------------------------------------------------------

INDEX XXX SCAN DESCENDING(索引降序范围扫描)
INDEX SKIP SCAN(索引跳跃式扫描)
INDEX FAST FULL SCAN (索引快速全扫描)
FILTER:In (Sql 子查询) , Exists (Sql 子查询)

-----------------------PARTITION RANGE ALL------------------------------
  如果表是分区表,则对这个表查询的Sql语句的执行计划可能会出现PATITION
RANGE ALL .
------------------------------------------------------------------------

-----------------------NESTED LOOP(嵌套连接)---------------------------
    从执行计划的角度上看,表与表连接方法共有三种,嵌套循环是其中的一种,是执
行计划中看到的最常见的一种连接。在嵌套循环中,内表被外表驱动,外表返回的每
一行都要在内表中检索找到与它匹配的行。
    嵌套循环在小表驱动大表,并且返回结果小的情况下是最快的一种连接方式。对于
嵌套循环来说,整个查询返回的结果集不能太大(大于1万不适合),要把返回子集
较小表的作为外表(CBO默认外表是驱动表),而且在内表的连接字段上一定要有索
引。
----------------------------------------------------------------------

-----------------------HASH JOIN(散列连接)------------------------------
   散列连接,又称哈希连接,是CBO做大数据集连接时的常用方式,优化器使用两个表中较
小的表(或数据源)利用连接键在内存中建立散列表,然后扫描较大的表并探测散列
表,找出与散列表匹配的行。

  哈希表又称散列表,其定义是这样的:根据设定的哈希函数H(key)和所选中的处理
冲突的方法,将一组关键字映象到一个有限的、地址连续的地址集(区间)上,并以关键
字在地址集中的“象”作为相应记录在表中的存储位置,这种表被称为哈希表。
-------------------------------------------------------------------------

----------------------MERGE JOIN & SORT JOIN (排序合并)------------------
   从执行计划的角度上看,表与表连接方法共有三种,排序合并是其中的一种。一般
我们称排序合并为 SORT MERGE,在执行计划中表现为两个表分别作Sort Join 然后
再在一起做个Merge Jion。
   sort merge join的操作通常分三步:对连接的每个表做table access full;对table
access full的结果进行排序;进行merge join对排序结果进行合并。sort merge join性
能开销几乎都在前两步。一般是在没有索引的情况下,9i开始已经很少出现了,因为
其排序成本高,大多为hash join替代了。

    归并排序是一种排序方法,把一组需要排序元素分成两组,先分别排序,然后再归
并。这种排序方法又称为二路归并排序。
----------------------------------------------------------------------------















分享到:
评论

相关推荐

    SQL执行计划之sql_trace

    ### SQL执行计划之sql_trace详解 #### 一、SQL Trace简介 SQL Trace 是 Oracle 提供的一种强大工具,用于记录 SQL 语句的执行过程。它能够帮助数据库管理员和开发人员详细了解 SQL 语句是如何被 Oracle 数据库处理...

    SQL TRACE原理、方法、事件查看总结

    SQL TRACE的基本原理是跟踪SQL语句的执行过程,记录从解析到执行的每一个步骤,包括硬解析、软解析、执行计划、等待事件等。通过启用SQL TRACE,我们可以获取到关于SQL语句的元数据、执行计划、资源消耗等重要信息,...

    10046事件和sql_trace.docx

    【10046事件与SQL_TRACE】是Oracle数据库中用于诊断和优化SQL语句执行性能的重要工具。当面临SQL语句执行效率低下时,我们可以启用SQL_TRACE来追踪其执行流程,获取详细的执行信息,从而找出性能瓶颈。 一、启用SQL...

    如何使用oracle提供的SQL_TRACE来跟踪sql的执行情况

    如何使用oracle提供的SQL_TRACE来跟踪sql的执行情况?Sql性能非常差的时候,oracle提供了SQL_TRACE来跟踪sql的执行情况。注:分析sql的方式比较多,还有根据优化器、sql执行计划来分析。SQL_TRACE能够将sql执行的过程...

    显示 sql 执行效率.

    通过 SQL*Plus 工具中的 Auto Trace 功能,我们可以方便地获取 SQL 语句的执行计划、统计信息以及执行时间等关键性能指标。这对于数据库管理员来说是非常有用的工具,能够帮助他们在日常工作中快速定位问题并进行...

    oracle怎么查看执行计划

    同样,与EXPLAIN PLAN相比,AUTOTRACE不仅展示了执行计划,还执行了SQL语句,从而能够提供更加准确的统计信息。 #### 准备工作 为了使用AUTOTRACE,需要进行以下准备工作: 1. **创建PLAN_TABLE** - 每个需要运行...

    [精华] 通过分析SQL语句的执行计划优化SQL(总结)7年DBA工作经验.docx

    【SQL语句执行计划分析与优化】 SQL语句的执行计划是数据库管理系统(DBMS)在执行查询时采用的具体步骤,对于理解SQL性能至关重要。在Oracle数据库中,优化SQL语句是DBA(数据库管理员)的一项核心任务,尤其是在...

    ORACLE数据库查看执行计划的方法

    执行计划:一条查询语句在ORACLE中的执行过程或...2:在SQL*PLUS(PL/SQL的命令窗口和SQL窗口均可)下执行下面步骤3:在SQL*PLUS下(有些命令在PL/SQL下无效)执行如下命令: SETAUTOT[RACE]{ON|OFF|TRACE[ONLY]}[EXP[LAIN]]

    Oracle的SQL语句执行效率问题查找与解决方法文.pdf

    Oracle SQL 语句执行效率问题查找与解决方法 一、 Oracle SQL 语句执行效率问题查找方法 Oracle 数据库系统中, SQL 语句的执行效率问题是一个非常重要的问题。在实际应用中,我们经常会碰到一些性能不佳的 SQL ...

    Oracle执行计划与SQL优化实例.pptx

    《Oracle执行计划与SQL优化实例》这一主题深入探讨了数据库管理与优化的关键方面,尤其针对Oracle数据库环境。本文旨在解析并扩展此PPTX文件中提及的重要知识点,涵盖执行计划的概念、获取方法、解读技巧以及SQL优化...

    Oracle数据库关于SQL的执行计划

    - **设置 Auto Trace**:通过 `set autotrace traceonly explain` 开启自动跟踪功能,查看 SQL 语句的执行计划。 - **查询执行计划**:使用 `EXPLAIN PLAN FOR` 和 `SELECT * FROM table(dbms_xplan.display);` ...

    oracle执行计划建立与阅读

    `SQLTRACE`会记录详细的执行过程,包括执行计划和其他跟踪信息。启用`SQLTRACE`后执行SQL语句,再用`TKPROF`工具对产生的跟踪文件进行格式化,以查看执行计划。 二、执行计划解读 执行计划通常由以下部分组成: ...

    ORACLE数据库查看执行计划

    为了优化SQL,理解并分析执行计划是必不可少的步骤。执行计划揭示了Oracle如何处理一个SQL查询,包括数据的访问路径、使用的索引、排序方式以及表之间的连接顺序等。本文将深入探讨如何查看执行计划,并提供优化SQL...

    The ABAP SQL Trace (ST05)

    这篇博客旨在为您提供 ABAP SQL 跟踪的快速介绍,展示如何执行跟踪、如何获取结果概要,以及如何解释结果。 使用 ABAP SQL 跟踪非常简单: 1. 在第二模式下调用 ABAP SQL 跟踪 2. 确保您的测试程序至少执行了一次...

    SQLTracker(sql跟踪器).zip

    - **查询分析**:选择慢查询或高资源消耗的SQL,查看其执行计划,根据分析结果调整SQL语句或数据库参数。 - **报警设置**:自定义报警规则,如查询执行时间、资源使用量等,当触发条件满足时,接收到通知。 - **...

    db2执行计划的使用和更新

    在数据库管理系统中,执行计划扮演着至关重要的角色,它决定了SQL语句如何被优化和执行。对于IBM的DB2数据库而言,理解和掌握执行计划的创建、分析以及更新机制,是提升查询性能、确保索引有效利用的关键。 **一、...

    ORACLE执行计划和SQL调优知识概述.pptx

    ORACLE 提供了多种工具来辅助执行计划和 SQL 调优,如 EXPLAIN PLAN、SQL_TRACE、TKPROF 等。EXPLAIN PLAN 是一种分析执行计划的工具,可以帮助开发者了解 SQL 语句的执行计划和成本。SQL_TRACE 是一种追踪 SQL 语句...

    Oracle解释计划 执行计划

    对于绑定变量的SQL语句,它们的执行计划可能与非绑定变量的SQL不同,因为绑定变量可以提高SQL的重用率,并允许Oracle数据库优化器更好地选择执行计划。不过,在使用EXPLAIN PLAN命令查看绑定变量的执行计划时,可能...

    Oracle 执行计划稳定性

    5. 监控和调整:使用数据库的性能监控工具,如Automatic Workload Repository (AWR) 和Extended SQL Trace,来识别和调整不良的执行计划。 6. 创建和维护索引:根据查询模式创建合适的索引,有助于优化器选择高效的...

Global site tag (gtag.js) - Google Analytics