oracle中hint用法

hints 這個東使用的好的話很好用。在进行sql执行过程中,由于有时候系统自动优化的方式并不是最优的。需要我们手工添加hint来提高查询效率。在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法:
1. /*+ALL_ROWS*/表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化.例如:
SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
2. /*+FIRST_ROWS*/表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化.例如:
SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
3. /*+CHOOSE*/表明如果数据字典中有访问表的统计信息,将基于开销的优化方法,并获得最佳的吞吐量;表明如果数据字典中没有访问表的统计信息,将基于规则开销的优化方法;例如:
SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
4. /*+RULE*/表明对语句块选择基于规则的优化方法.例如:
SELECT /*+ RULE / EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
5. /FULL(TABLE)*/表明对表选择全局扫描的方法.例如:
SELECT /*FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='SCOTT';
6. /*+ROWID(TABLE)*/提示明确表明对指定表根据ROWID进行访问.例如:
SELECT /*+ROWID(BSEMPMS)*/ FROM BSEMPMS WHERE ROWID>='AAAAAAAAAAAAAA'
AND EMP_NO='SCOTT';
7. /CLUSTER(TABLE)*/ 提示明确表明对指定表选择簇扫描的访问方法,它只对簇对象有效.例如:
SELECT /*CLUSTER / BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS
WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
8. /INDEX(TABLE INDEX_NAME)*/表明对表选择索引的扫描方法.例如:
SELECT /*INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS / FROM BSEMPMS WHERE SEX='M';
9. /INDEX_ASC(TABLE INDEX_NAME)*/表明对表选择索引升序的扫描方法.例如:
SELECT /*INDEX_ASC(BSEMPMS PK_BSEMPMS) / FROM BSEMPMS WHERE DPT_NO='SCOTT';
10. /INDEX_COMBINE*/为指定表选择位图访问路经,如果INDEX_COMBINE中没有提供作为参数的索引,将选择出位图索引的布尔组合方式.例如:
SELECT /*INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ FROM BSEMPMS
WHERE SAL<5000000 AND HIREDATE11. /INDEX_JOIN(TABLE INDEX_NAME)*/提示明确命令优化器使用索引作为访问路径.例如:
SELECT /*INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE
FROM BSEMPMS WHERE SAL<60000;
12. /*+INDEX_DESC(TABLE INDEX_NAME)*/表明对表选择索引降序的扫描方法.例如:
SELECT /*+INDEX_DESC(BSEMPMS PK_BSEMPMS) / FROM BSEMPMS WHERE DPT_NO='SCOTT';
13. /INDEX_FFS(TABLE INDEX_NAME)*/对指定的表执行快速全索引扫描,而不是全表扫描的办法.例如:
SELECT /*INDEX_FFS(BSEMPMS IN_EMPNAM)*/ FROM BSEMPMS WHERE DPT_NO='TE垃圾产品';
14. /ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,...*/提示明确进行执行规划的选择,将几个单列索引的扫描合起来.例如:
SELECT /*INDEX_FFS(BSEMPMS IN_DPTNO,IN_EMPNO,IN_SEX)*/ FROM BSEMPMS WHERE EMP_NO='SCOTT' AND DPT_NO='TDC306';
15. /USE_CONCAT*/对查询中的WHERE后面的OR条件进行转换为UNION ALL的组合查询.例如:
SELECT /*USE_CONCAT*/ FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';
16. /NO_EXPAND*/对于WHERE后面的OR 或者IN-LIST的查询语句,NO_EXPAND将阻止其基于优化器对其进行扩展.例如:
SELECT /*NO_EXPAND*/ FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';
17. /NOWRITE*/禁止对查询块的查询重写操作.
18. /*REWRITE*/可以将视图作为参数.
19. /*+MERGE(TABLE)*/能够对视图的各个查询进行相应的合并.例如:
SELECT /*+MERGE(V) / A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELET DPT_NO
,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO
AND A.SAL>V.AVG_SAL;
20. /NO_MERGE(TABLE)*/对于有可合并的视图不再合并.例如:
SELECT /*NO_MERGE(V) / A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELECT DPT_NO,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO AND A.SAL>V.AVG_SAL;
21. /ORDERED*/根据表出现在FROM中的顺序,ORDERED使ORACLE依此顺序对其连接.例如:
SELECT /*ORDERED*/ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C WHERE A.COL1=B.COL1 AND B.COL1=C.COL1;
22. /*+USE_NL(TABLE)*/将指定表与嵌套的连接的行源进行连接,并把指定表作为内部表.例如:
SELECT /*+ORDERED USE_NL(BSEMPMS)*/ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
23. /*+USE_MERGE(TABLE)*/将指定的表与其他行源通过合并排序连接方式连接起来.例如:
SELECT /*+USE_MERGE(BSEMPMS,BSDPTMS)*/ FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
24. /USE_HASH(TABLE)*/将指定的表与其他行源通过哈希连接方式连接起来.例如:
SELECT /*USE_HASH(BSEMPMS,BSDPTMS)*/ FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
25. /DRIVING_SITE(TABLE)*/强制与ORACLE所选择的位置不同的表进行查询执行.例如:
SELECT /*DRIVING_SITE(DEPT)*/ FROM BSEMPMS,DEPT@BSDPTMS WHERE BSEMPMS.DPT_NO=DEPT.DPT_NO;
26. /LEADING(TABLE)*/将指定的表作为连接次序中的首表.
27. /*CACHE(TABLE)*/当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端例如:
SELECT /*+FULL(BSEMPMS) CAHE(BSEMPMS) / EMP_NAM FROM BSEMPMS;
28. /NOCACHE(TABLE)*/当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端例如:
SELECT /*FULL(BSEMPMS) NOCAHE(BSEMPMS) / EMP_NAM FROM BSEMPMS;
29. /APPEND*/直接插入到表的最后,可以提高速度.
insert /*append*/ into test1 select from test4 ;
30. /NOAPPEND*/通过在插入语句生存期内停止并行模式来启动常规插入.
insert /*noappend*/ into test1 select * from test4 ;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/187805/viewspace-614668/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/187805/viewspace-614668/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Oracle性能优化是数据库管理至关重要的一项工作。在进行性能优化时,不仅需要优化数据库的结构和配置,还需要针对具体的SQL语句进行优化。 首先,有效地使用索引可以显著提高SQL查询的性能。索引的选择应根据具体的查询需求进行优化,避免过多或不必要的索引。并且,需要定期重新分析和重建索引,以确保索引的统计信息是最新的。 其次,合理地编写SQL语句也是优化的关键。应尽量避免使用全表扫描和复杂的连接操作,可以通过使用合适的连接方式、使用子查询替代连接操作等方式来进行优化。 另外,使用合适的查询计划来提高SQL的执行效率也是一项重要的优化策略。Oracle提供了多种查询计划,如基于成本的优化器、基于规则的优化器等。应根据具体的查询需求选择合适的查询计划,并使用_hint强制指定查询计划,以达到最优的查询性能。 此外,合理地设置适当的内存参数也能提高SQL的性能。Oracle数据库有多个重要的内存参数,如SGA(系统全局区)和PGA(程序全局区)等,需要根据实际情况进行调整,以提高SQL的执行效率和响应速度。 最后,可以通过SQL监控和性能调优工具来定位和解决性能问题。Oracle提供了多种监控工具,如AWR报告、SQL Trace、Explain Plan等,可以通过对这些工具的使用来分析和调优SQL的性能问题。 综上所述,通过合理地使用索引、优化SQL语句、选择合适的查询计划、设置适当的内存参数以及使用监控工具等方法,可以有效地提高Oracle数据库的性能。 ### 回答2: Oracle作为一种关系数据库管理系统,拥有强大的性能优化功能。针对SQL语句的性能优化,常用的方法有以下几种: 1. 优化查询语句:通过优化SQL语句的编写,可以减少查询的时间和资源消耗。例如,避免使用SELECT *,而是明确指定需要查询的字段;使用EXISTS或IN代替NOT EXISTS或NOT IN等。 2. 创建索引:通过创建合适的索引可以加速查询。索引可以提高数据检索的效率,减少全表扫描的开销。但过多的索引会增加数据维护的成本,因此需要根据实际情况选择合适的字段创建索引。 3. 使用分区表:将大表划分为若干个小表,每个小表称为一个分区,可以通过分区表来提高查询效率。适当的分区可以减少查询的数据量,提高查询性能。 4. 优化表结构:合理设计表结构,包括选择合适的字段类型、定义主键和外键等等。避免使用过长的字段、重复的字段等不必要的设计,可以减少存储空间的使用和提高查询效率。 5. 适当使用数据库事务:事务能够保证数据完整性和一致性,但在数据处理量大的情况下,事务的开销也是可忽略不计的。因此,在设计时需要考虑是否需要使用事务,以免造成不必要的开销。 6. 使用优化器: Oracle具有强大的查询优化器,它可以根据语句选择更优的执行计划。通过设置优化器参数,例如统计信息的收集、调整计划的优先级等,可以提高查询的执行效率。 综上所述,在进行Oracle性能优化时,可以通过优化SQL语句、创建索引、使用分区表、优化表结构、适当使用事务和调整优化器参数等方法来提高数据库的查询性能。但需要根据具体情况选择合适的优化方法,并进行合理的测试和监控,以确保优化后的性能达到预期效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值