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 '关键词%'。

  • 相关阅读:
    luogu 1865 数论 线性素数筛法
    洛谷 2921 记忆化搜索 tarjan 基环外向树
    洛谷 1052 dp 状态压缩
    洛谷 1156 dp
    洛谷 1063 dp 区间dp
    洛谷 2409 dp 月赛题目
    洛谷1199 简单博弈 贪心
    洛谷1417 烹调方案 dp 贪心
    洛谷1387 二维dp 不是特别简略的题解 智商题
    2016 10 28考试 dp 乱搞 树状数组
  • 原文地址:https://www.cnblogs.com/wangwust/p/6432209.html
Copyright © 2011-2022 走看看