Oracle 语句优化分析说明第1/2页
1. ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中的表名,因此 FROM 子句中写在最后的表(基础表 driving table)将被最先处理。在 FROM 子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。
WHERE SAL > 25000/12;
FROM TAB_COLUMNS
AND SAL > 50000
HAVING 中的条件一般用于对一些集合函数的比较,如 COUNT() 等等。除此而外,一般的条件应该写在 WHERE 子句中。
低效:
FROM DEPT D
SELECT REGION,AVG(LOG_SIZE)
当你想在 SELECT子句中列出所有的 COLUMN时,使用动态 SQL列引用 ‘*' 是一个方便的方法。不幸的是,这是一个非常低效的方法。 实际上,ORACLE 在解析的过程中,会将‘*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
FROM EMP E
SELECT TAB_NAME
FROM EMP E
WHERE D.DEPT_NO = E.DEPT_NO
(低效,执行时间 156.3秒)
WHERE LOC = ‘MELB')
GROUP BY REGION
高效
(高效,执行时间 10.6秒)
SELECT DISTINCT DEPT_NO,DEPT_N
FROM EMP (基础表)
SELECT …
WHERE MGR=E.EMPNO);
中使用 DISTINCT. 一般可以考虑用 EXIST 替换
FROM EMP E
GROUP BY REGION
低效:
例如:
选择 TAB2作为基础表 (不佳的方法)
(Column歧义指的是由于 SQL中不同的表具有相同的 Column名,当 SQL语句中出现这个 Column时,SQL解析器无法判断这个 Column的归属)
SELECT …
WHERE MGR=E.EMPNO)
FROM EMP E
WHERE REGION REGION != ‘SYDNEY'
在含有子查询的 SQL语句中,要特别注意减少对表的查询。
AND DEPT_CAT = ‘A' ;
7. 用WHERE子句替换HAVING子句
WHERE (TAB_NAME,DB_VER)
FROM TABLES
SELECT DEPT_NO,DEPT_NAME
SELECT …
SELECT ENAME
WHERE D.DEPT_NO = E.DEPT_NO
(方法二: 最高效)
WHERE VERSION = 604)
SELECT *
WHERE DEPT_NO = E.DEPT_NO
5. 删除重复记录
8. 减少对表的查询
表 TAB1 16,384 条记录
WHERE EXISTS (SELECT ‘X'
FROM DEPT
通常来说 ,采用表连接的方式比 EXISTS 更有效率
低效
例如:
高效:
AND B.DEPT_NO IS NULL
FROM DEPT D
FROM DEPT
10. 用EXISTS替代IN
FROM LOCATION
13. 用EXISTS替换DISTINCT
WHERE A.DEPT_NO = B.DEPT(+)
最高效的删除重复记录方法 ( 因为使用了 ROWID)
(方法一: 高效)
:这是一个非常实用的规则,请务必牢记
WHERE 25 < (SELECT COUNT(*) FROM EMP
HAVING REGION REGION != ‘SYDNEY'
避免使用 HAVING子句,HAVING 只会在检索出所有记录之后才对结果集进行过滤。
SELECT ENAME
当在 SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个 Column上。这
FROM TAB_COLUMNS
AND 25 < (SELECT COUNT(*) FROM EMP
种情况下, 使用 EXISTS(或 NOT EXISTS)通常将提高查询的效率。
当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在 SELECT 子句
SELECT …
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这
和一般的观点相反,count(*) 比 count(1)稍快,当然如果可以通过索引检索,对索
FROM EMP E
WHERE NOT EXISTS (SELECT ‘X'
14. 避免在索引列上使用计算
WHERE DEPT_NO NOT IN (SELECT DEPT_NO
WHERE EMPNO > 0
AND REGION != ‘PERTH'
表 TAB2 1 条记录
WHERE E.DEPT_NO = D.DEPT_NO);
AND REGION != ‘PERTH'
11. 用NOT EXISTS替代 NOT IN
9. 使用表的别名ALIAS
AND DEPT_CAT = ‘A');
WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X
例如:
样一来,就可以减少解析的时间并减少那些由 Column歧义引起的语法错误。
WHERE SAL > 50000
SELECT REGION,AVG(LOG_SIZE)
FROM EMP (基础表)
低效
AND DB_VER= ( SELECT DB_VER
FROM EMP A,DEPT B
= ( SELECT TAB_NAME,DB_VER)
例如:
FROM DEPT
select count(*) from tab1,tab2 执行时间 0.96秒
FROM TABLES
FROM DEPT
AND JOB = ‘MANAGER'
在子查询中, NOT IN子句将执行一个内部的排序和合并。 无论在哪种情况下, NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历)。 为了避免使用 NOT IN ,我们可以把它改写成外连接(Outer Joins)或 NOT EXISTS.
选择 TAB2作为基础表 (最好的方法)
3. SELECT子句中避免使用'*'
WHERE EXISTS ( SELECT ‘X'
WHERE EMPNO > 0
高效:
引列的计数仍旧是最快的。 例如 COUNT(EMPNO)
2. ORACLE 采用自下而上的顺序解析 WHERE 子句,根据这个原理,表之间的连接必须写在其他 WHERE 条件之前, 那些可以过滤掉最大数量记录的条件必须写在 WHERE 子句的末尾。
12. 用表连接替换EXISTS
WHERE DEPT_CAT='A');
例如:
SELECT …
WHERE VERSION = 604)
高效
AND JOB = ‘MANAGER';
AND DEPT_CAT = ‘A');
SELECT ….
WHERE DEPT.DEPTNO = EMP.DEPTNO
为了提高效率。改写为:
WHERE X.EMP_NO = E.EMP_NO);
AND LOC = ‘MELB')
SELECT *
AND B.DEPT_CAT(+) = ‘A'
举例:
WHERE TAB_NAME = ( SELECT TAB_NAME
4. 使用DECODE 函数来减少处理时间, 使用 DECODE 函数可以避免重复扫描相同记录或重复连接相同的表。
(更高效)
FROM DEPT
低效:
FROM DEPT D,EMP E
WHERE SAL * 12 > 25000;
6. 计算记录条数
WHERE 子句中,如果索引列是函数的一部分。优化器将不使用索引而使用全表扫描。
这个处理需要排序,总计等操作。 如果能通过 WHERE 子句限制记录的数目,那就能减少这方面的开销。
SELECT ….
WHERE E.DEPT_NO = D.DEPT_NO
WHERE VERSION = 604)
AND DEPTNO IN (SELECT DEPTNO
select count(*) from tab2,tab1 执行时间 26.09秒
SELECT TAB_NAME
FROM DEPT D,EMP E
高效:
FROM LOCATION
AND EXISTS (SELECT ‘X'
FROM DEPT
FROM TAB_COLUMNS
DELETE FROM EMP E
FROM EMP
相关热词: oracle
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://www.juheyunku.com/sql/oracle/2914.shtml
相关文章
热门TAG
命令 权重 外链 企业网站 白帽 php 织梦教程 dedecms修改内容 javascript 织梦 功能 标签 调用 详解 服务器 网站流量 实例解析 Dedecms 织梦cms HTML tags标签 python jquery教程 jquery windows SEO优化 蜘蛛 搜索引擎 网站收录 JSP最新文章
-
Window下Oracle Database 11g 发行
时间:2020-12-29
-
Oracle如何实现like多个值的
时间:2020-12-29
-
maven添加oracle依赖失败问题
时间:2020-12-29
-
OracleRAC基本概念及入门
时间:2020-12-29
-
Azure File Storage 基本用法
时间:2020-12-26
-
Oracle 权限(grant revoke)
时间:2020-12-26
-
Azure Queue Storage 基本用法
时间:2020-12-26
-
如何对比迁移前后的Orac
时间:2020-12-26
热门文章
-
Azure Queue Storage 基本用法 Azure Storage 之
时间:2020-12-26
-
Oracle存储过程编程详解
时间:2020-12-07
-
win10下oracle 11g安装图文教程
时间:2020-12-25
-
oracle 数据库学习 基本结构介绍
时间:2020-12-13
-
Azure File Storage 基本用法 Azure Storage 之 F
时间:2020-12-26
-
windows使用sqlpus连接oracle 数据库的教程图
时间:2020-12-25
-
Window下Oracle Database 11g 发行版2安装教程
时间:2020-12-29
-
Oracle解锁的方式介绍
时间:2020-12-14
-
linux下oracle设置开机自启动实现方法
时间:2020-12-13
-
Oracle学习记录之使用自定义函数和触发器
时间:2020-12-07
