Oracle中查看已执行sql的执行计划
上一篇 / 下一篇 2008-09-12 10:54:07 / 个人分类:原创笔记
查看( 771 ) / 评论( 8 ) / 评分( 15 / 0 )
有时候我们可能会希望查看一条已经执行过的sql的执行计划,常用的方式有两种:a,set autotrace后再重新执行一遍,不过重新执行可能会浪费时间,而且有些语句也不允许(例如修改操作的语句),或者查询v$sql_plan视图,但v$视图的可读性又不是那么好,这里提供一个新方式,通过dbms_xplan.display_cursor来获取执行过的sql的执行计划。
首先看看该函数的语法:
DBMS_XPLAN.DISPLAY_CURSOR(
sql_id IN VARCHAR2 DEFAULT NULL,
child_number IN NUMBER DEFAULT NULL,
format IN VARCHAR2 DEFAULT 'TYPICAL');
由上可知,我们至少需要找到执行过sql的sql_id,该参数可以从v$sql视图中找到。
…… …… 余下全文
怎样看懂Oracle的执行计划
一、什么是执行计划
An explain plan is a representation of the access path that is taken when a query is executed within Oracle.
二、如何访问数据
At the physical level Oracle reads blocks of data. The smallest amount of data read is a single Oracle block, the largest is constrained by operating system limits (and multiblock i/o). Logically Oracle finds the data to read by using the following methods:
Full Table Scan (FTS) --全表扫描
Index Lookup (unique & non-unique) --索引扫描(唯一和非唯一) Rowid --物理行id
…… …… 余下全文
Oracle的执行计划查看方法
Oracle在执行一个SQL之前,首先需要看一下SQL的执行计划,然后在按照执行计划执行SQL,分析执行计划的工作是由优化器来执行的,在不同的条件下,一个SQL可能存在多条执行计划,但是在某个特定的时间点,特定的环境下,一定只有一种执行计划是最优的。
1、 Oracle的优化方式
Oracle有两种优化方式:RBO(Rule-Based Optimization)和CBO(Cost-Based Optimization)
RBO: 优化器在分析SQL语句的时候所遵循的优化规则是基于Oracle内部预定的一些规则。
CBO: 优化器字分析SQL语句的时候主要是看语句执行的开销(Cost),这里的代价主要指CPU和内存,优化器在判断是否使用这种方式的时候,主要参照的是表及索引的统计信息。统计信息给出表的大小,有多少行,每行的长度等信息。
2、 优化器的优化模式
优化模式包括:Rule, Choose, First Rows, All Rows四种模式。
Rule:走基于规则的模式。
Choose:默认情况下Oracle使用这种优化模式,当一个表或索引有统计信息的时候,走CBO的方式;如果表或索引没有统计信息,表又不是特别的小,且相应的字段有索引,则走RBO的方式。在缺省情况下,ORACLE采取Choose的优化模式,为了避免不必要的Full Table Scan,尽量避免采取此种优化模式,而直接采取CBO或者RBO的优化模式。
…… …… 余下全文
一、什么是执行计划
An explain plan is a representation of the access path that is taken when a query is executed within Oracle. 二、如何访问数据
At the physical level Oracle reads blocks of data. The smallest amount of data read is a single Oracle block, the largest is constrained by operating system limits (and multiblock i/o). Logically Oracle finds the data to read by using the following methods:
Full Table Scan (FTS) --全表扫描
Index Lookup (unique & non-unique) --索引扫描(唯一和非唯一)
Rowid --物理行id 三、执行计划层次关系
…… …… 余下全文
一、什么是执行计划
An explain plan is a representation of the access path that is taken when a query is executed within Oracle.
二、如何访问数据
At the physical level Oracle reads blocks of data. The smallest amount of data read is a single Oracle block, the largest is constrained by operating system limits (and multiblock i/o). Logically Oracle finds the data to read by using the following methods:
Full Table Scan (FTS) --全表扫描
--索引扫描(唯一和非唯一)
--物理行id Index Lookup (unique & non-unique) Rowid
三、执行计划层次关系
…… …… 余下全文
oracle执行计划解释
一.相关概念
1·rowid,伪列:就是系统自己给加上的,每个表都有一个伪列,并不是物理存在。它不能被修改,删除,和添加,rowid在该行的生命周期是唯一的,如果向数据库插入一列,只会引起行的变化,但是rowid并不会变。
2·recursive sql概念:当用户执行一些SQL语句时,会自动执行一些额外的语句,我们把这些额外的SQL语句称为“recursive calls” 或者是“recursive sql statement”,当在执行一个DDL语句时,Oracle总会隐含的发出一些Recursiv sql语句,用于修改数据字典,如果数据字典没有在共享内存中,则就执行“resursive calls”,它会把数据字典从物理读取到共享内存。当然DML和select语句都可能引起recursive SQL。
3·row source 行源:在查询中,由上一操作返回的符合条件的数据集,它可能是整个表,也可能是部分,当然也可以对2个表进行连接操作(join)最后得到的数据集 4·predicate:一个查询中的where限制条件
…… …… 余下全文
Oracle的SQL语句执行效率问题查找与解决方法
一、识别占用资源较多的语句的方法(4种方法)
1. 测试组和最终用户反馈的与反应缓慢有关的问题。
2. 利用V_$SQLAREA视图提供了执行的细节。(执行、读取磁盘和读取缓冲区的次数)
? 数据列
EXECUTIONS:执行次数
DISK_READS:读盘次数
COMMAND_TYPE:命令类型(3:select,2:insert;6:update;7delete;47:pl/sql程序单元)
OPTIMIZER_MODE:优化方式
SQL_TEXT:Sql语句
SHARABLE_MEM:占用shared pool的内存多少
BUFFER_GETS:读取缓冲区的次数
? 用途
1、帮忙找出性能较差的SQL语句
2、帮忙找出最高频率的SQL
3、帮忙分析是否需要索引或改善联接
3. 监控当前Oracle的session,如出现时钟的标志,表示此进程中的sql运行时间较长。
4. Trace工具:
a) 查看数据库服务的初始参数:timed_statistics、user_dump_dest和
max_dump_file_size
…… …… 余下全文
Oracle执行计划详解
目录
---
一.相关的概念
Rowid的概念
Recursive Sql概念
Predicate(谓词)
DRiving Table(驱动表)
Probed Table(被探查表)
组合索引(concatenated index)
可选择性(selectivity)
二.oracle访问数据的存取方法
1) 全表扫描(Full Table Scans, FTS)
2) 通过ROWID的表存取(Table Access by ROWID或rowid lookup)
3)索引扫描(Index Scan或index lookup)有4种类型的索引扫描:
(1) 索引唯一扫描(index unique scan)
(2) 索引范围扫描(index range scan)
在非唯一索引上都使用索引范围扫描。使用index rang scan的3种情况: (a) 在唯一索引列上使用了range操作符(> < <> >= <= between) (b) 在组合索引上,只使用部分列进行查询,导致查询出多行 (c) 对非唯一索引列上进行的任何查询。
…… …… 余下全文