• sql优化


    1、选择最有效率的表明顺序

    Oracle采用从右往左的顺序解析from子句中的表名,写在from子句后面的表将被优先处理。

    2where子句的链接顺序

    Oracle采用自下而上的顺序解析where子句,所以表之间的链接要写在where之前,能过滤掉大量记录的条件写在where的末尾。

    3、select语句避免使用*

    解析过程中会将*先转换成所有的列名,通过查询数据字典完成,非常耗时。

    4使用DECODE函数减少处理时间

    这个函数可以避免重复扫描相同记录或者重复连接相同的表。

     5、删除重复记录的最高效率语句

    DELETE FROM gcfr_t_vch E WHERE E.ROWID > (SELECT MIN(X.ROWID)

    FROM gcfr_t_vch X WHERE X.type = E.type);

    删除全表记录时使用truncate代替delete可以提高效率,不回滚。

    6、避免使用having

    Having只会在检索出所有记录之后再进行过滤,这个处理需要排序,总计等操作,耗时。尽量使用oracle内部函数来提高效率。

    7、使用exists代替innot exists代替not in

    In语句内部执行了排序,合并,对字表进行全表遍历,耗时。

    8、使用索引

    避免在索引列上使用not,遇到not就会停止使用索引而进行全表扫描。

    如果where子句中,索引列是函数的一部分,优化器将不使用索引。

    9、使用 >= 代替 >

    Select vchno from gcfr_t_vch where vchno >= 4;(高效率)

    Select vchno from gcfr_t_vch where vchno >3;(低效率)

    第一个语句dbms将直接跳到vchno=4的记录。后者是跳到等于3的记录,然后扫描大于3的记录。

    10、使用union代替or(使用与索引列)

    索引列遇到or将停止使用索引对全表扫描。

    11、避免使用is null   is not null

    停止使用索引

    12、避免改变索引列的类型

    当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换
    假设 EMPNO是一个数值类型的索引列
    SELECT FROM EMP WHERE EMPNO = 123' 
    实际上,经过ORACLE类型转换, 语句转化为

    SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(‘123') 
    幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变. 
    现在,假设EMP_TYPE是一个字符类型的索引列. 
    SELECT … FROM EMP WHERE EMP_TYPE = 123 
    这个语句被ORACLE转换为: 
    SELECT … FROM EMP WHERETO_NUMBER(EMP_TYPE)=123 
    因为内部发生的类型转换, 这个索引将不会被用到! 为了避免ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型。

    13、优化group by

    group by之前将不需要的记录过滤掉,提高效率。

    --低效率
    select job,avg(sal) from emp group by job having job = '1' or job = '2';
    
    --高效率
    select job,avg(sal) from emp where job = '1' or job = '2' group by job;

     

  • 相关阅读:
    javascirpt Scoket
    黑马程序员面试题(一)交通灯管理系统
    中软国际实习总结
    黑马程序员Java基础正则表达式
    黑马程序员Java基础加强Java高新技术
    黑马程序员JAVA基础GUI
    面试题(二)银行业务调度系统
    黑马程序员JAVA基础IO流之File 类
    黑马程序员JAVA基础IO流其他类
    黑马程序员Java基础网络编程
  • 原文地址:https://www.cnblogs.com/hkdpp/p/8302015.html
Copyright © 2020-2023  润新知