视窗
loading...
您现在的位置:首页 > IT认证 > oracle认证 >

Oracle事务表实验


Oracle事务表实验

 回滚段头中,有一项非常重要的信息,就是事务表。对事务表频繁的访问,可能会造成回滚段头的争用。了解什么样的操作会访问事务表,对于了解回滚段头争用的原因非常重要。下面我们来做一些实验来验证一下,什么样的操作才会访问事务表。
   
    首 先简单介绍一个视图,备份x$bh.对这个视图我想大家都有一定的了解,bh即buffer header 的简写。在buffer  header中有 一个TCH 列,表示块被访问的次数。我们通过他来验证事务表什么时候被访问。需要注意的是。TCH列每3秒,才会重新计算一次,3秒之内无论访问某一个 块多少次。TCH列只会增加1.
   
    在会话A开启一个事务后:
   
    步骤一:通过v$transaction视图找到XID
   
    SQL> select xidusn,ubablk,ubafil from v$transaction;
   
    XIDUSN     UBABLK     UBAFIL
   
    ---------- ---------- ----------
   
    13         97          5
   
    步骤二:通过回滚段编号,可得知事务所占回滚段名,并用此查找事务头块号,文件号
   
    SQL> select header_block,header_file from dba_segments where segment_name='_SYSSMU13$';
   
    HEADER_BLOCK HEADER_FILE
   
    ------------ -----------
   
    41           5
   
    步骤三:查看x$bh视图中,TCH值的增加。
   
    SQL> select addr,tch from x$bh where dbarfil=5 and dbablk=41;
   
    ADDR            TCH
   
    -------- ----------
   
    080B5208         41
   
    步骤四:查找完TCH后,马上执行要测试的命令(会话B),
   
    SQL> select * from jj_3;
   
    ID NA
   
    ---------- --
   
    1 aa
   
    2 aa
   
    3 aa
   
    4 aa
   
    5 CN
   
    步骤五:再次查看x$bh视图
   
    SQL> select addr,tch from x$bh where dbarfil=5 and dbablk=41;
   
    ADDR            TCH
   
    -------- ----------
   
    080B5208         42
   
    注意:步骤三四五应尽快完成。避免oracle的其他内部操作影响测试结果。(因为oracle内部的操作也会造成回滚段头的tch值增加,特别在10G中,这种情况更为明显,不过我没有跟踪是什么oracle的内部操作造成的)
   
    小结:从结果集来看,在另一会话中访问未提交数据的select语句会访问事务表,那么其他的DML操作呢?(希望大家也都试试,我的结果是都会增加TCH值)。上面我的步骤四是全表扫描。如果我的表有两个块,分别是块一块二,在块一中修改行A,按照rowid访问块一中的行B,这样会访问事务表吗?如果

按照rowid访问块二中的行,会访问事务表吗?下面我来实验下看结果是什么:

步一:利用函数查看该表的块号。

SQL> select rowid,dbms_rowid.rowid_block_number(rowid) from jj_3;

ROWID DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)

------------------ ------------------------------------

AAAMvjAAKAAAAEdAAA 285

AAAMvjAAKAAAAEdAAB 285

AAAMvjAAKAAAAEdAAC 285

AAAMvjAAKAAAAEeAAA 286

步二: 在B会话中通过AAAMvjAAKAAAAEdAAC修改表。

SQL> update jj_3 set id=10 where rowid='AAAMvjAAKAAAAEdAAC';

已更新 1 行。

步三: 在A会话中通过AAAMvjAAKAAAAEdAAA查看行

SQL> select * from jj_3 where rowid='AAAMvjAAKAAAAEdAAA';

ID NA

---------- --

4 aa

在做步一和二之前,先查看一下X$BH,因为他会因为oracle的内部操作而增加,

实验前查看结果:

SQL> select addr,tch from x$bh where dbarfil=5 and dbablk=41;

ADDR TCH

-------- ----------

080B51BC 63

实验后查看结果:

SQL> select addr,tch from x$bh where dbarfil=5 and dbablk=41;

ADDR TCH

-------- ----------

080B51BC 64

结论一:在块一中修改行A,按照rowid访问块一中的行B,这样会访问事务表;再试试不同的块

操作前先查看下X$BH:

SQL> select addr,tch from x$bh where dbarfil=5 and dbablk=41;

ADDR TCH

-------- ----------

080B51BC 67

接着刚才的实验,我又访问了不同的块:

SQL> select * from jj_3 where rowid='AAAMvjAAKAAAAEeAAA';

ID NA

---------- --

4 aa

再次查看X$BH的结果是:

SQL> select addr,tch from x$bh where dbarfil=5 and dbablk=41;

ADDR TCH

-------- ----------

080B51BC 67

结果很明显了,用rowid访问不同的块,是不会增加TCH值的。也就是说不会有CR块产生。

在晶晶实验六中,已经证明了在生成CR块时,oracle可以根据数据块头部的ITL槽中的UBA,找到存放数据块回滚信息的回 滚块和回滚记录,通过这个UBA就可以构造CR块咯,oracle为什么还要再去访问事务表呢?这是因为,oracle的提交有时会 是延迟提交。oracle并不清除延迟提交所涉及的块中的事务信息,如:事务所占ITL槽和行锁。而把清除事务信息这个操作 放到了以后的块清除中(块清除在以后的实验会详细讲述),oracle这样做的目的是为加快提交速度。如果一个事务涉及到了过多的块,单单是提交时清除每个块中的事务信息就需要耗费很长时间。这降低了提交速度。有可能使提交成为最易 引起争用的操作。当事务提交时,对事务所涉及的块,不做任何操作,块将保持事务仍在持续时的信息。当一个select操作 查询到这个块时,ITL槽中的提交标志为未提交,但实际上这个事务是已经提交的。就是因为有了延迟提交oracle无法根 据ITL槽中的提交标志来判断一个块中的事务是否真的提交。他必须根据ITL中的XID 去访问事务表。才能确定此块中的事务是否真的提交。在生成CR块前,oracle先要判断是否真的有必要为此块生成CR块。这就要去访问事务表。

闂傚倷绶氬ḿ褍螞瀹€鍕;闁跨噦鎷�

闂傚倷绶氬ḿ褍螞瀹€鍕;闁跨噦鎷�

闂傚倷绶氬ḿ褍螞濞嗘挸绀夐柡鍥ュ灩閸屻劑鏌曢崼婵囧閻庢艾顭烽弻銊モ攽閸℃ê鐝旂紓浣瑰敾缂嶄線寮婚敓鐘茬妞ゆ劧瀵岄埀顒侇殜閺岀喖鎽庨崒姘ギ闂佽鍟崶褔鍞堕梺缁樻煥閹芥粎绮旈鍕厽闁绘ê寮堕幖鎰版煟鎺抽崝灞藉祫闂佺鎻粻鎴g箽闂備浇娉曢崳锕傚箯閿燂拷
闂傚倷绀侀幖顐︽偋濠婂牆绀堟繛鎴欏灪閸嬬喐銇勯弽顐沪闁绘帡绠栭弻鏇熺箾閸喖濮庨梺璇叉唉椤曆嗗絹闂佹悶鍎荤徊鑺ユ櫠閹绘崡褰掓偂鎼淬垹娈楅悗娈垮枛閻栧吋淇婇悜鑺ユ櫆闁告挆鍐帗婵犵數鍋涢悺銊у垝瀹€鈧懞閬嶆嚃閳哄嫬小婵炲鍘ч悺銊╁吹閸岀偞鐓涢柛鎰╁妼閳ь剝宕电划鏃囥亹閹烘挾鍙嗗┑鐐村灱濞呮洜鈧熬鎷�闂備浇顕уù鐑藉极閹间降鈧焦绻濋崑顖氱秺瀹曞崬螣鐠囧樊娼梻浣风串缁蹭粙寮甸鍕仼闁告鍊戞惔銊ョ倞闁挎繂鎳庨埛澶嬬箾鐎电ǹ甯堕柟铏耿閻涱喚鈧綆鍠栫粻锝嗙節婵犲倸顏柟鏋姂濮婃椽宕ㄦ繝鍐f嫻缂備礁顑嗙敮锟犲箚閸ャ劌顕遍柡澶嬪灥閸炪劑姊洪幖鐐插姌闁告柨绉归敐鐐哄冀椤儱閰e畷鍫曟晲閸涱厸鎷ゅ┑鐐差嚟閸樠囧箠濮椻偓楠炲棝宕橀鑲╊槹濡炪倖鍔戦崹娲儊閺冣偓缁绘繈濮€閿濆棛銆愰柣搴㈣壘閹芥粌危閹扮増鏅搁柨鐕傛嫹闂傚倷鑳堕幊鎾绘偤閵娾晛鍨傞柛鎰ゴ閸亪鏌熺€电ǹ小闁绘帒锕ら埞鎴︽偐閸欏鎮欏┑鐐叉噷閸ㄥ綊婀侀梺鎸庣箓濡盯鎯屾惔銊︾厓鐟滄粓宕滃▎鎾崇疇闁归偊鍏橀弸鏃堟煙鏉堥箖妾柛瀣儔閺屾盯顢曢妶鍛€剧紓鍌氱М閸嬫捇姊绘担鐟扮亰闁绘帪绠撴俊鐢告倷閻㈢數顦梺鍝勫暙閻楀棛鐥閺屾盯骞囬娑氥€婄紓浣插亾闁跨噦鎷�闂備浇顕х花鑲╁緤婵犳熬缍栧鑸靛姇閸ㄥ倹绻濇繝鍌氼伀妞も晠鏀遍妵鍕箳閹存繃娈茬紓浣风贰閸o絽顕i崼鏇熷€烽柛顭戝亝閻濐亜鈹戦悙鑼闁搞劌澧庣划姘舵焼瀹ュ懐鍔撮梺鍛婂壃閸涱垼妲繝鐢靛Х椤d粙鍩€椤掆偓閸熷潡鍩€椤掑倹鍤€闁挎洏鍨洪幏鍛村礈閹绘帗顓块梻浣呵归張顒傛崲瀹ュ鑸归柟缁㈠枟閻撴瑩鎮楀☉娆嬬細濠⒀屽墯缁绘繈鍩€椤掍焦濯撮柛锔诲幘閹虫繈姊洪崜鑼帥闁稿鎳愮槐鐐哄焵椤掑嫭鈷戦柣鐔稿閹界娀鏌eΔ鍐ㄤ户闁瑰箍鍨归~婵嬵敄閼恒儳浜欓梻浣告惈濞诧箓鎯岄鐐床闁糕剝绋掗悡娆愩亜閹炬鍟版禒鏉戭渻閵堝棙澶勯柛鎾跺枎閻g兘鏁愰崱娆戠槇闂佸憡鍔忛弲鈺佄i鐐粹拺闁奸€涘嵆閸濈儤鎱ㄦ繝鍌ょ吋闁哄苯鐗撻獮姗€顢欓懖鈺婂悈闂備胶鎳撻悺銊у垝瀹ュ洤鍨濋柨鏇炲€归悡銉︾箾閹寸倖鎴濓耿閻楀牏绡€闁逞屽墴楠炲秹顢欓幆褍瑙︽繝鐢靛仜濡霉妞嬪海鐜绘俊銈呭暟绾惧ジ鏌¢崒娑卞劌闁稿骸绻掗埀顒冾潐閹哥ǹ螞濠靛棛鏆︽慨妯垮煐閸嬫劗绱撴担璐細鐟滅増鍨垮娲箰鎼粹€虫灆闂佺懓鍤栭幏锟�闂備浇顕уù鐑藉极閹间礁绠犻柟鎹愬煐閺嗘粍銇勯幇鍓佺暠缂佲偓閸℃ḿ绠鹃柟瀵镐紳椤忓牆鏋侀柛顐f礃閸婄數鐥鐐村婵炲吋鍔欓弻娑㈠Ω閿斿墽鐓佺紓浣稿€圭敮锟犮€佸Δ浣瑰缂佸鏅濋锔解拺閻熸瑥瀚欢鑼磼缂佹ê鐏寸€殿噮鍋婇、娆撴偩瀹€濠冪カ婵犳鍠楅妵娑㈠磻閹剧粯鐓冪憸婊堝礈濞嗘挸纾归柛婵勫劤缁€濠囨倵閿濆骸鏋熼柛搴$Ч閺屾盯寮撮妸銉ョ瑢閻熸粎澧楃敮妤呮偂閳ь剙顪冮妶鍡楃瑨闁挎洩濡囩划鍫ユ晸閿燂拷闂傚倷娴囨竟鍫熴仈缁嬫娼栧┑鐘崇閻掗箖鏌熺紒銏犳灈婵☆偅锕㈤弻锝夋偄缁嬫妫嗙紒缁㈠幐閸嬫捇姊绘担鐟邦嚋缂佸甯掗悾婵嬪箹娴e摜锛涢梺鍝勭Р閸斿酣銆呴悜鑺ョ叆闁绘洖鍊圭€氾拷:webmaster@jscj.com闂傚倷绶氬ḿ褍螞瀹€鍕;闁瑰墽绮悡鐔搞亜椤愵偄骞樼紒浣哄厴閺岋綁鏁傜捄銊х厯闂佽桨绀佺粔褰掑极閹剧粯鏅搁柨鐕傛嫹4008816886

相关文章

无相关信息
更新时间2022-03-13 11:11:03【至顶部↑】
联系我们 | 邮件: webmaster@jscj.com | 客服热线电话:4008816886(QQ同号) |  婵烇綀顕ф慨鐐碘偓骞垮灪濠€鍥ь嚗椤旇绻�

付款方式留言簿投诉中心网站纠错二维码手机版

客服电话: