日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle count最快的方法,Oracle count哪种写法更快

發布時間:2025/4/17 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle count最快的方法,Oracle count哪种写法更快 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1)創建測試表

test@CISCOSYS> create table t as select * from dba_objects;

表已創建。

test@CISCOSYS> update t set object_id =rownum ;

已更新50967行。

2)使用count(*)進行統計

test@CISCOSYS> select count(*) from t;

COUNT(*)

----------

50967

已用時間: 00: 00: 00.01

執行計劃

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

Plan hash value: 2966233522

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

| Id | Operation | Name | Rows | Cost (%CPU)| Time |

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

| 0 | SELECT STATEMENT | | 1 | 161 (2)| 00:00:02 |

| 1 | SORT AGGREGATE | | 1 | | |

| 2 | TABLE ACCESS FULL| T | 44475 | 161 (2)| 00:00:02 |

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

Note

-----

- dynamic sampling used for this statement

統計信息

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

4 recursive calls

0 db block gets

764 consistent gets

0 physical reads

0 redo size

410 bytes sent via SQL*Net to client

385 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1 rows processed

3)使用COUNT(列)進行統計

test@CISCOSYS> select count(*) from t;

COUNT(*)

----------

50967

已用時間: 00: 00: 00.01

執行計劃

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

Plan hash value: 2966233522

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

| Id | Operation | Name | Rows | Cost (%CPU)| Time |

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

| 0 | SELECT STATEMENT | | 1 | 161 (2)| 00:00:02 |

| 1 | SORT AGGREGATE | | 1 | | |

| 2 | TABLE ACCESS FULL| T | 44475 | 161 (2)| 00:00:02 |

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

Note

-----

- dynamic sampling used for this statement

統計信息

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

4 recursive calls

0 db block gets

764 consistent gets

0 physical reads

0 redo size

410 bytes sent via SQL*Net to client

385 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1 rows processed

解釋一下 :物理讀為0,是因為創建表的時候,數據已經載入load buffer.

可以使用

test@CISCOSYS> alter system flush buffer_cache;

通過比較COUNT(*) 和Count(列) ,兩種情況的COST 是完全一樣的。

繼續試驗!!!

為表創建索引

test@CISCOSYS> create index idx_t_id on t(object_id);

索引已創建。

test@CISCOSYS> alter system flush buffer_cache;

系統已更改。

test@CISCOSYS> select count(*) from t;

COUNT(*)

----------

50967

已用時間: 00: 00: 00.26

執行計劃

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

Plan hash value: 2966233522

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

| Id | Operation | Name | Rows | Cost (%CPU)| Time |

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

| 0 | SELECT STATEMENT | | 1 | 161 (2)| 00:00:02 |

| 1 | SORT AGGREGATE | | 1 | | |

| 2 | TABLE ACCESS FULL| T | 44475 | 161 (2)| 00:00:02 |

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

Note

-----

- dynamic sampling used for this statement

統計信息

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

5 recursive calls

0 db block gets

765 consistent gets

705 physical reads

0 redo size

410 bytes sent via SQL*Net to client

385 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1 rows processed

test@CISCOSYS> select count(object_id) from t;

COUNT(OBJECT_ID)

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

50967

已用時間: 00: 00: 00.09

執行計劃

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

Plan hash value: 3570898368

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

--

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time

|

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

--

| 0 | SELECT STATEMENT | | 1 | 13 | 30 (4)| 00:00:01

|

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

|

| 2 | INDEX FAST FULL SCAN| IDX_T_ID | 44475 | 564K| 30 (4)| 00:00:01

|

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

--

Note

-----

- dynamic sampling used for this statement

統計信息

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

4 recursive calls

0 db block gets

181 consistent gets

477 physical reads

0 redo size

418 bytes sent via SQL*Net to client

385 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(列)可以

繼續試驗!!!

將鍵值設為非空

test@CISCOSYS> alter table T modify object_id not null;

表已更改。

已用時間: 00: 00: 01.34

test@CISCOSYS> alter system flush buffer_cache;

系統已更改。

已用時間: 00: 00: 00.01

test@CISCOSYS> select count(*) from t;

COUNT(*)

----------

50967

已用時間: 00: 00: 00.31

執行計劃

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

Plan hash value: 3570898368

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

| Id | Operation | Name | Rows | Cost (%CPU)| Time |

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

| 0 | SELECT STATEMENT | | 1 | 30 (4)| 00:00:01 |

| 1 | SORT AGGREGATE | | 1 | | |

| 2 | INDEX FAST FULL SCAN| IDX_T_ID | 44475 | 30 (4)| 00:00:01 |

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

Note

-----

- dynamic sampling used for this statement

統計信息

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

205 recursive calls

0 db block gets

213 consistent gets

496 physical reads

0 redo size

410 bytes sent via SQL*Net to client

385 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

5 sorts (memory)

0 sorts (disk)

1 rows processed

test@CISCOSYS> alter system flush buffer_cache;

系統已更改。

已用時間: 00: 00: 00.04

test@CISCOSYS> select count(object_id) from t;

COUNT(OBJECT_ID)

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

50967

已用時間: 00: 00: 00.20

執行計劃

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

Plan hash value: 3570898368

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

| Id | Operation | Name | Rows | Cost (%CPU)| Time |

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

| 0 | SELECT STATEMENT | | 1 | 30 (4)| 00:00:01 |

| 1 | SORT AGGREGATE | | 1 | | |

| 2 | INDEX FAST FULL SCAN| IDX_T_ID | 44475 | 30 (4)| 00:00:01 |

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

Note

-----

- dynamic sampling used for this statement

統計信息

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

4 recursive calls

0 db block gets

181 consistent gets

477 physical reads

0 redo size

418 bytes sent via SQL*Net to client

385 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1 rows processed

將一些記錄object_id置為null.

test@CISCOSYS> alter table t modify (object_id number null);

表已更改。

test@CISCOSYS> update t set object_id=null where object_id<=10;

已更新10行。

test@CISCOSYS> select count(*) from t;

COUNT(*)

----------

50967

已用時間: 00: 00: 00.00

test@CISCOSYS> select count(object_id) from t;

COUNT(OBJECT_ID)

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

50957

發現count(*)和count(列)記錄不一樣。也就是說,兩個功能上根本不是等價的。

如果一個列上存在索引,且非空。 COUNT(*)和COUNT(列)功能相當。

反之,COUNT(*) 和COUNT(列)兩者功能本身就功能不同,不應等同對待。

基于案例學SQL

總結

以上是生活随笔為你收集整理的oracle count最快的方法,Oracle count哪种写法更快的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。