在Oracle中使用consistent gets的特例

來源:互聯網
上載者:User

Oracle資料庫中,consistent gets在判斷一段SQL的效能時非常有用,通常來講比較兩段SQL的效能好壞不是看誰的執行時間短,而是看誰的consistent gets小。不過這也不是絕對的,下面這個例子就是一個反例。

一:通常情況下,不在logical RAM buffer中的資料要通過physical reads來讀取,而physical reads後通常會緊跟著一個consistent gets.因此一般情況下consistent gets是要比physical reads大的。但是有一個特例,如果physical reads得到的資料直接用於HASH或者SORT,則只記為physical reads不記為consistent gets.所以加上order by後有可能physical reads多但consistent gets少。不過這個原因不是我這裡現象產生的原因,因為我這個實驗雷根本沒有physical reads.

二:arraysize的影響。arraysize是指讀取資料時一次讀取得到的行數。這個值預設為15,使用show arraysize命令可以查看。一個資料區塊例如有100條記錄,那麼並不是讀取這個塊一次就能取到所有資料,以arraysize=15為例,就要有 100/15=7次consistent gets.把arraysize設定得大一點可以降低consistent gets,不過有時候可能會消耗更多的資源。如果我們做select count(0) from test;操作,那麼Oracle DBA會把arraysize暫時設為test的行數,因此consistent gets會很少:

代碼如下:

ETL@RACTEST> select count(0) from test; Elapsed: 00:00:00.00 Execution Plan Plan hash value: 1950795681 --------------

| Id | Operation

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

| | 0 | SELECT STATEMENT |

| 1 |

6 (0)| 00:00:01 | | 1 | SORT AGGREGATE |

| 1 |

| |

| 2 | TABLE ACCESS FULL| TEST | 10000 |

6 (0)| 00:00:01 | ------------------------------------------------------------------- Note

- dynamic sampling used for this statement Statistics

0 recursive calls

0 db block gets

23 consistent gets

0 physical reads

0 redo size

515 bytes sent via SQL*Net to client

465 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1 rows processed

可以看到select count(0)只需要23個邏輯讀。一共10000條資料,10000/15=666.667 ,好,667+23=690!和第1個SQL的consistent gets竟然驚人的一致!這不是巧合,這就是consistent gets的計算公式。我們還可以發現select count(0)和第2個SQL的consistent gets竟然也驚人地一致,都是23!

TOM的解釋是:

在select * from test order by 1;時,Oracle也把arraysize臨時設為test表的行數,它把所有資料先全部取出來放到sort區做排序,而在sort區的讀取就不算在 consistent gets裡了。所以雖然第2個SQL和select count(0)的consistent gets相同,但它的效率一定比select count(0)低,我們看執行計畫裡的COST便可以得知,第2個SQL的COST為7,select count(0)的COST為6,第1個SQL的COST也為6.(COST相同並不代表執行效率完全相同)

查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.