SQL> select count(*) from (select id from t group by id);  COUNT(*)
----------
      2000已用时间:  00: 00: 00.20Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   SORT (AGGREGATE)
   2    1     VIEW
   3    2       SORT (GROUP BY)
   4    3         TABLE ACCESS (FULL) OF 'T'SQL> select count(*) from (select distinct id from t);  COUNT(*)
----------
      2000已用时间:  00: 00: 00.20Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   SORT (AGGREGATE)
   2    1     VIEW
   3    2       SORT (UNIQUE)
   4    3         TABLE ACCESS (FULL) OF 'T'差别不大,都是进行全表扫描 然后排序

解决方案 »

  1.   

    200W记录的表test_table,对于结果集较大的col1字段,效率差不多,但对于结果集小的col2,group by的效率明显比distinct高SQL> select count(*) from test_table;  COUNT(*)
    ----------
       2391165已用时间:  00: 00: 46.06Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE
       1    0   SORT (AGGREGATE)
       2    1     TABLE ACCESS (FULL) OF 'test_table'
    SQL> select count(*) from ( select distinct col1 from test_table);  COUNT(*)
    ----------
       2391066已用时间:  00: 00: 13.00Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE
       1    0   SORT (AGGREGATE)
       2    1     VIEW
       3    2       SORT (UNIQUE)
       4    3         TABLE ACCESS (FULL) OF 'test_table'
    SQL> select count(*) from ( select col1 from test_table group by col1);  COUNT(*)
    ----------
       2391066已用时间:  00: 00: 12.07Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE
       1    0   SORT (AGGREGATE)
       2    1     VIEW
       3    2       SORT (GROUP BY)
       4    3         TABLE ACCESS (FULL) OF 'test_table'
    SQL> select count(*) from ( select distinct col2 from test_table);  COUNT(*)
    ----------
             5已用时间:  00: 00: 02.06Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE
       1    0   SORT (AGGREGATE)
       2    1     VIEW
       3    2       SORT (UNIQUE)
       4    3         TABLE ACCESS (FULL) OF 'test_table'SQL> select count(*) from ( select col2 from test_table group by col1);  COUNT(*)
    ----------
       2391066已用时间:  00: 00: 12.07Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE
       1    0   SORT (AGGREGATE)
       2    1     VIEW
       3    2       SORT (GROUP BY)
       4    3         TABLE ACCESS (FULL) OF 'test_table'
      

  2.   

    真丢丢,语句写错了,2个效率基本一样,没啥区别
    SQL> select count(*) from ( select distinct col2 from test_table);  COUNT(*)
    ----------
             5已用时间:  00: 00: 02.07Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE
       1    0   SORT (AGGREGATE)
       2    1     VIEW
       3    2       SORT (UNIQUE)
       4    3         TABLE ACCESS (FULL) OF 'test_table'
    SQL> select count(*) from ( select col2 from test_table group by col2);  COUNT(*)
    ----------
             5已用时间:  00: 00: 02.07Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE
       1    0   SORT (AGGREGATE)
       2    1     VIEW
       3    2       SORT (GROUP BY)
       4    3         TABLE ACCESS (FULL) OF 'test_table'
      

  3.   

    这两个语句oracle内部都优化成同一语句执行的.
    所以简单的表面测试看不出任何差别.