请问以下两种SQL中:
select name, sum(price) from tbl order by sum(price);对sum(price)计算了两次?
select name, sum(price) t from tbl order by t;对sum(price)计算了一次?
如何证明?谢谢!

解决方案 »

  1.   


    --首先,你的SQL语句就有问题
    --回答你的问题,我用执行计划来回答你
    --两种情况执行计划一样,不用说了撒,直观点,请看下面,你就知道结果了
    1、
     EXPLAIN PLAN FOR SELECT ename,Sum(sal) FROM emp GROUP BY ename ORDER BY Sum(sal);
     SELECT * FROM TABLE(dbms_xplan.display);Plan hash value: 1116508905                                                 
                                                                                
    ----------------------------------------------------------------------------
    | Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------
    |   0 | SELECT STATEMENT    |      |    16 |   176 |     5  (40)| 00:00:01 |
    |   1 |  SORT ORDER BY      |      |    16 |   176 |     5  (40)| 00:00:01 |
    |   2 |   SORT GROUP BY     |      |    16 |   176 |     5  (40)| 00:00:01 |
    |   3 |    TABLE ACCESS FULL| EMP  |    16 |   176 |     3   (0)| 00:00:01 |
    ----------------------------------------------------------------------------
    2、
     EXPLAIN PLAN FOR SELECT * FROM (SELECT ename,Sum(sal) t FROM emp GROUP BY ename) ORDER BY t;
     SELECT * FROM TABLE(dbms_xplan.display);Plan hash value: 1116508905                                                 
                                                                                
    ----------------------------------------------------------------------------
    | Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------
    |   0 | SELECT STATEMENT    |      |    16 |   176 |     5  (40)| 00:00:01 |
    |   1 |  SORT ORDER BY      |      |    16 |   176 |     5  (40)| 00:00:01 |
    |   2 |   SORT GROUP BY     |      |    16 |   176 |     5  (40)| 00:00:01 |
    |   3 |    TABLE ACCESS FULL| EMP  |    16 |   176 |     3   (0)| 00:00:01 |
    ----------------------------------------------------------------------------
      

  2.   

    语句错误
    select name,sum(price) from tb1 group by name order by sum(price) 
    select name,sum(price) t from tb1 group by name order by t
    两个是一样的,都是一次全表扫描
      

  3.   

    没什么区别一样的
    select name, sum(price) from tbl group by name order by sum(price);
    select name, sum(price) t from tbl group by name order by t
      

  4.   

    请问我用:
    SELECT * FROM TABLE(dbms_xplan.display);后发现结果是前几天我分析的那个表的结果,请问如何清空让其显示我现在使用EXPLAIN PLAN FOR SELECT ename,Sum(sal) FROM emp GROUP BY ename ORDER BY Sum(sal);得到的emp表分析呢?谢谢!
      

  5.   

    SQL语句中同一查询层次的同一函数执行时已经优化, 在同一时间一次执行http://blog.csdn.net/onemetre/archive/2010/11/02/5982848.aspx
      

  6.   

    请问我用:
    SELECT * FROM TABLE(dbms_xplan.display);后发现结果是前几天我分析的那个表的结果,请问如何清空让其显示我现在使用EXPLAIN PLAN FOR SELECT ename,Sum(sal) FROM emp GROUP BY ename ORDER BY Sum(sal);得到的emp表分析呢?谢谢!
      

  7.   

    请问如何清空SELECT * FROM TABLE(dbms_xplan.display);的表呢?
      

  8.   


    应该不会,执行explain plan for select ....就会将此查询语句的执行计划写到执行计划表中,然后再select * from table(),因此每次执行explain plan for都会更新的。你必须要先执行explain plan for 然后才查看
      

  9.   

    分析表后的结果:
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------
    ---------------------------------------------------------------------------
    | Id  | Operation                   |  Name       | Rows  | Bytes | Cost  |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT            |             |     1 |    69 |   114 |
    |*  1 |  TABLE ACCESS BY INDEX ROWID| TBL         |     1 |    69 |   114 |
    |*  2 |   INDEX RANGE SCAN          | DATEINDEX   |  4570 |       |    15 |
    ---------------------------------------------------------------------------
    Predicate Information (identified by operation id):
    ---------------------------------------------------
       1 - filter("TBL"."FLIGHT"='0985')
       2 - access("TBL"."C_DATE"=TO_DATE('03NOV10','DDMONYY'))
    Note: cpu costing is off请问这里|*  2 |   INDEX RANGE SCAN          | DATEINDEX   |  4570 |       |    15 |
    这行中的4570是什么意思?如果按照C_DATE"=TO_DATE('03NOV10','DDMONYY')查询当日应该有七千多记录,这里只有4570?
      

  10.   

    而且为什么使用SELECT * FROM TABLE(dbms_xplan.display);没有得到Plan hash value: 1116508905这样的值呢?谢谢!
      

  11.   

    楼主 在你sql文前面加上 这个  EXPLAIN PLAN FOR   
    然后再用查看执行计划就行了
      

  12.   

    我是在sql前面加上这个EXPLAIN PLAN FOR,但发现有的表分析后查看时没有rows、hash value这些值,不知道这些值的生成有没有啥前提条件?
      

  13.   

    没啥条件,这个就是自动生成的hash值,起标识作用而已啊
      

  14.   

    对于楼主的提出的问题,计算的次数,看到大家一开始就用执行计划解释这样问题,执行计划只是在数据库读写以及JOIN操作方面有一个详细流程以及执行时间显示,并不能说明oracle从内存或者说缓存中获取数据后有没有重新计算这一步骤。