oracle数据库SQL优化综述
二:当检查多于两个表时,在右边放置较少的记录。
三:减少访问表的次数;
四:当有子查询,子查询放在前面。
五:避免在SELECT语句中使用*(执行将依次将*转换为列名);
六:尽可能多地使用提交。
七:解码可以避免重复扫描同一记录或重复同一表;
八:通过内部功能还可以提高sql的效率。
九:当连接多个表时,在每个字段上使用别名和前缀别名。
十:替换存在
十一:不存在而不是不在(不在子句中)将执行内部排序和合并。在任何情况下,不是最无效的,而是在子查询中对整个表进行扫描。为了避免不使用,它可以重写成外部连接或不存在)。
十二:表连接比现有的效率更高。
十三:替换存在
例:
低:高:
选择不同的dept_no,dept_name选择dept_no,dept_name
D部,D部EMP E
在d.dept_no = e.dept_no;存在(选择1从EMP在e.dept_no = d.dept_no);
十四:使用tkprof工具查询的SQL性能状态;
十五:提高索引效率(成本:索引需要空间,有必要重构指数规律:ALTERINDEXREBUILD < tablespacename);
首先介绍了下一个索引的原理,以便于理解索引的优化。
rowid是由指数发现,然后表通过rowid访问。但如果查询的列包含在索引,则不会执行第二操作,因为检索数据存储在索引和访问索引就可以满足查询要求。
先决条件:在十六种情况下,住宿列具有唯一的索引;管理列具有非唯一索引。
十六:索引范围查询(索引范围sacen):
适用于两种情况:
1)基于一系列查询:
从倒伏率为%的住宿处选择住宿
(WHERE子句条件包括一系列的值,Oracle将通过索引范围查询。查询lodging_pk)
2)基于非唯一索引的检索:
选择住宿的住宿的地方,经理=李';
此查询分为两步:倒伏$经理指数范围查询得到所有的rowid,符合要求,然后通过ROWID访问表倒伏列值。该指数是一个非唯一索引和数据库不能执行一个唯一索引扫描它。
在哪里的话,如果对应的索引列的值从第一个字符的通配符,索引不会被使用,它会扫描整个表,如选择…经理喜欢%李。
十七:基本表的选择:
基本表:第一个访问表(通常在一个完整的表扫描中访问)。
根据优化器的不同,SQL语句中的基表的选择是不同的。
如果使用CBO,优化器将检查SQL语句中每个表的物理大小、索引的状态,然后选择具有最低成本的路径。
如果是使用RBO,和所有连接条件指标,相应的,在这种情况下,基表中的列上表从句子
例:
选择a.name,从工人一b.manager,住宿在哪里a.lodging = b.lodging;
因为在倒伏列上有一个索引,而且在工作表中没有比较索引,所以工作表将被用作查询的基表。
十八:多重相等索引:
当SQL语句的执行路径可用于在多个表上分配多个索引时,Oracle将使用同事的多个索引,并在运行时合并其记录,以便仅检索所有索引的有效记录。
Oracle选择执行路径是唯一的索引级别高于非唯一索引,只有当索引列和WHERE语句中的常量比较有效时。如果索引列与另一个表的索引列进行比较,优化器中的语句是非常低的。
如果在不同表的同级别两指标的参考,这是第一个根据在句子中的顺序表的应用。在从句子的最后一个表的索引具有高优先级。如果在同一张桌子同级别的两个指标为参考,在哪里的句子会具有最高优先级的第一参考指标。
例如:有一个非唯一索引的表,和emp_cat具有非唯一索引。
选择从EMP在dept_no = 20和emp_cat =一个';
deptno索引将被检索的第一然后合并结果的emp_cat索引检索和执行路径如下:
通过rowid对EMP表访问
和_equal
索引范围扫描dept_idx
索引范围扫描cat_idx
十九:平等与范围比较的比较:
第一个例子:
选择从EMP在dept_no > 20和emp_cat =姓名;
(两非唯一索引的前提下)的范围是不能用在这个时候,和记录查询通过emp_cat指标并与dept_no条件相比。
注意:当比较唯一性时,水平低于非唯一索引。
二十:强制索引失败:
如果两个或两个以上索引具有相同的级别,则可以强制命令Oracle优化器使用其中一个索引,您是什么时候使用这个策略的如果一个索引接近一个索引,而另一个索引有许多重复的值,排序和合并将成为一个负担。此时,后者可以被屏蔽,索引无效。
(加+ 0或| |计算失效模式的列的索引);