我觉得如果(select s.cs_code, s.apply_telno from srv_mst s 
                  where s.apply_telno like '06%')
的结果集比srv_mst有明显减少的话,2比1效率要高,因为这样表间关联的次数会少很多。

解决方案 »

  1.   

    用explain plan比较一下看看?
      

  2.   

    有关文档说是like的效率最低,你这样写的话,可能第二种更慢,出现了子查询,而子查询中还是有like!
      

  3.   

    謝謝諸位!我覚得与「Like」或「索引」没有太大関係吧?
    因為若建了索引、両種写法都能利用索引或不用索引、表的前提条件是相同的。関鍵是:両種SQL語句的不同写法、那個効率高呀?
      

  4.   

    第一种情况下,对cs_mst、srv_mst 的 cs_code 字段建立索引,并对srv_mst的apply_telno 字段建立索引,查询效率会高于后者。通常情况下,应尽可能用连接的方式来替换子查询方式的SQL语句。
      

  5.   

    在同种情况下,2相对要比1要快些:随便举个例子
    A表:1000条,B表2000,B表like可以得到10
    1:(1000*20000)*2(like需要全集合扫描) = 20000000次
    2: 1000 * 10 +20000(like的扫描次数) = 21010次
      

  6.   

    你先确定你是使用rbo还是cbo呀!
    比较的大前提都没有确定,就来谈那个更好,有点早吧!
      

  7.   

    圣凤凰,explain plan看不出来的,有可能是完全一样的。如何建立索引,LIKE后记录集缩小多少百分点,这些都要具体情况具体分析吧。而且执行第二次是两者效率的相差有可能就很微小很微小了。
      

  8.   

    如果apply_telno是索引的话,
    两个SQL没有区别.
      

  9.   

    首先,评价SQL最好就是看执行计划,看逻辑读,他们不会骗你,如果两条SQL的执行计划和逻辑读完全相同,那你基本可以认定两条SQL对于ORACLE没有任何区别。其次,你的这两个SQL在同一环境下执行,效率是没有区别的。最后,纠正一些朋友的误区,形如第一条SQL的句子,ORACLE是会尽量先过滤两个数据集数据然后在JOIN的(并不是先做两个表的join在过滤数据的)。
      

  10.   

    要具体情况具体分析,SQL的效率跟表、索引结构,数据量等因素都有关系。
      

  11.   

    「执行计划」来了! 两種方法写的SQL語句的「执行计划」完全相同↓Plan Table
    --------------------------------------------------------------------------------
    | Operation                 |  Name    |  Rows | Bytes|  Cost  | Pstart| Pstop |
    --------------------------------------------------------------------------------
    | SELECT STATEMENT          |          |    16 |    1K|      4 |       |       |
    |  HASH JOIN                |          |    16 |    1K|      4 |       |       |
    |   TABLE ACCESS BY INDEX RO|SRV_MST   |    16 |  400 |      2 |       |       |
    |    INDEX RANGE SCAN       |PK_SRVMST |    16 |      |      1 |       |       |
    |   TABLE ACCESS FULL       |CS_MST    |    22 |    1K|      1 |       |       |
    --------------------------------------------------------------------------------
      

  12.   

    上面的格式太乱、再貼! 两種方法写的SQL語句的「执行计划」完全相同↓Plan Table
    -------------------------------------------------------------------
    |Operation                 |  Name   |Rows|Bytes|Cost|Pstart|Pstop|
    -------------------------------------------------------------------
    |SELECT STATEMENT          |         | 16 |   1K|  4 |      |     |
    | HASH JOIN                |         | 16 |   1K|  4 |      |     |
    |  TABLE ACCESS BY INDEX RO|SRV_MST  | 16 | 400 |  2 |      |     |
    |   INDEX RANGE SCAN       |PK_SRVMST| 16 |     |  1 |      |     |
    |  TABLE ACCESS FULL       |CS_MST   | 22 |   1K|  1 |      |     |
    -------------------------------------------------------------------
      

  13.   

    呵呵,说通俗点,执行计划就是ORACLE眼中的最终执行的SQL
    不论你眼中上面两个SQL有什么区别,但最终执行计划是一样的,也就是说对于你现在这个环境下的ORACLE来说他们是一样的。影响执行计划的条件很多,我们可以改变它。
    但你现在这两条简单的SQL,在你这个默认环境下是相同的。
      

  14.   

    影响执行计划的条件很多,我们可以改变它。
    但你现在这两条简单的SQL,在你这个默认环境下是相同的。
    是啊。我觉得这位大哥说的有道理。
    只要要求不是很高只要能实现功能就可以了。
    不过本人觉得第一种写法效率比较高。
      

  15.   

    还有我觉得这两种写法。在具体ORACLE执行的时候
    算法肯定是不一样的。所以肯定有效率的区别了/