學習Oracle核心(cursor: pin S)

abstractcyj發表於2016-07-13
Oracle的buffer cache是SGA的一個重要組成部分,因此當遇到併發訪問時,都需要通過鎖機制來保護()。這個鎖就是buffer pin。
如果要讀一個buffer, 先要獲得共享的buffer pin鎖。寫則要獲取獨佔的buffer pin鎖。
這裡buffer pin鎖就有了兩種模式,一種是S(共享模式),另外則是X(排他模式或獨佔模式)。
等待事件cursor: pin S是對於cache buffer的爭用。

以下指令碼可以構造出cursor: pin S的等待事件。

create table mytest(
 id number,
 name varchar2(100)
)

insert into mytest
  select rownum,
         lpad('a',
              trunc(dbms_random.value * 100),
              chr(trunc(dbms_random.value * 100)))
    from dual
  connect by rownum <= 100;

注意,表上沒有任何索引。

同時,在不同會話中執行如下指令碼:
declare
  v_name mytest.name%type;
begin
  for i in 1 .. 100000000 loop
    begin
      select name into v_name from mytest where id = i;
    exception
      when no_data_found then
        null;
    end;
  end loop;
end;
/

此時,可以在v$session_wait檢視中看到如下等待事件:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8520577/viewspace-2121938/,如需轉載,請註明出處,否則將追究法律責任。

相關文章