oracle如何給表加鎖 oracle建索引會(huì)鎖表嗎?
oracle建索引會(huì)鎖表嗎?應(yīng)該是沒有默認(rèn)索引,建立主鍵或者索引之后,oracle會(huì)在單獨(dú)的一塊區(qū)域建立索引的數(shù)據(jù),索引的數(shù)據(jù)和表的數(shù)據(jù)是分別存放的,不是在一起的,索引的數(shù)據(jù)就對應(yīng)表的主鍵或者其他索引
oracle建索引會(huì)鎖表嗎?
應(yīng)該是沒有默認(rèn)索引,建立主鍵或者索引之后,oracle會(huì)在單獨(dú)的一塊區(qū)域建立索引的數(shù)據(jù),索引的數(shù)據(jù)和表的數(shù)據(jù)是分別存放的,不是在一起的,索引的數(shù)據(jù)就對應(yīng)表的主鍵或者其他索引,例如,你的表里有100條數(shù)據(jù),并且有主鍵,那么在索引的區(qū)域就會(huì)有100條數(shù)據(jù)和它們對應(yīng),并且由于是主鍵數(shù)據(jù),所以每條數(shù)據(jù)都是唯一的,不會(huì)重復(fù),數(shù)據(jù)檢索的時(shí)候,先去檢索索引區(qū),因?yàn)槟抢锏臄?shù)據(jù)比較少,所以速度很快。
但如果沒有主鍵,一個(gè)表中可以有重復(fù)的數(shù)據(jù),所以系統(tǒng)也不知道按照什么樣的規(guī)則自動(dòng)建索引,就不會(huì)有默認(rèn)的索引,oracle每次查詢都會(huì)進(jìn)行全表查詢。怎么查看oracle是否鎖表?
Oracle數(shù)據(jù)庫操作中,我們有時(shí)會(huì)用到鎖表查詢以及解鎖和kill進(jìn)程等操作,那么這些操作是怎么實(shí)現(xiàn)的呢?本文我們主要就介紹一下這部分內(nèi)容。(1)鎖表查詢的代碼有以下的形式:select count(*) from v$locked_objectselect * from v$locked_object(2)查看哪個(gè)表被鎖select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id(3)查看是哪個(gè)session引起的select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time (4)殺掉對應(yīng)進(jìn)程執(zhí)行命令:alter system kill session"1025,41"其中1025為sid,41為serial#.
oracle數(shù)據(jù)庫鎖表怎么解決?
首先你要知道表鎖住了是不是正常鎖?因?yàn)槿魏蜠ML語句都會(huì)對表加鎖。你要先查一下是那個(gè)會(huì)話那個(gè)sql鎖住了表,有可能這是正常業(yè)務(wù)需求,不建議隨便KILLsession,如果這個(gè)鎖表是正常業(yè)務(wù)你把sessionkill掉了會(huì)影響業(yè)務(wù)的。建議先查原因再做決定。(1)鎖表查詢的代碼有以下的形式:selectcount(*)fromv$locked_objectselect*fromv$locked_object(2)查看哪個(gè)表被鎖selectb.owner,b.object_name,a.session_id,a.locked_modefromv$locked_objecta,dba_objectsbwhereb.object_id=a.object_id(3)查看是哪個(gè)session引起的selectb.username,b.sid,b.serial#,logon_timefromv$locked_objecta,v$sessionbwherea.session_id=b.sidorderbyb.logon_time(4)查看是哪個(gè)sql引起的selectb.username,b.sid,b.serial#,c.*fromv$locked_objecta,v$sessionb,v$sqlcwherea.session_id=b.sidandb.SQL_ID=c.sql_idandc.sql_id=""orderbyb.logon_time(5)殺掉對應(yīng)進(jìn)程執(zhí)行命令:altersystemkillsession"1025,41"其中1025為sid,41為serial#.
平時(shí)使用oracle時(shí),為什么會(huì)鎖表?
簡單地說,鎖是為了保證數(shù)據(jù)的一致性,鎖不止存在于oracle,其他數(shù)據(jù)庫一樣有,只不過機(jī)制上可能大相徑庭。至于什么樣的操作會(huì)鎖表,其實(shí)鎖的種類很多,你所說的鎖表大概說的是行級鎖——也就是事務(wù)鎖吧。比如一個(gè)update語句,被update的行上會(huì)有鎖——能阻塞其他事務(wù)對這些行進(jìn)行修改的鎖,雖然這時(shí)候這張表上也有表級鎖,但這個(gè)表級鎖并不影響其他事務(wù)對表中的其他行進(jìn)行修改,只是會(huì)阻礙對這張表的DDL操作。
oracle表在什么情況下會(huì)被鎖???
在對指定表做append操作,其他再做truncate時(shí)候,會(huì)產(chǎn)生鎖表,如下驗(yàn)證步驟,1、創(chuàng)建測試表,create table test_lock(id number, value varchar2(200))2、執(zhí)行append語句;并且不做提交,insert /* append*/ into test_lock values(1,1)3、再次執(zhí)行清表語句,truncate table test_lock報(bào)鎖表錯(cuò)誤,4、查看鎖表語句,發(fā)現(xiàn)被鎖表,select b.object_name, t.* from v$locked_object t, user_objects b where t.object_id = b.object_id