oracle用hints调优,oracle性能优化之–hints

oracle用hints调优,oracle性能优化之–hintshints是oracle提供的一种机制,用来告诉优化器按照我们告诉它的方式生成执行计划。可以用hints来实现:1)使用的优化器的类型2)基于代价的优化器的优化目标,是all_rows还是first_rows。3)表的访问路径,是全表扫描,还是索引扫描,还是直接利用rowid。4)表之间的连接类型5)表之间的连接顺序6)语句的并行程度1、写HINT目的人为的改变SQL语句的执行计划2、…

hints是oracle提供的一种机制,用来告诉优化器按照我们告诉它的方式生成执行计划。可以用hints来实现:

1) 使用的优化器的类型

2) 基于代价的优化器的优化目标,是all_rows还是first_rows。

3) 表的访问路径,是全表扫描,还是索引扫描,还是直接利用rowid。

4) 表之间的连接类型

5) 表之间的连接顺序

6) 语句的并行程度

1、写HINT目的

人为的改变SQL语句的执行计划

2、HINT可以基于以下规则产生作用

表连接的顺序、表连接的方法、访问路径、并行度

3、HINT应用范围

dml语句

查询语句

4、语法

{DELETE|INSERT|SELECT|UPDATE} /*+ hint [text] [hint[text]]… */

or

{DELETE|INSERT|SELECT|UPDATE} –+ hint [text] [hint[text]]…

如果语(句)法不对,则ORACLE会自动忽略所写的HINT,不报错

5、指定优化器模式的HINT

RULE:不管是否有统计信息,都将采用基于规则进行优化;

CHOOSE:只要被访问的数据中有一个表有统计信息,就将采用基于代价的方式进行优化;

FIRST_ROWS:不管是否有统计信息,都将采用基于代价的方式进行优化,其优化目标是最快响应时间;

ALL_ROWS:不管是否有统计信息,都将采用基于代价的方式进行优化,其优化目标是最大吞吐量;

例子:

尽快地显示前10行记录

select /*+ first_rows(10) */ * from emp where deptno=10;

6、指定访问路径的HINT

FULL: 执行全表扫描

/*+ FULL ( table ) */

ROID: 根据ROWID进行扫描

/*+ ROWID ( table ) */

INDEX: 根据某个索引进行扫描

/*+ INDEX ( table [index [index]…] ) */

select /*+ index(emp ind_emp_sal)*/ * from emp where deptno=200 and sal>300;

如果写了多个,则ORACLE自动选择最优的哪个

select /*+ index(emp ind_emp_sal ind_emp_deptno)*/ * from emp where deptno=200 and sal>300;

INDEX_JOIN: 如果所选的字段都是索引字段(是几个索引的),那么可以通过索引连接就可访问到数据,而不需要访问表的数据。

/*+ INDEX_JOIN ( table [index [index …]] ) */

select /*+ index_join(emp ind_emp_sal ind_emp_deptno)*/ deptno,sal from emp where deptno=20;

INDEX_FFS: 执行快速全索引扫描

/*+ INDEX_FFS ( table [index [index]…] ) */

select /*+ index_ffs(emp pk_emp)*/ count(*) from emp;

NO_INDEX: 指定不使用哪些索引

/*+ NO_INDEX ( table [index [index]…] ) */

select /*+ no_index(emp ind_emp_sal ind_emp_deptno)*/ * from emp where deptno=200 and sal>300;

AND_EQUAL: 指定合并两个或以上索引检索的结果(交集),最多不能超过5个

/*+ AND_EQUAL ( table index index [index] [index] [index] ) */

7、指定表的连接顺序

ORDERED: 按表出现的顺序进行连接

/*+ ORDERED */

select /*+ordered*/ emp.ename,dept.dname from dept,emp where emp.deptno=dept.deptno;

select /*+ordered*/ emp.ename,dept.dname from emp,dept where emp.deptno=dept.deptno;

8、指定表的连接操作

USE_NL: 按nested loops方式连接

–默认hash join,获取所有数据的最快返回时间

select emp.ename,dept.dname from dept,emp where emp.deptno=dept.deptno;

–指定emp作为inner table ,以获取最快的响应时间

select /*+ordered use_nl(emp) to get first row faster */ emp.ename,dept.dname from dept,emp where emp.deptno=dept.deptno;

select /*+ordered use_nl(emp dept)*/ emp.ename,dept.dname from dept,emp where emp.deptno=dept.deptno;

另:每个SELECT/INSERT/UPDATE/DELETE命令后只能有一个/*+ */,但提示内容可以有多个,可以用逗号分开,空格也可以。如:

/*+ ordered index() use_nl() */未完待续。

今天的文章oracle用hints调优,oracle性能优化之–hints分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/9317.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注