sql执行计划错误之cache buffers chain


分享个小案例:

今天某个库出现了cache buffers chain,最近应用没啥变更,怎么会突然出现呢,当然latch:cache buffers chain的作用是db cache中Find data很重要的latch,不管逻辑读,物理读(也要经历逻辑读),如果link或者unlink一个buffer到不同的Hash Bucket,再或者pin,unpin一个buffer,都要获得相关bucket上相关的cache buffers chain latch。所以,关联到sql上,正如我们通常说的,调sql的一个目标就是减少资源的消耗,包括降低逻辑读,如果某个sql的读的块很多,那么和其它在访问相同数据的session就会争夺cache buffers chain latch(因为决定buffer被连接到那个bucket里面是由block的信息决定的,一个cache buffers chain latch会保护多个bucket,如果很多访问一个bucket里面的buffer,此时就会导致次latch的争用,也就是我们说的热块)所以,应用最近没啥变更,可以肯定是某些sql走错了执行计划。

我们收集统计信息是按照segment_size大于150M,并且每天的变化量超过20%的对象才会收集统计信息。所以对于有些对象没达到这个

收集的条件,统计信息可能是很久以前的或者是缺失,数据变化较大的时候,可能导致执行计划错误。

查看下当时ASH信息:

  1. select sql_id,count(*)  
  2. from dba_hist_active_sess_history  
  3. where event='latch: cache buffers chains' and sample_time between  
  4. to_date('2012-08-02:16:00:00',‘YYYY-MM-DD:HH24:MI:SS') and to_date('2012-08-02:16:10:00',‘YYYY-MM-DD:HH24:MI:SS')  
  5. group by sql_id  
  6. order by 2 desc;  
  7.   
  8.   SQL_ID    COUNT(*)  
  9. 0a3zj3m5h72rb   6098  
  10. 3xyq2hqdd3akj   24  
  11. 9rt5b6s9ry50q   16  

很明显,sql_id:0a3zj3m5h72rb嫌疑比较大,看看执行计划:

当前的执行计划: 【帮客之家 http://www.bkjia.com 】

  1. SQL_ID 0a3zj3m5h72rb  
  2. --------------------  
  3. select M.LOG_ID,M.STATE,M.SESSION_ID,M.IP,M.LOGOUT_DATE,M.LOGIN_DATE,M.STAFF_COD  
  4. MAC ,M.ROWID as MROWID___  from SEC_LOGIN_LOG_201208 M where M.SESSION_ID = :1  
  5. order by  M.LOG_ID DESC  
  6. Plan hash value: 177413507  
  7. --------------------------------------------------------------------------------  
  8. | Id  | Operation                   | Name                    | Rows  | Bytes |  
  9. --------------------------------------------------------------------------------  
  10. |   0 | SELECT STATEMENT            |                         |       |       |  
  11. |   1 |  TABLE ACCESS BY INDEX ROWID| SEC_LOGIN_LOG_201208    |     1 |   146 |  
  12. |   2 |   INDEX FULL SCAN DESCENDING| PK_SEC_LOGIN_LOG_201208 |     1 |       |  
  13. --------------------------------------------------------------------------------  

当然这个sql很简单,执行计划也很简单,我们先看下这个表上索引的信息:

  1. INDEX_NAME                      BLEVEL COLUMN_NAME     COL_POS DISTINCT_KEYS   NUM_ROWS     FACTOR PAR LAST_ANALYZE  
  2. -------------------------   ---------- ----------------------- ------------- ---------- ---------- --- ------------  
  3. IDX_SEC_LOGIN_LOG2_201208       2      LOGOUT_DATE           1        106719     393830     376028 NO  01-AUG-12  
  4. IDX_SEC_LOGIN_LOG_201208_3      2      LOGIN_DATE            1        123557     496287     419906 NO  01-AUG-12  
  5. IDX_SEC_LOGIN_LOG1_201208       2      SESSION_ID            1        384049     384049     383848 NO  01-AUG-12  
  6. PK_SEC_LOGIN_LOG_201208         2      LOG_ID                1        496292     496292     451386 NO  01-AUG-12  
  • 1
  • 2
  • 下一页

相关内容