日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Oracle數(shù)據(jù)庫consistentgets使用的特例

Oracle數(shù)據(jù)庫中,consistent gets在判斷一段SQL的性能時(shí)非常有用,通常來講比較兩段SQL的性能好壞不是看誰的執(zhí)行時(shí)間短,而是看誰的consistent gets小。不過這也不是絕對(duì)的,下面這個(gè)例子就是一個(gè)反例。

反例子如下:

 
 
 
  1. ETL@RACTEST> create table test( a int);  
  2. Table created. Elapsed: 00:00:00.05  
  3. ETL@RACTEST> ETL@RACTEST> begin  
  4.   2  for i in 1..10000 loop  
  5.   3  insert into test values (i);  
  6.   4  end loop;  
  7.   5  end;  
  8.   6  / PL/SQL procedure successfully completed. Elapsed: 00:00:00.44  
  9. ETL@RACTEST> set autot trace  
  10. ETL@RACTEST> ETL@RACTEST> select * from test;  
  11. 10000 rows selected. Elapsed: 00:00:00.05 Execution Plan Plan hash value: 1357081020 -------------------------------------------------------------  
  12. | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     | |   0 | SELECT STATEMENT  |      | 10000 |   126K|     6   (0)| 00:00:01 |  
  13. |   1 |  TABLE ACCESS FULL| TEST | 10000 |   126K|     6   (0)| 00:00:01 |  
  14. -------------------------------------------------------------------------- Note    - dynamic sampling used for this statement  
  15. Statistics           0  recursive calls  
  16.           0  db block gets  
  17.         690  consistent gets  
  18.           0  physical reads  
  19.           0  redo size  
  20.      214231  bytes sent via SQL*Net to client  
  21.        7791  bytes received via SQL*Net from client  
  22.         668  SQL*Net roundtrips to/from client  
  23.           0  sorts (memory)  
  24.           0  sorts (disk)  
  25.       10000  rows processed 可以看到select *讀了690個(gè)內(nèi)存塊。 ETL@RACTEST> select * from test order by 1; 10000 rows selected. Elapsed: 00:00:00.04 Execution Plan Plan hash value: 2007178810 --------------------------------------------------------------------  
  26. | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     | |   0 | SELECT STATEMENT   |      | 10000 |   126K|     7  (15)| 00:00:01 |  
  27. |   1 |  SORT ORDER BY     |      | 10000 |   126K|     7  (15)| 00:00:01 |  
  28. |   2 |   TABLE ACCESS FULL| TEST | 10000 |   126K|     6   (0)| 00:00:01 |  
  29. --------------------------------------------------------------------------- Note    - dynamic sampling used for this statement  
  30. Statistics           0  recursive calls  
  31.           0  db block gets  
  32.          23  consistent gets  
  33.           0  physical reads  
  34.           0  redo size  
  35.      174288  bytes sent via SQL*Net to client  
  36.        7791  bytes received via SQL*Net from client  
  37.         668  SQL*Net roundtrips to/from client  
  38.           1  sorts (memory)  
  39.           0  sorts (disk)  
  40.       10000  rows processed 

再看一下order by,竟然只有23個(gè)邏輯讀!

1. select * from test;

2. select * from test order by 1;

第1個(gè)SQL比第2個(gè)SQL效率高是毋庸置疑的。但是為什么第2個(gè)SQL的consistent gets如此之少,我起初也是百思不得其解,最終我在ASK TOM中找到了答案。

原因:

一:通常情況下,不在logical RAM buffer中的數(shù)據(jù)要通過physical reads來讀取,而physical reads后通常會(huì)緊跟著一個(gè)consistent gets。因此一般情況下consistent gets是要比physical reads大的。但是有一個(gè)特例,如果physical reads得到的數(shù)據(jù)直接用于HASH或者SORT,則只記為physical reads不記為consistent gets。所以加上order by后有可能physical reads多但consistent gets少。不過這個(gè)原因不是我這里現(xiàn)象產(chǎn)生的原因,因?yàn)槲疫@個(gè)實(shí)驗(yàn)里根本沒有physical reads。

二:arraysize的影響。arraysize是指讀取數(shù)據(jù)時(shí)一次讀取得到的行數(shù)。這個(gè)值默認(rèn)為15,使用show arraysize命令可以查看。一個(gè)數(shù)據(jù)塊例如有100條記錄,那么并不是讀取這個(gè)塊一次就能取到所有數(shù)據(jù),以arraysize=15為例,就要有100/15=7次consistent gets。把a(bǔ)rraysize設(shè)置得大一點(diǎn)可以降低consistent gets,不過有時(shí)候可能會(huì)消耗更多的資源。如果我們做select count(0) from test;操作,那么Oracle會(huì)把a(bǔ)rraysize暫時(shí)設(shè)為test的行數(shù),因此consistent gets會(huì)很少:

代碼如下:

 
 
 
  1. ETL@RACTEST> select count(0) from test; Elapsed: 00:00:00.00 Execution Plan Plan hash value: 1950795681 --------------  
  2. | Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     | |   0 | SELECT STATEMENT   |      |     1 |     6   (0)| 00:00:01 |  
  3. |   1 |  SORT AGGREGATE    |      |     1 |            |          |  
  4. |   2 |   TABLE ACCESS FULL| TEST | 10000 |     6   (0)| 00:00:01 |  
  5. ------------------------------------------------------------------- Note    - dynamic sampling used for this statement  
  6. Statistics           0  recursive calls  
  7.           0  db block gets  
  8.          23  consistent gets  
  9.           0  physical reads  
  10.           0  redo size  
  11.         515  bytes sent via SQL*Net to client  
  12.         465  bytes received via SQL*Net from client  
  13.           2  SQL*Net roundtrips to/from client  
  14.           0  sorts (memory)  
  15.           0  sorts (disk)  
  16.           1  rows processed 

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

TOM的解釋是:
在select * from test order by 1;時(shí),Oracle也把a(bǔ)rraysize臨時(shí)設(shè)為test表的行數(shù),它把所有數(shù)據(jù)先全部取出來放到sort區(qū)做排序,而在sort區(qū)的讀取就不算在consistent gets里了。所以雖然第2個(gè)SQL和select count(0)的consistent gets相同,但它的效率一定比select count(0)低,我們看執(zhí)行計(jì)劃里的COST便可以得知,第2個(gè)SQL的COST為7,select count(0)的COST為6,第1個(gè)SQL的COST也為6。(COST相同并不代表執(zhí)行效率完全相同)

關(guān)于Oracle數(shù)據(jù)庫consistent gets的知識(shí)就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!


當(dāng)前標(biāo)題:Oracle數(shù)據(jù)庫consistentgets使用的特例
轉(zhuǎn)載來源:http://m.5511xx.com/article/cojsppd.html