zoukankan      html  css  js  c++  java
  • 标量子查询 子查询执行次数计算公式

    select a.username,(select count(*) from all_objects b where b.owner=a.username) cnt from all_users a;
    
    create table a as select * from all_users;
    
    create table b as select * from all_objects;
    
    
    select a.username,(select count(*) from b where b.owner=a.username) cnt from a;
    
    
    SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
    
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    SQL_ID	2q0bhbzak85z9, child number 0
    -------------------------------------
    select a.username,(select count(*) from b where b.owner=a.username) cnt
    from a
    
    Plan hash value: 3049668959
    
    ----------------------------------------------------------------------------------------------
    | Id  | Operation	   | Name | Starts | E-Rows | A-Rows |	 A-Time   | Buffers | Reads  |
    ----------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |	  |	 1 |	    |	  36 |00:00:00.01 |	  6 |	   0 |
    |   1 |  SORT AGGREGATE    |	  |	36 |	  1 |	  36 |00:00:01.09 |   36756 |  36648 |
    |*  2 |   TABLE ACCESS FULL| B	  |	36 |	780 |  43773 |00:00:01.02 |   36756 |  36648 |
    |   3 |  TABLE ACCESS FULL | A	  |	 1 |	 36 |	  36 |00:00:00.01 |	  6 |	   0 |
    ----------------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - filter("B"."OWNER"=:B1)
    
    Note
    -----
       - dynamic sampling used for this statement (level=2)
    
    
    25 rows selected.
    
    标量子查询会执行传入的值 DISTINCT那么多次,这里传入的值是a.username 就是distinct(a.username)次
    
    
    SQL> 
    select count(distinct a.username) from a;SQL> 
    
    COUNT(DISTINCTA.USERNAME)
    -------------------------
    		       36
    
    
    改写成左链接:
    
    
    
      select a.username,nvl(b.cnt,0) from a left join (select count(*) cnt ,b.owner from b group by b.owner ) b
      on b.owner = a.username
      
      select a.username,count(b.owner) from  a left join  b on b.owner=a.username group by a.username
    
    
    
    
    
    
    
    
    
    

  • 相关阅读:
    upc组队赛16 Melody【签到水】
    upc组队赛16 WTMGB【模拟】
    upc组队赛15 Supreme Number【打表】
    upc组队赛15 Lattice's basics in digital electronics【模拟】
    upc组队赛15 Made In Heaven【第K短路 A*】
    upc组队赛14 As rich as Crassus【扩展中国剩余定理】
    upc组队赛14 Floating-Point Hazard【求导】
    upc组队赛14 Communication【并查集+floyd /Tarjan】
    upc组队赛14 Bus stop【签到水】
    2018/12/7 数据库事务和分布式事务
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13352331.html
Copyright © 2011-2022 走看看