oracle数据库sql的优化总结
SELECT LODGING FROM LODGING WHERE LODGING LIKE 'M%'
十九:等式比较与范围比较:
INDEX RANGE SCAN ON DEPT_IDX
先介绍下索引的原理,方便接下来对索引的优化的理解:
例:DEPTNO上有非唯一性索引,EMP_CAT也有非唯一性索引
SELECT A.NAME, B.MANAGER FROM WOKER A, LODGING B WHERE A.LODGING = B.LODGING;
where字句中,如果索引列所对应的值的第一个字符由通配符开始,索引将不被采用,而会全表扫描,如 SELECT..... WHERE MANAGER LIKE '%LI'
where d.dept_no = e.dept_no; where exists (select 1 from emp e where e.dept_no = d.dept_no);
由于LODGING列上有一个索引,而且WORKER表中没有相比较的索引,WORKER表将被作为查询基础表。
十:用exists代替in
十八:多个平等的索引:
from dept d, emp e from dept d
SELECT LODGING FROM LODGING WHERE MANAGER = 'LI';
六:尽量多的使用commit;
SELECT ENAME FROM EMP WHERE DEPT_NO = 20 AND EMP_CAT = 'A';
例:
前提提要:在十六例中,LODGING列有唯一索引;MANAGER列上有非唯一性索引。
例:
七:Decode可以避免重复扫描相同的记录或重复连接相同的表;
如果使用CBO,优化器会检查SQL语句中的每个表的物理大小,索引的状态,然后选用话费最低的路径。
(在两个非唯一性索引前提下)此时范围索引不被使用,通过EMP_CAT索引查询出记录再与DEPT_NO条件进行比较
oracle选择执行路径是,唯一索引等级高于非唯一索引,只有当where字句中索引列和常量比较才有效。如果索引列和其它表的索引列相比较,这种字句在优化器中等级非常低;
注意:唯一性所以做范围比较时,等级要比非唯一性索引的等式比较低;
TABLE ACCESS BY ROWID ON EMP
低: 高:
适用于两种情况:
先上例子:
select distinct dept_no, dept_name select dept_no, dept_name
十二:表连接比exists更高效;
2) 基于非唯一性索引的检索:
九:连接多个表时,使用别名并把别名前缀于每个字段上;
当SQL语句的执行路径可以使用分布在多个表上的多个索引时,oracle会同事使用多个索引并在运行时对它们的记录合并,检索仅对全部索引有效的记录。
十七:基础表的选择:
AND _EQUAL
(失效方式:对索引列加入计算'+0'或'||""');
如果使用RBO,并且所有的连接条件都有索引对应,这种情况下基础表就是FROM字句中列在最后的表
(where字句条件包括一系列的值,oracle将通过索引范围查询方式查询LODGING_PK)
(此查询分两步:LODGING$MANAGER的索引范围查询得到所有符合条件记录的rowid,然后通过rowid访问表得到LODGING列的值。该索引为非唯一性索 引,数据库不能对它执行索引唯一扫描)
如果不同表中两个相同等级的索引将被引用,根据FROM字句中表的顺序决定哪个先被使用。FROM字句中最后的表索引优先级高。如果相同表中两个相同等级的索引将被引用,where字句中最先被引用的索引将有最高的优先级。
五:select语句中尽量避免使用*(执行时会把*依次转换为列名);
INDEX RANGE SCAN ON CAT_IDX
十五:用索引提高效率(代价是:索引需要空间,而且定期重构索引很有必要:ALTER INDEX<INDEXNAME> REBUILD<TABLESPACENAME);
DEPTNO索引将被先检索,然后同EMP_CAT索引检索出的结果合并,执行路径如下:
SELECT ENAME FROM EMP WHERE DEPT_NO > 20 AND EMP_CAT = 'A';
十三:用exists替换distinct
通过索引找到rowid,然后通过rowid访问表。但如果查询的列包括在index中,将不在执行第二部操作,因为检索数据保存在索引中,单单访问索引就可以完全满足查询要求。
八:通过内部函数也可提高sql效率;
十四:使用TKPROF工具来查询sql性能状态;
十一:not exists代替 not in(not in 字句将执行一个内部的排序和合并,任何情况下,not in是最低效的,子查询中全表扫描了。为了避免使用not in,可以改写成outer joins或not exists);
二十:强制索引失效:
1)基于一个范围的查询:
如果两个或两个以上索引具有相同的等级,可以强制命令oracle优化器使用其中的一个。 那何时使用此种策略呢?如果一个索引已接近于唯一,而另一索引有很多重复的值,排序与合并反而会成为负担,此时可以屏蔽后者使其索引失效。
十六:索引范围查询(INDEX RANGE SACEN):
根据优化器的不同,SQL语句中基础表的选择是不一样的:
四:有where子查询时,子查询放在最前;
基础表:最先访问的表(通常以全表扫描的方式被访问)。
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://www.juheyunku.com/sql/oracle/2461.shtml
相关文章
热门TAG
命令 外链 企业网站 白帽 php 织梦教程 dedecms修改内容 javascript 织梦 功能 标签 调用 详解 技巧 权重 服务器 网站流量 Dedecms 织梦cms HTML tags标签 python jquery教程 jquery windows 蜘蛛 搜索引擎 网站收录 JSP 实例解析最新文章
-
OracleRAC的五大优势及其劣
时间:2021-01-05
-
Oracle优化器 自适应执行计
时间:2021-01-05
-
Oracle行内链接不会引起U
时间:2021-01-05
-
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
热门文章
-
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
