类型:数据库类大小:42.1M语言:中文评分:4.2 tab:立即下载一些oracle sql的优化总结,自己记录下来,希望对大家有所帮助:
一:用在哪里,用得少;
二:当查找两个以上的表时,将记录较少的表放在右边;
第三,减少对表的访问次数;
4.当有where子查询时,子查询放在前面;
五:尽量避免在select语句中使用*(*在执行过程中会依次转换为列名);
六:使用提交;尽可能多;
七:Decode可以避免重复扫描相同的记录或重复连接相同的表;
八:sql效率也可以通过内部函数来提高;
九:连接多个表时,每个字段使用别名和前缀别名;
十:替换为存在
十一:not exists代替not in(not in语句会执行一次内部排序和合并,无论如何,not in是效率最低的,而且整个表都已经在子查询中扫描过了。为了避免使用not in,可以重写为外部联接或不存在);
十二:表连接比现有连接更有效;
十三:用现有取代不同的
示例:
低:高:
选择不同的部门编号、部门名称选择部门编号、部门名称
来自d部门,环境管理计划来自d部门
其中d . dept _ no=e . dept _ no;where exists(从emp e中选择1,其中e . dept _ no=d . dept _ no);
十四:使用TKPROF工具查询sql性能状态;
十五:使用索引提高效率(代价是:索引需要空间,需要定期重构索引:更改索引索引名rebuildtablespacename);
首先介绍索引的原理,以便于下面对索引优化的理解:
通过索引找到Rowid,然后通过rowid访问表。但是,如果查询的列包含在索引中,则不会执行第二个操作,因为检索到的数据存储在索引中,只有访问索引才能完全满足查询要求。
前言总结:在十六种情况下,REVOLT列有一个唯一的索引;MANAGER列上有一个非唯一索引。
十六:指数范围:
适用于两种情况:
1)基于一系列查询:
从住宿中选择住宿,住宿方式为' M% '
(where语句条件包括一系列值,oracle将通过索引范围查询来查询REVOLT _ PK)
2)基于非唯一索引的检索:
从经理为“李”的住宿中选择住宿;
(这个查询分为两步:$ MANAGER的索引范围查询获取所有符合条件的记录的rowid,然后通过rowid访问表,得到HOLT列的值。索引是非唯一引用,数据库无法对其执行索引唯一扫描)
在where语句中,如果索引列对应的值的第一个字符以通配符开头,则不采用索引,而是扫描整个表,如select.像李这样的经理
十七.基本表格的选择:
基本表:第一个被访问的表(通常通过全表扫描访问)。
根据不同的优化器,SQL语句中基本表的选择是不同的:
如果使用CBO,优化器将检查SQL语句中每个表的物理大小和索引状态,然后选择成本最低的路径。
如果使用RBO,并且所有连接条件都有索引对应,在这种情况下,基本表是FROM语句中的最后一个表
示例:
从工作人员A、住宿B中选择A .姓名、B .经理,其中A .住宿=B .住宿;
因为LOD列上有索引,而WORKER表中没有索引,所以WORKER表将用作查询基表。
十八:多个相等的索引:
当SQL语句的执行路径可以使用分布在多个表上的多个索引时,oracle将使用多个索引,并在运行时合并它们的记录,以检索仅对所有索引有效的记录。
Oracle选择执行路径,唯一索引高于非唯一索引,只有当索引列与where语句中的常量比较时才有效。如果将索引列与其他表的索引列进行比较,这句话在优化器中是非常低的;
如果要引用不同表中相同级别的两个索引,则根据FROM语句中表的顺序决定首先使用哪个索引。FROM语句中的最后一个表索引具有高优先级。如果将引用同一表中同一级别的两个索引,则where语句中第一个被引用的索引将具有最高优先级。
示例:DEPTNO有一个非唯一索引,EMP_CAT也有一个非唯一索引
从环境管理计划中选择环境管理计划,其中部门编号=20,环境管理计划类别=A;
将首先检索DEPTNO索引,然后与EMP_CAT索引检索的结果合并。执行路径如下:
电磁脉冲下按行标识的表格访问
AND _EQUAL
IDX省的索引范围扫描
卡特彼勒IDX的索引范围扫描
十九:平等比较和范围比较:
让我们从这个例子开始:
从环境管理计划中选择环境管理计划,其中部门编号20,环境管理计划类别=A;
(在两个非唯一索引的前提下)此时不使用范围索引,通过EMP_CAT索引查询记录,然后与DEPT_NO条件进行比较
注:唯一性,所以在做区间比较时,等级低于非唯一性指标的方程;
二十、强制索引失效:
如果两个或多个索引具有相同的排名,您可以强制oracle优化器使用其中一个。什么时候会使用这个策略?如果一个索引接近唯一,而另一个索引有许多重复值,排序和合并就会成为负担,后者可以被屏蔽,使其索引无效。
(无效方法:将计算“0”或“| |””添加到索引列中);