zoukankan      html  css  js  c++  java
  • SQL Trainning 总结

    SQL Trainning 总结
    1,Oracle 使用索引更快的遍历表,如果SQL不合理,就会造成优化器删去索引而使用全表扫描,这种SQL就是劣质SQL。
    1.不要要Oracle 做的太多;
         1)避免复杂的多表关联;
         2)避免使用*;
         3)避免使用好用资源的操作:Distinct、UNION、MINUS、INTERSET、ORDER BY 等。
              使用EXISTS 替换 DISTINCT
              使用Union ALL 替代UNION(如果必要)
              

    2.给优化器以明确的命令;
         自动选择索引
         至少要包含组合索引的第一列
         避免在索引上使用函数
         避免使用前置通配符
         避免在索引列上使用NOT
         避免在索引上使用Is NULL 和 IS NOT NULL
         避免出现索引列自动转换
         在查询时尽量少用格式转换
         
         
    3.减少访问次数;
         使用DECODE 来减少处理时间
         减少对表的查询
                 低效
              SELECT TAB_NAME
              FROM TABLES
              WHERE TAB_NAME = ( SELECT TAB_NAME
                                    FROM TAB_COLUMNS
                                    WHERE VERSION = 604)
              AND DB_VER= ( SELECT DB_VER
                               FROM TAB_COLUMNS
                               WHERE VERSION = 604)
         高效
           SELECT TAB_NAME
              FROM TABLES
              WHERE  (TAB_NAME,DB_VER)
              = ( SELECT TAB_NAME,DB_VER)
                       FROM TAB_COLUMNS
                       WHERE VERSION = 604)   
    4.细节上的影响。
         WEHRE 字句应该将筛选、返回结果集小的放在最后;
         WHERE字句使用合理的函数和表达式
         ORDER BY 使用索引列,没有的要建立,
         联结列不使用索引
         通配符的like 语句,不应该出现在词首
         WHERE 代替HAVING
         NOT Exist 〉 NOT IN 的效率,都不使用索引
         >= 代替 >
         例子:
    select * from employee where salary <> 3000;

    对这个查询,可以改写为不使用NOT:
    select * from employee where salary<3000 or salary>3000;
           
         外部链接的用法:

         外部联接"+"按其在"="的左边或右边分左联接和右联接。若不带"+"运算符的表中的一个行不直接匹配于带"+"预算符的表中的任何行,则前者的行与后者中的一个空行相匹配并被返回。利用外部联接"+",可以替代效率十分低下的 not in 运算,大大提高运行速度。例如,下面这条命令执行起来很慢:

    select a.empno from emp a where a.empno not in

         (select empno from emp1 where job='SALE');

    利用外部联接,改写命令如下:

    select a.empno from emp a ,emp1 b
    where a.empno=b.empno(+)
    and b.empno is null
    and b.job='SALE';

         这样运行速度明显提高.
         
         多使用COMMIT,用TRUNCATE替代DELETE
         
         COUNT(*) > COUNT(1)
     






  • 相关阅读:
    qt QTimer 计时器
    qt DateTime 计算时间
    c++ win32 关机 注销 重启
    uniapp 修改meta:viewport
    初次使用 VUX
    移动端web app自适应布局探索与总结
    前端js模版 预编译工具Tmod js使用入门
    谷歌 Uncaught SecurityError: Failed to execute 'replaceState' on 'History 错误
    H5 前端页面适配响应式
    微信video标签全屏无法退出bug 本文系转载
  • 原文地址:https://www.cnblogs.com/hijushen/p/4234607.html
Copyright © 2011-2022 走看看