性能优化------count(*)与count(列)哪个更快

构造数据
SQL> drop table t purge;


Table dropped.


SQL> create table t as select * from dba_objects;


Table created.

SQL> set timing on
SQL> set autot on
SQL> select count(*) from t;


  COUNT(*)
----------
     86362


Elapsed: 00:00:00.03


Execution Plan
----------------------------------------------------------
Plan hash value: 2966233522


-------------------------------------------------------------------
| Id  | Operation    | Name | Rows  | Cost (%CPU)| Time   |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |   | 1 |   344   (1)| 00:00:05 |
|   1 |  SORT AGGREGATE    |   | 1 |        |   |
|   2 |   TABLE ACCESS FULL| T   | 96296 |   344   (1)| 00:00:05 |
-------------------------------------------------------------------


Note
-----
   - dynamic sampling used for this statement (level=2)




Statistics
----------------------------------------------------------
  4  recursive calls
  0  db block gets
       1311  consistent gets
       1233  physical reads
  0  redo size
528  bytes sent via SQL*Net to client
523  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  0  sorts (memory)
  0  sorts (disk)
  1  rows processed


SQL> /


  COUNT(*)
----------
     86362


Elapsed: 00:00:00.03


Execution Plan
----------------------------------------------------------
Plan hash value: 2966233522


-------------------------------------------------------------------
| Id  | Operation    | Name | Rows  | Cost (%CPU)| Time   |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |   | 1 |   344   (1)| 00:00:05 |
|   1 |  SORT AGGREGATE    |   | 1 |        |   |
|   2 |   TABLE ACCESS FULL| T   | 96296 |   344   (1)| 00:00:05 |
-------------------------------------------------------------------


Note
-----
   - dynamic sampling used for this statement (level=2)




Statistics
----------------------------------------------------------
  0  recursive calls
  0  db block gets
       1236  consistent gets
       1233  physical reads
  0  redo size
528  bytes sent via SQL*Net to client
523  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  0  sorts (memory)
  0  sorts (disk)
  1  rows processed



SQL> select count(object_id) from t;


COUNT(OBJECT_ID)
----------------
   86362


Elapsed: 00:00:00.01


Execution Plan
----------------------------------------------------------
Plan hash value: 2966233522


---------------------------------------------------------------------------
| Id  | Operation    | Name | Rows  | Bytes | Cost (%CPU)| Time   |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |   | 1 |    13 |   344   (1)| 00:00:05 |
|   1 |  SORT AGGREGATE    |   | 1 |    13 |        |   |
|   2 |   TABLE ACCESS FULL| T   | 96296 |  1222K|   344   (1)| 00:00:05 |
---------------------------------------------------------------------------


Note
-----
   - dynamic sampling used for this statement (level=2)




Statistics
----------------------------------------------------------
  4  recursive calls
  0  db block gets
       1311  consistent gets
       1233  physical reads
  0  redo size
536  bytes sent via SQL*Net to client
523  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  0  sorts (memory)
  0  sorts (disk)
  1  rows processed


SQL> /


COUNT(OBJECT_ID)
----------------
   86362


Elapsed: 00:00:00.04


Execution Plan
----------------------------------------------------------
Plan hash value: 2966233522


---------------------------------------------------------------------------
| Id  | Operation    | Name | Rows  | Bytes | Cost (%CPU)| Time   |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |   | 1 |    13 |   344   (1)| 00:00:05 |
|   1 |  SORT AGGREGATE    |   | 1 |    13 |        |   |
|   2 |   TABLE ACCESS FULL| T   | 96296 |  1222K|   344   (1)| 00:00:05 |
---------------------------------------------------------------------------


Note
-----
   - dynamic sampling used for this statement (level=2)




Statistics
----------------------------------------------------------
  0  recursive calls
  0  db block gets
       1236  consistent gets
       1233  physical reads
  0  redo size
536  bytes sent via SQL*Net to client
523  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  0  sorts (memory)
  0  sorts (disk)
  1  rows processed



SQL> create index idx_object_id on t(object_id);


Index created.


Elapsed: 00:00:00.31
SQL> 
SQL> select count(*) from t;


  COUNT(*)
----------
     86362


Elapsed: 00:00:00.05


Execution Plan
----------------------------------------------------------
Plan hash value: 2966233522


-------------------------------------------------------------------
| Id  | Operation    | Name | Rows  | Cost (%CPU)| Time   |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |   | 1 |   344   (1)| 00:00:05 |
|   1 |  SORT AGGREGATE    |   | 1 |        |   |
|   2 |   TABLE ACCESS FULL| T   | 96296 |   344   (1)| 00:00:05 |
-------------------------------------------------------------------


Note
-----
   - dynamic sampling used for this statement (level=2)




Statistics
----------------------------------------------------------
  5  recursive calls
  0  db block gets
       1312  consistent gets
       1233  physical reads
  0  redo size
528  bytes sent via SQL*Net to client
523  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  0  sorts (memory)
  0  sorts (disk)
  1  rows processed


SQL> /


  COUNT(*)
----------
     86362


Elapsed: 00:00:00.03


Execution Plan
----------------------------------------------------------
Plan hash value: 2966233522


-------------------------------------------------------------------
| Id  | Operation    | Name | Rows  | Cost (%CPU)| Time   |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |   | 1 |   344   (1)| 00:00:05 |
|   1 |  SORT AGGREGATE    |   | 1 |        |   |
|   2 |   TABLE ACCESS FULL| T   | 96296 |   344   (1)| 00:00:05 |
-------------------------------------------------------------------


Note
-----
   - dynamic sampling used for this statement (level=2)




Statistics
----------------------------------------------------------
  0  recursive calls
  0  db block gets
       1236  consistent gets
       1233  physical reads
  0  redo size
528  bytes sent via SQL*Net to client
523  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  0  sorts (memory)
  0  sorts (disk)
  1  rows processed


SQL> select count(object_id) from t;
/
COUNT(OBJECT_ID)
----------------
   86362


Elapsed: 00:00:00.15


Execution Plan
----------------------------------------------------------
Plan hash value: 1131838604


--------------------------------------------------------------------------------
-------


| Id  | Operation       | Name       | Rows  | Bytes | Cost (%CPU)| Tim
e     |


--------------------------------------------------------------------------------
-------


|   0 | SELECT STATEMENT      |       |     1 |    13 |    57 (0)| 00:
00:01 |


|   1 |  SORT AGGREGATE       |       |     1 |    13 |    |
      |


|   2 |   INDEX FAST FULL SCAN| IDX_OBJECT_ID | 96296 |  1222K|    57 (0)| 00:
00:01 |


--------------------------------------------------------------------------------
-------




Note
-----
   - dynamic sampling used for this statement (level=2)




Statistics
----------------------------------------------------------
  4  recursive calls
  0  db block gets
274  consistent gets
191  physical reads
  0  redo size
536  bytes sent via SQL*Net to client
523  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  0  sorts (memory)
  0  sorts (disk)
  1  rows processed


SQL> 


COUNT(OBJECT_ID)
----------------
   86362


Elapsed: 00:00:00.02


Execution Plan
----------------------------------------------------------
Plan hash value: 1131838604


--------------------------------------------------------------------------------
-------


| Id  | Operation       | Name       | Rows  | Bytes | Cost (%CPU)| Tim
e     |


--------------------------------------------------------------------------------
-------


|   0 | SELECT STATEMENT      |       |     1 |    13 |    57 (0)| 00:
00:01 |


|   1 |  SORT AGGREGATE       |       |     1 |    13 |    |
      |


|   2 |   INDEX FAST FULL SCAN| IDX_OBJECT_ID | 96296 |  1222K|    57 (0)| 00:
00:01 |


--------------------------------------------------------------------------------
-------




Note
-----
   - dynamic sampling used for this statement (level=2)




Statistics
----------------------------------------------------------
  0  recursive calls
  0  db block gets
198  consistent gets
  0  physical reads
  0  redo size
536  bytes sent via SQL*Net to client
523  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  0  sorts (memory)
  0  sorts (disk)
  1  rows processed


----原来真的是用COUNT(列)比COUNT(*)要快啊,因为COUNT(*)不能用到索引,而COUNT(列)可以


SQL> alter table T modify object_id  not  null;


Table altered.


Elapsed: 00:00:01.10
SQL> select count(*) from t;


  COUNT(*)
----------
     86362


Elapsed: 00:00:00.03


Execution Plan
----------------------------------------------------------
Plan hash value: 1131838604


-------------------------------------------------------------------------------
| Id  | Operation       | Name       | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |       |     1 |    57 (0)| 00:00:01 |
|   1 |  SORT AGGREGATE       |       |     1 |    |       |
|   2 |   INDEX FAST FULL SCAN| IDX_OBJECT_ID | 96296 |    57 (0)| 00:00:01 |
-------------------------------------------------------------------------------


Note
-----
   - dynamic sampling used for this statement (level=2)




Statistics
----------------------------------------------------------
33  recursive calls
  0  db block gets
304  consistent gets
  0  physical reads
  0  redo size
528  bytes sent via SQL*Net to client
523  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  6  sorts (memory)
  0  sorts (disk)
  1  rows processed


SQL> /


  COUNT(*)
----------
     86362


Elapsed: 00:00:00.02


Execution Plan
----------------------------------------------------------
Plan hash value: 1131838604


-------------------------------------------------------------------------------
| Id  | Operation       | Name       | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |       |     1 |    57 (0)| 00:00:01 |
|   1 |  SORT AGGREGATE       |       |     1 |    |       |
|   2 |   INDEX FAST FULL SCAN| IDX_OBJECT_ID | 96296 |    57 (0)| 00:00:01 |
-------------------------------------------------------------------------------


Note
-----
   - dynamic sampling used for this statement (level=2)




Statistics
----------------------------------------------------------
  0  recursive calls
  0  db block gets
198  consistent gets
  0  physical reads
  0  redo size
528  bytes sent via SQL*Net to client
523  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  0  sorts (memory)
  0  sorts (disk)
  1  rows processed


SQL> select count(object_id) from t;
/
COUNT(OBJECT_ID)
----------------
   86362


Elapsed: 00:00:00.01


Execution Plan
----------------------------------------------------------
Plan hash value: 1131838604


-------------------------------------------------------------------------------
| Id  | Operation       | Name       | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |       |     1 |    57 (0)| 00:00:01 |
|   1 |  SORT AGGREGATE       |       |     1 |    |       |
|   2 |   INDEX FAST FULL SCAN| IDX_OBJECT_ID | 96296 |    57 (0)| 00:00:01 |
-------------------------------------------------------------------------------


Note
-----
   - dynamic sampling used for this statement (level=2)




Statistics
----------------------------------------------------------
  4  recursive calls
  0  db block gets
274  consistent gets
  0  physical reads
  0  redo size
536  bytes sent via SQL*Net to client
523  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  0  sorts (memory)
  0  sorts (disk)
  1  rows processed


SQL> 


COUNT(OBJECT_ID)
----------------
   86362


Elapsed: 00:00:00.02


Execution Plan
----------------------------------------------------------
Plan hash value: 1131838604


-------------------------------------------------------------------------------
| Id  | Operation       | Name       | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |       |     1 |    57 (0)| 00:00:01 |
|   1 |  SORT AGGREGATE       |       |     1 |    |       |
|   2 |   INDEX FAST FULL SCAN| IDX_OBJECT_ID | 96296 |    57 (0)| 00:00:01 |
-------------------------------------------------------------------------------


Note
-----
   - dynamic sampling used for this statement (level=2)




Statistics
----------------------------------------------------------
  0  recursive calls
  0  db block gets
198  consistent gets
  0  physical reads
  0  redo size
536  bytes sent via SQL*Net to client
523  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  0  sorts (memory)
  0  sorts (disk)
  1  rows processed


结论:看来count(列)和count(*)其实一样快,如果索引列是非空的,count(*)可用到索引,此时一样快!


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30345407/viewspace-2150359/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30345407/viewspace-2150359/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值