使用Sequences生成主鍵值

Sequences是用來產生primary key values.
在工作中,利用序列來產生主鍵值,相當於insert into t1 values(s1.next,name) ,來插入一張表的時候,
插入到表塊和索引塊,插入到表塊的時候沒有問題,插入到索引塊的時候,由於索引是有序的,
這個會話會申請獨佔的Latch,在CBC Latch 的保護下,去訪問CBC鏈表,CBC鏈表buffer header,
找到數據塊以後,釋放CBC Latch,然後給他分配一個pin(X)鎖(DML操作都會有X鎖),
在Pin 鎖的保護下來訪問數據塊,這個時候就會發生熱點塊(右手塊)的競爭,
如果有大量會話進來會造成BUFFER BUSY WAITS 等待事件和CBC Latch waits事件。
​


begin 
for i in 1 ..1000000 loop
insert into t1(tid) values(i);
end loop;
commit;
end;
/
查看我當前會話ID
select sid from v$mystat where rownum=1;




   SID
------
     8
查看等待事件
select sid,event,p1,p2,p3 from v$session where sid=8;


SQL> /
       SID EVENT                                                                    P1         P2         P3
---------- ---------------------------------------------------------------- ---------- ---------- ----------
         8 cursor: pin S                                                    1516791663 8375186227 1288490188


SQL> /
       SID EVENT                                                                    P1         P2         P3
---------- ---------------------------------------------------------------- ---------- ---------- ----------
         8 Disk file operations I/O                                                  5          0          2


SQL> /
       SID EVENT                                                                    P1         P2         P3
---------- ---------------------------------------------------------------- ---------- ---------- ----------
         8 SQL*Net message from client                                      1413697536          1          0




解決的方法:
定義一個變量,獲取這個(會話的sid  +  s1.next),因爲會話的sid是不唯一的,但是是。next是唯一的,加起來還是唯一的,所以可以作爲病案號的id,這一個功能可以通過使用匿名塊實現。
這樣的解決方式,不能夠生成自增ID.
其中Buffer Buffer Waits等待事件p1、p2、p3參數的意義:




7
SQL> select name,parameter1,parameter2,parameter3,wait_class
  2  from v$event_name
  3  where name like '%buffer busy waits%';
 
NAME                      PARAMETER1 PARAMETER2 PARAMETER3 WAIT_CLASS
------------------------- ---------- ---------- ---------- ---------------
buffer busy waits         file#      block#     class#     Concurrency




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章