[20160203]sequence与rac.txt

[20160203]sequence与rac.txt

--前几天跟别人聊天提到对方管理的系统使用了大量的sequence,几乎每个表都以一个sequence作为主键。
--我们的系统也是相似的情况,但是我们开发使用一个表来保存这些信息,这样导致另外的问题,会出现阻塞的情况。

--sequence在rac中问题可能会放大,如果cache很小,并且使用order属性,会导致内联流量上升,并且出现row lock。
--而且这些字段一般都要作为主键,或者讲这些字段一般会存在索引,这样导致另外的问题:

1.如果使用order会导致插入的记录的相关索引存在块争用,因为数据是线性增加,索引的键值都插入一个块中,另外就是如果业务出现
  偶然的停顿,会导致占用大量占用ITL槽,而这些块再插满出现块分裂时,会继承这些ITL槽的数量,导致索引占用的空间很大。
2.使用noorder也是一样,因为这样每个实例都cache自己的顺序号,这样其中一个实例的键值会导致索引块分裂是50%,加上上面如果业
  务出现停顿,也会导致索引占用的空间很大。

--可以参考我以前的链接:
http://blog.itpub.net/267265/viewspace-774519/

--自己也测试一下sequence存在大量插入的情况:

1.环境:
SCOTT@xxxx1> @ &r/ver1

PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

CREATE SEQUENCE SCOTT.seq1 START WITH 0 INCREMENT BY 1 MINVALUE 0 CACHE 10 NOCYCLE ORDER;
--我cache设置相对偏小,仅仅10.

2.建立测试脚本:

$ cat aa.sql
declare
v_seq1 number;
begin
for i in 1 .. 2e5 loop
execute immediate 'select seq1.nextval from dual ' into v_seq1;
end loop;
end;
/
quit;

$ cat bb.sh
#! /bin/bash
sqlplus scott/bookms@192.168.xx.yyy:1521/xxxx @aa.sql &
sqlplus scott/bookms@192.168.xx.yyy:1521/xxxx @aa.sql &
sqlplus scott/bookms@192.168.xx.yyy:1521/xxxx @aa.sql &
sqlplus scott/bookms@192.168.xx.yyy:1521/xxxx @aa.sql &

--执行2次bb.sh

3.获得sql_id:
select seq1.nextval from dual;
sql_id=gh9xqf2pz2fjk;

EVENT                                      COUNT(*)
---------------------------------------- ----------
enq: SV -  contention                           175
                                                 51
gc cr block 2-way                                 6
row cache lock                                    4
gc current block 2-way                            4
gc cr block busy                                  2
cursor: pin S                                     1
7 rows selected.

SCOTT@xxxx1> select eq_name,eq_type,req_reason from v$enqueue_statistics where eq_type='SV';
no rows selected

--不知道SV表示什么?

3.加大cache再测试看看:
alter sequence seq1 cache 1000;

--重复测试:
SELECT event, COUNT (*)
    FROM V$ACTIVE_SESSION_HISTORY
   WHERE sql_id = 'gh9xqf2pz2fjk'
   and sample_time >= '2016/02/03 09:25'
GROUP BY event
ORDER BY COUNT (*) DESC;

EVENT                                      COUNT(*)
---------------------------------------- ----------
enq: SV -  contention                           138
                                                 35

--可以发现适当的加大cache的数值,可以缓解避免其他等待事件的出现。

3.修改为noorder属性再测试看看:
SCOTT@xxxx1> alter sequence seq1 noorder;
Sequence altered.

SELECT event, COUNT (*)
    FROM V$ACTIVE_SESSION_HISTORY
   WHERE sql_id = 'gh9xqf2pz2fjk'
   and sample_time >= '2016/02/03 09:30'
GROUP BY event
ORDER BY COUNT (*) DESC ;

EVENT                                      COUNT(*)
---------------------------------------- ----------
                                                 14
library cache: mutex X                            3

--不再出现enq: SV -  contention等待事件。

总结:
--从以上的测试可以发现在rac中使用seqence,加大cache,使用nooder属性(有一些业务要求保持顺序,可能不行),可以减少相关的等待事件。
--另外如果使用sequence在rac中主要出现的等待事件是enq: SV -  contention,gc cr block 2-way,row cache lock,gc current block 2-way.

SELECT event, COUNT (*)
    FROM V$ACTIVE_SESSION_HISTORY
   WHERE sql_id = 'gh9xqf2pz2fjk'
GROUP BY event
ORDER BY COUNT (*) DESC ;

EVENT                                      COUNT(*)
---------------------------------------- ----------
enq: SV -  contention                          1074
                                                233
row cache lock                                   24
gc cr block 2-way                                 9
library cache: mutex X                            8
gc current block 2-way                            5
latch: ges resource hash list                     2
gc cr block busy                                  2
enq: SQ - contention                              1
cursor: pin S                                     1

10 rows selected.

时间: 2024-07-30 10:55:29

[20160203]sequence与rac.txt的相关文章

[20170703]ora-12516 ora-12514 rac.txt

[20170703]ora-12516 ora-12514 rac.txt --//生产系统出现问题.rac环境,版本11.2.0.4.OS版本 oracle linux 5.9 for 64.设计一些安全问题,我仅仅提供解决方案: 1.问题: --//监听提示如下: 29-JUN-2017 22:05:47 * (CONNECT_DATA=(SERVICE_NAME=aaahis)(CID=(PROGRAM=D:\laji\laji\laji.EXE)(HOST=ZLFL20170518)(U

[20161229]linux下使用oclumon命令(rac)

[20161229]linux下使用oclumon命令(rac).txt --11G RAC下grid 存在一个命令oclumon可以了解监测群集健康.简单了解一下. 1.环境: SYS@+ASM1> select * from v$version where rownum<=1; BANNER -------------------------------------------------------------------------------- Oracle Database 11g

【RAC】RAC相关基础知识

  [RAC]RAC相关基础知识 1.CRS简介    从Oracle 10G开始,oracle引进一套完整的集群管理解决方案--Cluster-Ready Services,它包括集群连通性.消息和锁.负载管理等框架.从而使得RAC可以脱离第三方集群件,当然,CRS与第三方集群件可以共同使用. (1).CRS进程 CRS主要由三部分组成,三部分都作为守护进程出现 <1>CRSD:资源可用性维护的主要引擎.它用来执行高可用性恢复及管理操作,诸如维护OCR及管理应用资源,它保存着集群的信息状态和

[20160203]ora-04031错误.txt

[20160203]ora-04031错误.txt --生产系统10g的数据库,修改为手工内存管理后出现ora-04031错误,自己手工模拟看看: 1.环境: SYS@test> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- -------------------------------------------------

[20130803]12C在表中使用sequence.txt

[20130803]12C在表中使用sequence.txt 记得以前学习数据库的时候,第1个接触的数据库是informix,里面可以在表上定义顺序号,这样在插入时无需指定,保证唯一.(也许记忆有错,毕竟很久没使用它了).oracle 12c开始支持这种特性,我的感觉这些主要为了别的数据库移植到oracle上来. 做一个测试看看: SQL> @ver BANNER                                                                   

[20130901]12C在表中使用sequence(补充).txt

[20130901]12C在表中使用sequence(补充).txt 对以前写的内容做一些补充. SQL> @ver BANNER                                                                               CON_ID-------------------------------------------------------------------------------- ----------Oracle Da

[20120213]段延迟提交以及sequence.txt

1. 测试环境:SQL> select * from v$version ; BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionPL/SQL Release 11.2.0.1.0 - ProductionCORE    11.

奕新集团--单实例到RAC节点 GG同步

Install and Configure Goldengate on RAC 10g 以前写过几篇关于OGG(Oracle GlodenGate)部署的文章,是关于单实例到单实例,具体内容可参考:Install and simple configure Oracle GoldenGateConfigure Oracle GoldenGate Active-to-Active 今天测试了一下从RAC 到 单实例的简单部署,做简要记录如下: 测试环境: source 端: 操作系统版本:rhel4

[20170322]关于IMU.txt

[20170322]关于IMU.txt --昨天测试实例crash恢复时,别人测试无法重复我前面的测试,最终发现IMU导致这个问题. --我本人对IMU的东西很少探究.摘抄一段: 从Oracle10g开始,Oracle在数据库中引入了In Memory Undo(可以被缩写为IMU)的新技术,使用这一技术,数据库会在共享内存中 (Shared Pool)开辟独立的内存区域用于存储Undo信息,这样就可以避免Undo信息以前在Buffer Cache中的读写操作,从而可以进一步的 减少Redo生成