ITL:Interested Transaction List,很多人都把它叫做事务槽。它位于BLOCK Header,下面来看看DUMP出来的一个BLOCK

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0006.02d.000027cc  0x00809de3.0266.02  --U-    1  fsc 0x0000.00d96fac
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000

可以看到ITL包含了SCN,undo地址,事物信息,事物影响该block的条数。

从上面的信息可以看到block中也会记录SCN的信息,每个ITL对应一个SCN,由于一个事物的操作可能会涉及到多个BLOCK的更改,所以一个事物可能在多个BLOCK中产生ITL信息。SCN是根据systimestamp转化而来的,精确程度相当高,顺便提一下,控制文件会记录3个SCN,数据文件头也会记录一个SCN,想要了解更多SCN内容,查看前面的文章。ITL中另外一个相当重要的就是Uba,它记录了UNDO的信息,这个是consistant read的基础,我们知道用户发出一条SQL语句,ORACLE就知道了它的结果,为什么ORACLE有这个先知功能呢?事实上ORACLE的另外一个中文翻译也是先知。其实答案就在于ITL中记录的SCN,和Uba.当发出一条sql语句时,ORACLE会记录下这个时刻(SCN),然后在buffer cache中查找需要的BLOCK,或者从磁盘上读,当别的会话修改了数据,或者正在修改数据,就会在相应的block上记录ITL,此时ORACLE发现ITL中记录的SCN大于SELECT时刻的SCN,那么ORACLE就会根据ITL中的Uba找到UNDO信息获得该block的前镜像,然后在buffer cache 中构造出来,此时ORALCE 也会检查构造出来的BLOCK中ITL记录的SCN,如果SCN还大于select时刻的SCN,那么一直重复构造前镜像,然后ORACLE找到前镜像BLOCK中的ITL的SCN是否小于select的SCN,同时检查这个事物有没有提交或者回滚,如果没有,那么继续构造前镜像,直到找到需要的BLOCK,如果在构造前镜像的过程中所需的UNDO信息被覆盖了,就会报快照过旧的错误,这样ORACLE就实现了多版本,这就是ORACLE多版本的本质,我们现在也知道了为什么发出一条select 语句总是会看到consistant gets了。

ITL也是要占用空间的,它存在于block 头部。在ORACLE10g中,如果建表的时候不指定initrans参数,那么默认的itl数为2,最大上限为255,同时指定maxtrans参数会被忽略(9i中有效),在BLOCK有足够空间的情况下,ORACLE会在需要的情况下自动分配ITL。

对于热点表,可以适当设置较大的pctfree,以保证ORACLE能够有足够空间分配ITL。

PCTFREE:这个值=BLOCK中空闲的大小/BLOCK总大小*100

10g中默认的pctfree为10,ORACLE会为一个BLOCK保留10%的空间以确保将来对于BLOCK中的数据的更新,如果这个值设置过小,可能会产生行迁移,导致性能下降,下面做个试验,验证ITL与PCTFREE的关系

SQL> create table test(a number,b varchar2(100)) pctfree 0;

表已创建。

SQL> begin
  2  for i in 1..3000 loop
  3  insert into test values(i,'My name is Robinson');
  4  end loop;
  5  commit;
  6  end;
  7  /

PL/SQL 过程已成功完成。

SQL> select distinct dbms_rowid.rowid_block_number(rowid) from test;

DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------
                                  22
                                  30
                                  28
                                  29
                                  20
                                  21
                                  26
                                  31
                                  24
                                  23
                                  27

已选择11行。  由此可知test表占用了11个block

SQL> select distinct dbms_rowid.rowid_block_number(rowid) from test where a<4;

DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------
                                  22  由此可知表的前面3行位于同一个block

session1中

SQL> update test set b='I am Mr.Robinson' where a=1;

已更新 1 行。

session2中

SQL> update test set b='I like beautifual grils' where a=2;

已更新 1 行。

session3中

SQL> update test set b='Ilove you' where a=3;

出现等待

查看当前等待事件 v$session_wait 视图

SQL> select event from v$session_wait where event like '%ITL%';

EVENT
----------------------------------------------------------------
enq: TX - allocate ITL entry
可以看到此时出现了分配ITL条目的等待,因为PCTFREE为0,BLOCK中没有足够空间分配ITL,ORACLE只能重用ITL,但是这个时候由于没有COMMIT,无法重用ITL,所以会出现allocate ITL 等待事件,要解决此类问题,可以从新创建表,增大PCTFREE的值,或者更改应用设计,减少竞争。

转载于:https://www.cnblogs.com/hehe520/archive/2009/10/24/6330697.html

PCTFREEITLCONSISTANT READ相关推荐

最新文章

  1. Python多版本共存之pyenv
  2. Android开发10——Activity的跳转与传值
  3. 第一章.良好应用程序基石(2)
  4. 深有体会的积极人生态度
  5. CF1100F Ivan and Burgers
  6. Linux 进程资源分配,linux 进程管理和内存分配
  7. Keras-2 Keras Mnist
  8. 苹果用户每天解锁iPhone手机80次
  9. .NET单元测试-多线程
  10. 衡量神经网络的三个指标,参数量,multi-add,flop计算力
  11. android累计时间计算公式,使用时间智能函数计算累计值YTD、QTD、MTD - DAX圣经 - Power BI极客...
  12. 英雄联盟怎么解除小窗口_英雄联盟手游剑姬怎么玩-英雄联盟手游剑姬玩法介绍...
  13. MySQL原理与实践(三):由三种数据结构引入MySQL索引及其特性
  14. 北京交警二环路机动车道“瘦身”,最高“礼遇”骑行人
  15. ubuntu安装chrome浏览器64位
  16. 如何白piao一台优质的华为云服务器
  17. WordPress更新文章实时推送到百度
  18. 随记-简单而优雅的 namedtuple
  19. F28335 PWM触发ADC采样 代码+注释
  20. Linux 命令行浏览器

热门文章

  1. 第十四章_超参数调整
  2. 【AtCoder】ARC 081 E - Don't Be a Subsequence
  3. 亚马逊表示并未放弃WP平台:正在打造新应用
  4. C语言之枚举的定义以及测试
  5. zabbix+telegram 报警
  6. 工作中最重要的个人品质--独立
  7. angularjs内置63个指令
  8. loadrunner脚本中关于httpCode401特殊情况
  9. 杜拉拉升职记(1和2)
  10. EyeQ Ultra 芯片 面向自动驾驶