Oracle优化SQL语句的好处

数据库 Oracle
以下的文章主要阐述的是在Oracle优化SQL语句中,有很多的语句在优化后,在实际的操作中更加的灵活,以下就是正文介绍。

如果你想更好的了解Oracle优化SQL语句的话,你就必须的了解都有哪些SQL语句在Oracle中是经常被使用到的,以下就是Oracle优化SQL语句的相关内容的具体介绍,希望你在浏览完此篇文章之后会有会所了解。

用WHERE替代ORDER BY:

ORDER BY 子句只在两种严格的条件下使用索引。

ORDER BY中任何的列必须包含在相同的索引中并保持在索引中的排列顺序。

ORDER BY中任何的列必须定义为非空。

WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列。

例如: 表DEPT包含以下列:

 

  1. DEPT_CODE PK NOT NULL  
  2. DEPT_DESC NOT NULL  
  3. DEPT_TYPE NULL  

 

低效: (索引不被使用)

 

  1. SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE 

高效: (使用索引)

 

  1. SELECT DEPT_CODE FROM DEPT WHERE DEPT_TYPE > 0 

在Oracle优化SQL语句中应避免改变索引列的类型:

当比较不同数据类型的数据时, Oracle自动对列进行简单的类型转换。 假设 EMPNO是个数值类型的索引列:SELECT … FROM EMP WHERE EMPNO = ‘123'。 实际上,经过Oracle类型转换, 语句转化为: SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(‘123') 。

幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变。现在,假设EMP_TYPE是个字符类型的索引列:SELECT … FROM EMP WHERE EMP_TYPE = 123 。

这个语句被Oracle转换为: SELECT … FROM EMP WHERETO_NUMBER(EMP_TYPE)=123。因为内部发生的类型转换, 这个索引将不会被用到! 为了避免Oracle对您的SQL进行隐式的类型转换,最好把类型转换用显式表现出来。注意当字符和数值比较时,Oracle会优先转换数值类型到字符类型。

需要当心的WHERE子句:

某些SELECT 语句中的WHERE子句不使用索引。这里有一些例子:

(1)‘!=' 将不使用索引。记住, 索引只能告诉您什么存在于表中, 而不能告诉您什么不存在于表中。

(2)‘||'是字符连接函数。就象其他函数那样, 停用了索引。

(3)‘ '是数学函数。就象其他数学函数那样, 停用了索引。

(4)相同的索引列不能互相比较,这将会启用全表扫描。

(32)a. 假如检索数据量超过30%的表中记录数,使用索引将没有显着的效率提高。

b. 在特定情况下,使用索引也许会比全表扫描慢,但这是同一个数量级上的区别。而通常情况下,使用索引比全表扫描要块几倍乃至几千倍!

避免使用耗费资源的操作:

带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎执行耗费资源的排序(SORT)功能。DISTINCT需要一次排序操作,而其他的至少需要执行两次排序。通常,带有 UNION, MINUS , INTERSECT的SQL语句都能够用其他方式重写。假如您的数据库的SORT_AREA_SIZE调配得好。

使用UNION , MINUS, INTERSECT也是能够考虑的, 毕竟他们的可读性很强。

Oracle优化GROUP BY:

提高GROUP BY 语句的效率,能够通过将无需的记录在GROUP BY 之前过滤掉。下面两个查询返回相同结果但第二个明显就快了许多。

低效: SELECT JOB , AVG(SAL) FROM EMP GROUP JOB HAVING JOB = ‘PRESIDENT' OR JOB = ‘MANAGER' 高效: SELECT JOB , AVG(SAL) FROM EMP WHERE JOB = ‘PRESIDENT' OR JOB = ‘MANAGER' GROUP JOB

【编辑推荐】

  1. Oracle数据库缓冲区命中率的概述
  2. Oracle 10G for linux常用命令浅析
  3. Oracle 权限入门如何管理
  4. Oracle索引整理的详细描述
  5. Oracle merge into的实操示例
责任编辑:佚名 来源: 互联网
相关推荐

2009-03-04 09:06:56

优化sqlOracle

2010-04-12 10:53:07

Oracle SQL

2010-04-26 14:32:21

Oracle SQL

2011-05-20 15:59:06

Oracle存储Sql语句

2010-04-13 15:14:31

Oracle优化

2017-08-07 15:52:33

Oracleonnect by优化

2011-03-31 11:14:51

Sql语句优化

2009-11-16 13:47:35

Oracle SQL语

2010-04-15 16:36:13

Oracle SQL

2010-04-20 15:22:34

Oracle SQL

2009-01-14 09:28:12

OracleSQL10g

2010-04-29 14:06:40

Oracle SQL

2010-04-12 14:22:13

Oracle性能sql语句

2010-11-04 15:39:40

DB2 SQL语句

2009-11-16 17:55:58

Oracle SQL语

2010-04-15 16:16:33

Oracle SQL

2010-09-07 15:12:25

SQL语句优化

2010-04-06 14:26:41

Oracle复制表

2010-04-20 15:58:15

Oracle 语句

2018-01-09 16:56:32

数据库OracleSQL优化
点赞
收藏

51CTO技术栈公众号