zoukankan      html  css  js  c++  java
  • oracle查询优化

    1. 排序合理查询条件

    Oracle自下而上分析顺序WHERE收条,从优化性能的角度。它建议,这些条件将能够过滤掉大量行书写的WHERE在条款结束,

    之间的连接条件置于其它WHERE子句之前,即对易排查的条件先做推断处理。这样在过滤掉尽可能多的记录后再进行等值连接,能够提高检索效率。

    比如:

    SELECT empno, ename, job, sal, dept.deptno, dname 

    FROM emp, dept 

    WHERE emp.deptno = dept.deptno AND emp.deptno = 20;

    要比下述语句的查询效率高一些:

    SELETE empno, ename, job, sal, dept.deptno, dname

    FROM emp, dept

    WHERE emp.deptno = 20 AND emp.deptno = dept.deptno;

    2.连接中使用表别名

    在进行连接查询时,建议在SQL语句中使用表的别名, 并把别名前缀与每一个字段上。

    这样能够降低解析的时间,并可避免因字段名存在歧义(使用多个

    表中出现的同名字段)而导致的语法错误。比例如以下述语句:

    SELECT e.empno, e.ename, e.job, e.sal, e.deptno, d.name

    FROM emp e, dept d

    WHERE e.deptno = d.deptno AND e.deptno = 20;

    3.用EXISTS替换DISTINCT

    在进行一对多关系的表间连接查询时,假设要剔除结果中的反复行。能够考虑使用EXISTS(结合子查询)替换DISTINCT。

    比如:

    SELECT deptno, dname FROM dept d WHERE EXIST (SELECT 'y' FROM emp e WHERE e.deptno = d.deptno);

    4.用WHERE替换HAVING

    因为SELECT语句的运行顺序为:先WHERE子句, 在GROUP BY 子句。 然后SELECT查询。 再后HAVINT子句,最后是ORDER BY子句,因此在进行分组

    查询时,假设过滤条件不涉及分组计算,则应该使用WHERE语句替换HAVING指定的过滤条件

    比如:

    SELECT deptno, avg(sal) FROM emp

    WHERE deptno IN (10, 20)

    GROUP BY deptno;

    效率会高于以下

    SELECT deptno, avg(sal) FROM emp

    GROUP BY deptno

    HAVING deptno IN (10, 20);

    当然。 假设分组查询的过滤条件设计分组计算,就仅仅能在HAVING子句中指定了。

    5.使用系统函数

    系统函数毕其实数据库厂商“专业人士”解。相对更可靠


    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    MFC单文档视图设置背景
    原来这就是命令行下的“学生信息管理系统”
    C语言中数组&取地址的问题
    《逐梦旅程-Windows游戏编程之从零开始》 勘误
    杭电ACM 1003 ( 动态规划法 水题)
    《编程之美》
    [蓝桥杯][2014年第五届真题]地宫取宝
    [蓝桥杯][2013年第四届真题]危险系数
    2142: 逛超市(zznuoj)
    2141:2333(zznuoj)
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4852194.html
Copyright © 2011-2022 走看看