zoukankan      html  css  js  c++  java
  • 想要写出高性能sql语句,你得记住这些……

    1、在from子句中包含多个表名时,必须选择记录条数最少的表作为基础表;若有三个以上的表连接查询,那就需要选择交叉表作为基础表,交叉表指被其他表引用的表。

    2、使用exists代替in、使用not exists 代替not in
       高效:SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT 'X' ROM 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')

    3、当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换, EXISTS 使查询更为迅速,
       因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果。
       低效:SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D, EMP E WHERE D.DEPT_NO = E.DEPT_NO
       高效:SELECT DEPT_NO, DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT 'X' FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO)

    4、要避免在索引列上使用NOT。NOT会产生在和在索引列上使用函数相同的影响。 当ORACLE"遇到"NOT,他就会停止使用索引转而执行全表扫描。

    5、WHERE子句中,如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描
       低效:SELECT … FROM  DEPT  WHERE SAL * 12 > 25000
       高效: SELECT … FROM DEPT WHERE SAL > 25000/12

    6、用>=替代>。前者DBMS将直接跳到第一个等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个大于3的记录。

    7、避免在索引列上使用IS NULL和IS NOT NULL。避免在索引中使用任何可以为空的列。

    8、如果索引是建立在多个列上,只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 这也是一条简单而重要的规则,当仅引用索引的第二个
       列时,优化器使用了全表扫描而忽略了索引。

    9、某些SELECT 语句中的WHERE子句不使用索引。
       例子:(1)'!='将不使用索引。 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中
             (2)'||'是字符连接函数. 就象其他函数那样, 停用了索引
             (3)'+'是数学函数. 就象其他数学函数那样, 停用了索引
             (4)相同的索引列不能互相比较,这将会启用全表扫描

    10、a. 如果检索数据量超过30%的表中记录数,使用索引将没有显著的效率提高
        b. 在特定情况下,使用索引也许会比全表扫描慢, 但这是同一个数量级上的区别。而通常情况下,使用索引比全表扫描要快几倍乃至几千倍!

    11、避免使用耗费资源的操作。带有DISTINCT、UNION、MINUS、INTERSECT、ORDER BY的SQL语句会启动SQL引擎。执行耗费资源的排序(SORT)功能,DISTINCT需要一次排序操作、
        而其他的至少需要执行两次排序。通常, 带有UNION、 MINUS、INTERSECT的SQL语句都可以用其他方式重写。 如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION、
        MINUS、 INTERSECT也是可以考虑的、 毕竟它们的可读性很强。

    12、不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说
        如果某列存在空值,即使对该列建索引也不会提高性能。任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。

    13、通配符(%)在搜寻词首出现,索引将变的无效。即使用通配符尽量这样使用:like '关键词%'。

  • 相关阅读:
    关于global和$GLOBALS[]的一些实践
    java环境配置的新手教程
    echart图表 resize()方法使用
    使用git上传下载项目
    windows 系统新建 vue 项目的坑
    Java版求1000以内的完全数
    Java版经典兔子繁殖迭代问题——斐波那契(Fibonacci)数列
    Java版冒泡排序和选择排序
    AngularJS 动画总结
    Mac下sublime text 的“package control”安装
  • 原文地址:https://www.cnblogs.com/wangwust/p/6432209.html
Copyright © 2011-2022 走看看