得到一条sql语句执行计划的常用方法:
1、explain plan 命令  
2、DBMS_XPLAN包
3、sqlplus中的AUTOTRACE开关
4、10046事件
5、10053事件
6、AWR报告或者statspack报告

对于常用方法F5,其实是explain plan的封装  
explain plan for +目标sql  
select * from table(dbms_xplan.displan)
这里说一下两个关键字的作用:  cardinality 实际上表示对目标sql的某个具体执行步骤的执行结果所包含的记录数的估算。cardinality的值越大,他所对应的成本往往也就越高,那么这个执行步骤对应的
执行路径的总成本也就越大。

2、使用DBMS_XPLAN包  
针对不同的应用场景,可以选择以下四种方法
1、select * from table(dbms_xplan.displan)
2、select * from table(dbms_xplan.displan_cuecsor(null,null,'advanced'));
3、select * from table (dbms_xplan.displan_cursor('sql_id/hash_value',child_cursor_number),'advanced')
4、select * from table (dbms_xplan.displan_awr('sql_id'))

方法2 是用来查看刚刚执行过的sql 的执行过程
方法3是用来查看指定sql 的执行计划
方法4是用来查看指定sql 的历史所有执行计划

3、AUTOTRACE开关  
在sqlplus中将AUTOTRACE开关打开也能得到目标sql的执行计划,而且初次之外,还能得到目标sql在执行时的资源消耗量,即通过设置AUTOTRACE开关我们可以额外观察到目标sql执行时所耗费的物理读、逻辑读、产生的redo数量以及排序数量等。
具体使用方法:
set AUTOTRACE ON
select * from .......

对于oracle中hint的知识点:

1、hint实际上一种特殊的注释,它以一种固定的格式和位置出现在sql语句的sql文本之中,它可以影响优化器对于执行计划的选择,但这种影响不是强制性的,优化器在某些情况下可能会忽略掉sql中的hint,及时这个hint在语法和语义上是有效的。

2、hint的使用格式

/*+<具体的hint内容>*/

1)  /*+full(tablename)*/  --全表扫描    在hint中指定具体的表名的时候,如果该表在对应sql文本中有别名(alias),则应该使用该表的别名

2)/*+ALL_ROWS*/ --针对整个目标sql的hint,它的含义是让优化器启用CBO,会选择吞吐量最佳的执行路径

3)/*+FIRST_ROWS(n)*/  --在得到目标sql的执行计划时,会选择那些能以最快的响应时间返回头n条记录的执行计划

4)/*+rule*/  --表示对目标sql启用RBO

有一下情形,rule hint会被oracel忽略

a)  目标sql除rule之外还使用了其他的hint

b)  目标sql使用了并行

c) 目标sql所涉及的对象有IOT

d)目标对象所涉及的sql有分区

5) /*+rowid(目标表)*/  --rowid是针对单个目标表的hint,它的含义是让目标表执行rowid扫描,只要目标表中使用了含rowid的where条件时rowid hint 才有意义

6)/*+ index (目标表 目标表索引)*/

格式二   /*+index (目标表 目标索引1 目标索引2 目标索引3 。。。。)*/

格式三 /*+ index (目标表 (目标索引1的索引列名)(目标索引2的索引列名)....(目标索引n的索引列名))*/

7) /*+NO_INDEX*/  --让目标表不走某个索引

8)/*+INDEX_DESC*/ --让目标索引执行索引降序索引扫描操作

9)/*+INDEX_COMBINE* / --针对单个表的目标索引,它的含义是让优化器对目标表上的多个目标索引执行位图布尔运算

10) /*+INDEX_FFS*/ 是执行单个目标表的hint,它的含义是让优化器目标表上的目标索引执行索引快速全表扫描操作

注: 索引快速全表扫描操作成立的前提条件是select语句中的所有查询列都位于目标索引之中,即通过扫描目标索引就可以得到所有的查询列而不用回表

11) /*+index_join*/  --它的含义是让优化器对目标表上的多个目标索引执行index join操作

注: index_join能成立的前提条件是select语句中的所有查询列都位于目标索引之中,即通过扫描目标索引就可以得到所有的查询列而不用回表

12) /*+AND_EQUAL*/ --让目标表上的多个目标索引执行index merge 操作

注:index merge 能成立的前提条件是目标sql的where条件里出现了多个针对不同单列的等值条件,并且这些列上都有单键值的索引,在oracle数据库中能做index merge的索引数量的最大值是5

------*与表连接顺序相关的索引*--------

/*+ordered*/  --ordered是针对多个目标表的hint,它的含义就是让优化器对目标表执行表连接操作时,按照他们在目标sql的from字句中出现的顺序从左到右依次进行连接

/*+leading*/  --是针对多个目标表的hint,它的含义是让优化器将我们指定的多个表的连接结果作为目标sql表连接过程中的驱动结果集,并且将leading hint中 从左至右出现的第一个目标表作为整个表连接过程中的首个驱动表

-------*与表连接方法相关的hint*--------

/*+use_merge*/  --让优化器将我们指定的多个表作为被驱动表与其他的表或结果集做排序合并连接

/*+use_NL*/  --让优化器将我们指定的多个表作为被驱动表与其他表或者结果集进行嵌套循环连接

/*+use_hash*/ --让优化器将我们指定的多个表作为被驱动表与其他表或结果集做哈希连接

注:use_hash 中指定的目标表应该是哈希连接中的被驱动表

/*+merge_aj*/ -- 针对子查询的hint,让优化器对相关目标表执行排序合并反连接

/*+NL_AJ*/ --针对子查询的hint,让优化器对相关目标表执行嵌套循环反连接

/*+hash_aj*/ 针对子查询的hint,让优化器对相关目标表执行哈希反连接

/*+merge_sj*/ 针对子查询的hint,让优化器对目标表执行排序合并半连接

/*+NL_SJ*/ 针对子查询的hint,让优化器对相关目标表执行嵌套循环半连接

/*+hash_sj*/ 针对子查询的hint,让优化器对相关目标表执行哈希半连接

/*+use_concat*/ 针对整个目标sql的hint ,它的含义是让优化器对目标sql使用IN_list扩展或or扩展

/*+NO_expand*/ 不让目标执行IN—LIST或者or扩展

/*+merge*/ --对目标试图执行视图合并,

/*+unnest*/  --针对子查询的hint,让优化器对目标sql中的zi查询执行查询展开

/*+parallel*/  --sql总是以并行的方式执行,oracle此时会计算出一个并行度,这个计算出来的并行度总是大于或等于2

/*+parallel(auto)*/ --oracle同样会计算出一个并行度,但是这个计算出来的并行度可能是1,所以该格式的目标sql不一定总是会以并行的方式执行,当计算出的并行度为1的时候,该sql以串行的方式执行

/driving_site/ --针对单个目标表的hint,其含义是让优化器在我们指定的目标表所在的节点上执行目标sql ,适用于带dblink的分布式查询语句

/*+APPEND*/  --针对整个目标sql 的hint,其含义是让优化器在执行带子查询的insert 语句 时绕开buffer
cache,使用直接路径插入。默认情况下,oracle在执行插入语句时使用的常规插入方式,这时相关的数据块会缓存在buffer cache
中,对于直接路径插入,oracle
在插入数据的时候,会直接在高水位线以上插入数据(然后在抬高高水位线),而不是像常规插入那样先去目标表的高水位线一下寻找是否存在插入数据的数据块,这样就省去了寻找合适数据块的开销。在非归档模式,或者在规定模式但表是NOLOGGING时,使用
append hint插入数据时不会产生redo,这样就省去了产生redo这部分工作的开销

注:当我们使用了有效的append hint 以直接路径插入对目标表insert数据时,oracle会在目标表加上LMODE=6的排它锁(TM ENQUEUE),这就意味着在插入数据时,其他人无法对目标表做任何DML操作,容易引起并发问题  。

/*+push_subq*/ --通常情况下,目标sql中不能做子查询展开的子查询总是在其执行计划的最后一步才被执行,但如果执行这个子查询后能显著减少返回结果集的数量,则先执行这个子查询就有可能提高该sql的执行效率

执行计划中的关键字cardinalty:某个执行步骤所对应的cardinality的值越大,那么他所对应的成本值往往就越高,这个执行步骤所在的执行路径的总成本也就越大。

可选择率selectivity和成本值得估算是息息相关的,可选择率的值越大,就意味着返回结果集的cardinality的值就越大,所以估算出来的成本值也就越大。

selectivity = 1/num_distnct  num_distinct --指目标列distinct的值得数量

oracle --hint总结的更多相关文章

  1. SWAP_JOIN_INPUTS Oracle Hint(处理hash join强制大表(segment_size大)作为被驱动表)

    SWAP_JOIN_INPUTS Oracle Hint(处理hash join强制大表(segment_size大)作为被驱动表) swap_join_inputs是针对哈希连接的hint,它的含义 ...

  2. SQL优化过程中常见Oracle HINT

    在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量, ...

  3. Oracle hint手动优化

    例子 select/*+FULL(fortest)*/ * from fortest where id = 2000000 //使用0.70s时间 select* from fortest where ...

  4. 品味性能之道<十>:Oracle Hint

    Hint 是Oracle 提供的一种SQL语法,它允许用户在SQL语句中插入相关的语法,从而影响SQL的执行方式. 因为Hint的特殊作用,所以对于开发人员不应该在代码中使用它,Hint 更像是Ora ...

  5. Oracle Hint 用法

    正确的语法是: select /*+ index(x idx_t) */ * from t x where x.object_id=123 /*+    */ 和注释很像,比注释多了一个“+”,这就是 ...

  6. Oracle Hint 详解

    Hint 是Oracle 提供的一种SQL语法,它允许用户在SQL语句中插入相关的语法,从而影响SQL的执行方式. 因为Hint的特殊作用,所以对于开发人员不应该在代码中使用它,Hint 更像是Ora ...

  7. Oracle hint之ORDERED和USE_NL

    Hint:ORDERED和USE_NL ORDERED好理解,就是表示根据 from 后面表的顺序join,从左到右,左边的表做驱动表 use_nl(t1,t2):表示对表t1.t2关联时采用嵌套循环 ...

  8. oracle hint inline materialize

    当我们使用with的时候,oracle可能会把with里面的结果转换为暂时表.这是仅仅是可能,由于CBO会推断. inline是不转换成暂时表.materialize是强制转换成暂时表. 制造数据 d ...

  9. Oracle Hint用法整理笔记

    目录 1./+ result_cache / 2./+ connect_by_filtering / 3./+ no_unnset / 4./+ index(表别名 索引名) / 5./+ INDEX ...

随机推荐

  1. OpenCV中图像的格式Mat 图像深度

    opencv中图像的格式Mat 有图像的定义,图像深度.类型格式等,其中Mat的参数depth为深度,深度反应出图像颜色像素值: 关于数据的储存:(转) Mat_<uchar>对应的是CV ...

  2. PythonStudy——内存管理之垃圾回收 Memory management Garbage collection

    内存管理 引用计数:垃圾回收机制的依据 # 1.变量的值被引用,该值的引用计数 +1# 2.变量的值被解绑,该值的引用计数 -1# 3.引用计数为0时就会被垃圾回收机制回收 标记清除:解决循环引用问题 ...

  3. Python shutil 模块

    高级的文件.文件夹.压缩包 处理模块 http://www.cnblogs.com/wupeiqi/articles/4963027.html

  4. python base64.b64decode 等号可以随便加

    由于 =  用在URL,cookie里会造成歧义,所以base64编码的时候,会把 = 自动去掉. 解码的时候,如果传入的二进制编码长度小于4的倍数,那么需要在后面补=,知道满足长度等于4的倍数,然后 ...

  5. SSH原理及操作

    1:公钥与私钥(public and private key) 公钥:提供给远程主机进行数据加密的行为 私钥:远程主机收到客户端使用公钥加密数据后,在本地端使用私钥来解密 2:公钥与私钥进行数据传输时 ...

  6. Django项目的创建

    一. Django介绍 Python的WEB框架有Django.Tornado.Flask 等多种, Django相较与其他WEB框架其优势为: 大而全, 框架本身集成了ORM.模型绑定,.模板引擎, ...

  7. 第27课 可变参数模板(8)_TupleHelper

    1. TupleHelper的主要功能 (1)打印:由于tuple中的元素是可变参数模板,外部并不知道内部到底是什么数据,有时调试时需要知道其具体值,希望能打印出tuple中所有的元素值. (2)根据 ...

  8. Python + Robot Framework 环境搭建

    一.Python 安装 说明:由于RIDE是基于python2.x开发,后期未做python3.x兼容,所以这里安装python2.7. 链接: https://pan.baidu.com/s/1yf ...

  9. python常见循环练习

    第一题:求5的阶乘 # 方法1,递归 def jc(num): if num == 1: return 1 else: return num*jc(num-1) print(jc(5)) # 方法2, ...

  10. 【笔记】range函数在py3里面的处理及numpy库效率比较【原创】

    今天看了一下,numpy数组操作其中一段代码,主要是测试用纯python和numpy之间的性能问题 在py2环境下,代码如下: def pysum(n): a = range(n) b = range ...