使用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




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