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
使用Sequences生成主鍵值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.