oracle sql 语句性能优化总结 2022-05-21 06:38 376阅读 0赞 Sql 优化: 当Oracle数据库拿到SQL语句时,其会根据查询优化器分析该语句,并根据分析结果生成查询执行计划。 也就是说,数据库是执行的查询计划,而不是Sql语句。 查询优化器有rule-based-optimizer(基于规则的查询优化器) 和Cost-Based-optimizer(基于成本的查询优化器)。 其中基于规则的查询优化器在10g版本中消失。 对于规则查询,其最后查询的是全表扫描。而CBO则会根据统计信息进行最后的选择。 1、先执行From ->Where ->Group By->Order By 2、执行From 字句是从右往左进行执行。因此必须选择记录条数最少的表放在右边。这是为什么呢? 3、对于Where字句其执行顺序是从后向前执行、因此可以过滤最大数量记录的条件必须写在Where子句的末尾,而对于多表之间的连接,则写在之前。 因为这样进行连接时,可以去掉大多不重复的项。 1. SELECT子句中避免使用(*)ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间 5、索引失效的情况: ① Not Null/Null 如果某列建立索引,当进行Select \* from emp where depto is not null/is null。 则会是索引失效。 ② 索引列上不要使用函数,SELECT Col FROM tbl WHERE substr(name ,1 ,3 ) = ‘ABC’ 或者SELECT Col FROM tbl WHERE name LIKE ‘%ABC%’ 而SELECT Col FROM tbl WHERE name LIKE ‘ABC%’ 会使用索引。 ③ 索引列上不能进行计算SELECT Col FROM tbl WHERE col / 10 > 10 则会使索引失效,应该改成 SELECT Col FROM tbl WHERE col > 10 \* 10 ④ 索引列上不要使用NOT ( != 、 <> )如:SELECT Col FROM tbl WHERE col ! = 10 应该 改成:SELECT Col FROM tbl WHERE col > 10 OR col < 10 。 6、用UNION替换OR(适用于索引列) union:是将两个查询的结果集进行追加在一起,它不会引起列的变化。 由于是追加操作,需要两个结果集的列数应该是相关的, 并且相应列的数据类型也应该相当的。union 返回两个结果集,同时将两个结果集重复的项进行消除。 如果不进行消除,用UNOIN ALL. 通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的例子中, LOC\_ID 和REGION上都建有索引. 高效: SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 UNION SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE REGION = “MELBOURNE” 低效: SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 OR REGION = “MELBOURNE” //如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面. 1. 用EXISTS替代IN、用NOT EXISTS替代NOT IN 在许多基于基础表的查询中, 为了满足一个条件, 往往需要对另一个表进行联接. 在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查询中, NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下, NOT IN都是最低效的(因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN, 我们可以把它改写成外连接(Outer Joins)或NOT EXISTS. 例子: 高效: SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X’ FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB’) 低效: SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB’) 8,优化GROUP BY: 提高GROUP BY 语句的效率,可以通过将不需要的记录在GROUP BY之前过滤掉。 下面两个查询返回相同结果但明显第二个效率更高。 低效: SELECT JOB,AVG(AGE) FROM TEMP GROUP BY JOB HAVING JOB = 'STUDENT' OR JOB = 'MANAGER'; 高效: SELECT JOB,AVG(AGE) FROM EMP WHERE JOB = 'STUDENT' OR JOB = 'MANAGER' GROUP BY JOB; 9、删除重复记录: DELETE FROM music m WHERE ROWID > (SELECT MIN(ROWID) FROM music u WHERE u.music_id = m.music_id)//(有待测试)
相关 SQL 语句性能优化 1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2,应尽量避免在 where 子句中对字段进行 null 值判 àì夳堔傛蜴生んèń/ 2021年06月24日 16:09/ 0 赞/ 637 阅读
相关 oracle SQL语句优化 一般的sql优化 (1)select语句中避免使用\ (2)使用where子句替代having子句 (3)使用truncate 代替delete 骑猪看日落/ 2021年09月23日 05:56/ 0 赞/ 386 阅读
相关 Oracle之SQL语句性能优化(34条优化方法) (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 drivin 分手后的思念是犯贱/ 2021年12月21日 06:29/ 0 赞/ 182 阅读
相关 Oracle SQL语句常见优化方法总结 1、SQL语句尽量用大写的; 因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。 2、使用表的别名: 当在SQL语句中连接多个表时, 尽量使用表 矫情吗;*/ 2022年05月14日 04:43/ 0 赞/ 126 阅读
相关 oracle-sql语句优化 oracle的SQL优化顺序: 1.减少数据访问(减少磁盘访问)-->2.返回更少数据(减少网络交互)-->3.减少交互次数(减少网络交互)-->减少CPU开销-->利用更多 小灰灰/ 2022年05月18日 09:51/ 0 赞/ 99 阅读
相关 oracle sql 语句性能优化总结 Sql 优化: 当Oracle数据库拿到SQL语句时,其会根据查询优化器分析该语句,并根据分析结果生成查询执行计划。 也就是说,数据库是执行的查询计划,而不是Sql语句。 今天药忘吃喽~/ 2022年05月21日 06:38/ 0 赞/ 377 阅读
相关 数据库SQL Server性能优化之SQL语句总结 1、不要使用select \ 在select中指定所需要的列,将带来的好处: (1)减少内存耗费和网络的带宽 (2)更安全 (3)给查询优化器机会从索引读取所有需 向右看齐/ 2022年05月31日 12:30/ 0 赞/ 205 阅读
相关 ORACLE优化SQL语句 换工作刚刚入职,公司要求学习这片文章。觉得挺给力,分享给各位网友。共同学习,共同进步吧! (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORAC 今天药忘吃喽~/ 2022年08月08日 13:43/ 0 赞/ 158 阅读
相关 Oracle SQL性能优化 [Oracle SQL性能优化][Oracle SQL] (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的 雨点打透心脏的1/2处/ 2022年08月13日 00:43/ 0 赞/ 154 阅读
还没有评论,来说两句吧...