zoukankan      html  css  js  c++  java
  • orcle:sql优化

    查询时将行较少的表连接到后面

     连接是使用完全限定的列引用

    多表连接的时候,为表创建别名,或者不创建,select语句指定属性在哪个列比不指定要好,不指定的话数据库需要搜索全部的表来获得列,即

    SELECT p1.col_name , p2.col_name
    FROM table_name p1, table_name p2
    WHERE expr1;

    两个 列都有指定在哪个表。

    添加表索引

     数据库索引用于查找表的特定行。索引的确定是当向表添加一行时,需要附加时间来更新新行的索引。

    oracle 数据库自动为表的主键和包含在唯一约束中(UNIQUE)的列创建索引。

    而在执行分级查询(包含 CONNECT BY 的查询),应该为 START WITH 和 CONNECT BY  子句所引用的列添加索引。

    http://www.cnblogs.com/Azhu/archive/2012/04/03/2431132.html 有一些 CONNECT BY  的分级查询用法。

    使用 WHERE 而不是HAVING

     WHERE 子句用于过滤行,HAVING 子句用于过滤行组。

    --BAD
    SELECT *
    FROM table_name
    GROUP BY column_name
    HAVING column_name IN ('1','2');
    --GOOD
    SELECT*
    FROM table_name
    WHERE column_name IN ('1','2')
    GROUP BY column_Name;

     这两个语句结果是一样的。

    但是下面的语句明显好很多。

    使用EXISTS 而不是 IN

    IN 用于检查一个值是否包含在列表中。

    EXISTS只检查行的存在性,而 IN 检查实际的值。

    eg: 查找一个在表一中的数据是否在表二中,如果是输出,

    生活例子:从商品表中查找已经被购买了的商品

    --BAD
    SELECT *
    FROM table_name1
    WHERE column_name IN
    ( SELECT column_name
      FROM table_name2)
    ;
    --GOOD
    SELECT*
    FROM table_name1 outer
    WHERE EXISTS
      (SELECT 1
      FROM table_name2 inner
      WHERE outer.column_name = inner.column_name)
    ;

    使用EXISTS 而不是DISTINCT

    DINSTINCT用于禁止重复行的显示

    这种情况是基于外表,就是数据来源的表没有重复行,内表用重复行的情况,用上面的例子

    eg: 查找一个在表一中的数据是否在表二中,如果是输出,表一不会有重复的数据,表二会有重复的数据

    生活例子:从商品表中查找已经被购买了的商品,这样商品列表唯一,但是购买商品是从客户那收集,会有商品被重复购买

    --BAD
    SELECT DISTINCT t1.column_name
    FROM table_name1 t1, table_name2 t2
    WHERE t1.column_name = t2.column_name;
    --GOOD
    SELECT column_name
    FROM table_name1 outer
    WHERE EXISTS
      (SELECT 1
      FROM table_name2 inner
      WHERE inner.column_name = outer.column_name)
    ;
  • 相关阅读:
    shell 10流程控制
    shell 9test命令
    shell 8字符串与文件内容处理
    shell 7输入输出
    shell 6基本运算符
    JS-JQ实现TAB选项卡
    JS-JQ实现页面滚动时元素智能定位(顶部-其他部位)
    js获取框架(IFrame)的内容
    codeforces 660C C. Hard Process(二分)
    codeforces 660B B. Seating On Bus(模拟)
  • 原文地址:https://www.cnblogs.com/Azhu/p/2454206.html
Copyright © 2011-2022 走看看