热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQL语句优化方法30例(转)

SQL语句优化方法30例在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见OracleHINT的用法:1.*ALL_ROW




SQL语句优化方法30例




 





在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 HIREDATE


11. /*&#43;INDEX_JOIN(TABLE INDEX_NAME)*/ 

提示明确命令优化器使用索引作为访问路径. 

例如: 

SELECT /*&#43;INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE 

FROM BSEMPMS WHERE SAL<60000; 



12. /*&#43;INDEX_DESC(TABLE INDEX_NAME)*/ 

表明对表选择索引降序的扫描方法. 

例如: 

SELECT /*&#43;INDEX_DESC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO&#61;&#39;SCOTT&#39;; 



13. /*&#43;INDEX_FFS(TABLE INDEX_NAME)*/ 

对指定的表执行快速全索引扫描,而不是全表扫描的办法. 

例如: 

SELECT /*&#43;INDEX_FFS(BSEMPMS IN_EMPNAM)*/ * FROM BSEMPMS WHERE DPT_NO&#61;&#39;TEC305&#39;; 



14. /*&#43;ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,...*/ 

提示明确进行执行规划的选择,将几个单列索引的扫描合起来. 

例如: 

SELECT /*&#43;INDEX_FFS(BSEMPMS IN_DPTNO,IN_EMPNO,IN_SEX)*/ * FROM BSEMPMS WHERE EMP_NO&#61;&#39;SCOTT&#39; AND DPT_NO&#61;&#39;TDC306&#39;; 



15. /*&#43;USE_CONCAT*/ 

对查询中的WHERE后面的OR条件进行转换为UNION ALL的组合查询. 

例如: 

SELECT /*&#43;USE_CONCAT*/ * FROM BSEMPMS WHERE DPT_NO&#61;&#39;TDC506&#39; AND SEX&#61;&#39;M&#39;; 

16. /*&#43;NO_EXPAND*/ 

对于WHERE后面的OR 或者IN-LIST的查询语句,NO_EXPAND将阻止其基于优化器对其进行扩展. 

例如: 

SELECT /*&#43;NO_EXPAND*/ * FROM BSEMPMS WHERE DPT_NO&#61;&#39;TDC506&#39; AND SEX&#61;&#39;M&#39;; 



17. /*&#43;NOWRITE*/ 

禁止对查询块的查询重写操作. 



18. /*&#43;REWRITE*/ 

可以将视图作为参数. 



19. /*&#43;MERGE(TABLE)*/ 

能够对视图的各个查询进行相应的合并. 

例如: 

SELECT /*&#43;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&#61;V.DPT_NO 

AND A.SAL>V.AVG_SAL; 



20. /*&#43;NO_MERGE(TABLE)*/ 

对于有可合并的视图不再合并. 

例如: 

SELECT /*&#43;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&#61;V.DPT_NO AND A.SAL>V.AVG_SAL; 



21. /*&#43;ORDERED*/ 

根据表出现在FROM中的顺序,ORDERED使ORACLE依此顺序对其连接. 

例如: 

SELECT /*&#43;ORDERED*/ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C WHERE A.COL1&#61;B.COL1 AND B.COL1&#61;C.COL1; 



22. /*&#43;USE_NL(TABLE)*/ 

将指定表与嵌套的连接的行源进行连接,并把指定表作为内部表. 

例如: 

SELECT /*&#43;ORDERED USE_NL(BSEMPMS)*/ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO&#61;BSDPTMS.DPT_NO; 



23. /*&#43;USE_MERGE(TABLE)*/ 

将指定的表与其他行源通过合并排序连接方式连接起来. 

例如: 

SELECT /*&#43;USE_MERGE(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO&#61;BSDPTMS.DPT_NO; 



24. /*&#43;USE_HASH(TABLE)*/ 

将指定的表与其他行源通过哈希连接方式连接起来. 

例如: 

SELECT /*&#43;USE_HASH(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO&#61;BSDPTMS.DPT_NO; 



25. /*&#43;DRIVING_SITE(TABLE)*/ 

强制与ORACLE所选择的位置不同的表进行查询执行. 

例如: 

SELECT /*&#43;DRIVING_SITE(DEPT)*/ * FROM BSEMPMS,DEPT&#64;BSDPTMS WHERE BSEMPMS.DPT_NO&#61;DEPT.DPT_NO; 



26. /*&#43;LEADING(TABLE)*/ 

将指定的表作为连接次序中的首表. 



27. /*&#43;CACHE(TABLE)*/ 

当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端 

例如: 

SELECT /*&#43;FULL(BSEMPMS) CAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS; 



28. /*&#43;NOCACHE(TABLE)*/ 

当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端 

例如: 

SELECT /*&#43;FULL(BSEMPMS) NOCAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS; 



29. /*&#43;APPEND*/ 

直接插入到表的最后,可以提高速度. 

insert /*&#43;append*/ into test1 select * from test4 ; 



30. /*&#43;NOAPPEND*/ 

通过在插入语句生存期内停止并行模式来启动常规插入. 


insert /*&#43;noappend*/ into test1 select * from test4 ;

转载于:https://www.cnblogs.com/YSO1983/archive/2010/09/10/1823368.html



推荐阅读
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 本文介绍了Java中Hashtable的clear()方法,该方法用于清除和移除指定Hashtable中的所有键。通过示例程序演示了clear()方法的使用。 ... [详细]
author-avatar
FXHT4564_845
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有