在線重建索引方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001 ] 本發(fā)明涉及數(shù)據(jù)庫領(lǐng)域,尤其涉及一種在線重建索引方法及裝置。
【背景技術(shù)】
[0002]關(guān)系數(shù)據(jù)庫一般采用B樹索引,B樹索引會需要對數(shù)據(jù)表的數(shù)據(jù)反復(fù)插入和刪除等動作,這樣會產(chǎn)生大量索引碎片,順序掃描時間會加長。數(shù)據(jù)反復(fù)被刪除后,索引中的索引條目并不是真正被刪除,而只是被標(biāo)記為刪除,并沒有被清除,這會使得雖然數(shù)據(jù)量減小,但是導(dǎo)致索引空間變大的問題。因此需要通過重建索引提升數(shù)據(jù)訪問速度,并釋放空間,另外,索引樹高度過高時,也需要重建索引。
[0003]目前,索引重建包括有三種方式:離線丟棄(drop)后重新創(chuàng)立(re-create)、離線重建(rebuild)和在線重建,其中,drop后re-create索引方式一般在應(yīng)用部署階段使用,離線重建適合上線后,系統(tǒng)可以短時間停下來進(jìn)行維護(hù),例如在夜間進(jìn)行維護(hù)。而對7*24小時運行系統(tǒng),一般采用在線重建方式進(jìn)行,這種方式下,重建索引過程中,不需要中斷現(xiàn)有業(yè)務(wù),影響較小。
[0004]現(xiàn)有技術(shù)中,在在線重建索引過程中,需要獲得對數(shù)據(jù)表的排它鎖的控制權(quán),而獲得排它鎖的控制權(quán)需要該數(shù)據(jù)表上無其它的排它鎖或者共享鎖,如果該數(shù)據(jù)表上一直存在其它的排它鎖或者共享鎖,那么將始終無法獲得排它鎖的控制權(quán),從而影響在線重建索引的效率和成功率。
【發(fā)明內(nèi)容】
[0005]針對上述問題,本發(fā)明的目的在于提供一種提高在線重建索引的效率和成功率的在線重建索引方法及裝置。
[0006]第一方面,本發(fā)明提供一種在線重建索引裝置,包括:
[0007]接收模塊,用于接收在線重建索引請求,所述在線重建索引請求包含數(shù)據(jù)表的標(biāo)識;
[0008]鎖處理模塊,用于根據(jù)所述在線重建索引請求,對所述數(shù)據(jù)表的標(biāo)識對應(yīng)的數(shù)據(jù)表加架構(gòu)共享鎖;
[0009]所述鎖處理模塊,還用于獲得円鎖,通過所述円鎖獲得所述數(shù)據(jù)表的結(jié)構(gòu)控制權(quán);
[0010]入口地址分配模塊,用于在所述鎖處理模塊獲得閂鎖后,為所述數(shù)據(jù)表的原始索引預(yù)留影子索引存儲空間,分配所述影子索引的入口地址,在所述數(shù)據(jù)表的根頁上添加所述影子索引的入口地址;
[0011]所述鎖處理模塊,還用于所述影子索引創(chuàng)建模塊完成在所述數(shù)據(jù)表的根頁上添加所述影子索引的入口地址后,釋放所述閂鎖;
[0012]影子索引創(chuàng)建模塊,用于根據(jù)所述原始索引的數(shù)據(jù),在所述影子索引存儲空間中創(chuàng)建影子索引;
[0013]所述鎖處理模塊,還用于所述影子索引創(chuàng)建模塊完成在所述影子索引存儲空間中創(chuàng)建影子索引后,重新獲得閂鎖;
[0014]入口地址處理模塊,用于所述鎖處理模塊重新獲得閂鎖后,將所述數(shù)據(jù)表的根頁的索引入口地址更新為影子索引入口地址;
[0015]所述鎖處理模塊,還用于所述入口地址處理模塊在所述數(shù)據(jù)表的根頁的索引入口地址更新為影子索引入口地址后,釋放所述重新獲得的閂鎖和所述架構(gòu)共享鎖。
[0016]在第一方面的第一種可能的實現(xiàn)方式中,還包括:事務(wù)處理模塊,用于接收對所述數(shù)據(jù)表的數(shù)據(jù)的更新請求,根據(jù)所述更新請求,對數(shù)據(jù)表的數(shù)據(jù)進(jìn)行更新。
[0017]結(jié)合第一方面或者第一方面的第一種可能的實現(xiàn)方式,在第一方面的第二種可能的實現(xiàn)方式中,還包括:更新模塊,用于在索引數(shù)據(jù)需要更新時,確定所述數(shù)據(jù)表的根頁中包含所述影子索引的入口地址,將需要更新的索引數(shù)據(jù)在所述原始索引和所述影子索引上進(jìn)行更新。
[0018]結(jié)合第一方面的第一種可能的實現(xiàn)方式,在第一方面的第三種可能的實現(xiàn)方式中,所述入口地址處理模塊,具體用于將所述數(shù)據(jù)表的根頁上的索引入口地址更改為所述影子索引的入口地址,刪除所述原始索引的入口地址。
[0019]結(jié)合第一方面的第一種可能的實現(xiàn)方式,在第一方面的第三種可能的實現(xiàn)方式中,所述入口地址處理模塊,具體用于將所述影子索引的入口地址修改為有效,刪除所述原始索引的入口地址。
[0020]第二方面,本發(fā)明提供一種在線重建索引的方法,包括:
[0021]接收在線重建索引請求,所述在線重建索引請求包含數(shù)據(jù)表的標(biāo)識;
[0022]根據(jù)所述在線重建索引請求,對所述數(shù)據(jù)表的標(biāo)識對應(yīng)的數(shù)據(jù)表加架構(gòu)共享鎖;
[0023]獲得閂鎖,通過所述閂鎖獲得所述數(shù)據(jù)表的結(jié)構(gòu)控制權(quán);
[0024]在所述獲得閂鎖后,為所述數(shù)據(jù)表的原始索引預(yù)留影子索引存儲空間,分配影子索引的入口地址,在所述數(shù)據(jù)表的根頁上添加所述影子索引的入口地址;
[0025]在完成在所述數(shù)據(jù)表的根頁上添加所述影子索引的入口地址后,釋放所述閂鎖;
[0026]根據(jù)所述原始索引的數(shù)據(jù),在所述影子索引存儲空間中創(chuàng)建影子索引;
[0027]在完成在所述影子索引存儲空間中創(chuàng)建影子索引后,重新獲得閂鎖;
[0028]在重新獲得閂鎖后,將所述數(shù)據(jù)表的根頁的索引入口地址更新為影子索引入口地址;
[0029]在所述數(shù)據(jù)表的根頁的索引入口地址更新為影子索引入口地址后,釋放所述重新獲得的閂鎖和所述架構(gòu)共享鎖。
[0030]在第二方面的第一種可能的實現(xiàn)方式中,還包括:接收對所述數(shù)據(jù)表的數(shù)據(jù)的更新請求,根據(jù)所述更新請求,對數(shù)據(jù)表的數(shù)據(jù)進(jìn)行更新。
[0031]結(jié)合第二方面的第一種可能的實現(xiàn)方式,還包括:在所述對數(shù)據(jù)表的數(shù)據(jù)進(jìn)行更新后,當(dāng)索引數(shù)據(jù)需要更新時,確定所述數(shù)據(jù)表的根頁中包含所述影子索引的入口地址,將需要更新的索引數(shù)據(jù)在所述原始索引和所述影子索引上進(jìn)行更新。
[0032]在第二方面的第二種可能的實現(xiàn)方式中,所述將所述數(shù)據(jù)表的根頁的索引入口地址更新為影子索引入口地址,具體為:將所述數(shù)據(jù)表的根頁上的索引入口地址更改為所述影子索引的入口地址,刪除所述原始索引的入口地址。
[0033]在第二方面的第二種可能的實現(xiàn)方式中,所述將所述數(shù)據(jù)表的根頁的索引入口地址更新為影子索引入口地址,具體為:將所述影子索引的入口地址修改為有效,刪除所述原始索引的入口地址。
[0034]本發(fā)明實施例的方案在啟動在線重建索引時,無需加schema排它鎖,而改為先加上共享鎖,防止重建期間的DDL操作,數(shù)據(jù)庫服務(wù)器通過獲取到latch,使原始索引TI1瞬間靜止無并發(fā),在數(shù)據(jù)表T的root頁上添加影子索引的入口地址后,開始在線重建索引。在重建過程中,如果有事務(wù)操作,要以加獨立的共享鎖,互不干擾。通過本發(fā)明實施例的方法,提高了在線重建索引的方法和裝置。
【附圖說明】
[0035]為了更清楚地說明本發(fā)明的技術(shù)方案,下面將對實施方式中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施方式,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0036]圖1是本發(fā)明實施例提供的一種在線重建索引的裝置的結(jié)構(gòu)示意圖;
[0037]圖2是本發(fā)明實施例提供的另一種在線重建索引的裝置的結(jié)構(gòu)示意圖;
[0038]圖3是本發(fā)明實施例提供的另一種在線重建索引的裝置的結(jié)構(gòu)示意圖;
[0039]圖4是本發(fā)明實施例提供的一種在線重建索引方法的流程示意圖;
[0040]圖5是本發(fā)明實施例提供的另一種在線重建索引方法的流程示意圖;
[0041]圖6是本發(fā)明實施例提供的另一種在線重建索引方法的流程示意圖;
[0042]圖7是本發(fā)明實施例提供的另一種在線重建索引方法的流程示意圖。
【具體實施方式】
[0043]下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護(hù)的范圍。
[0044]本發(fā)明實施例提供了一種在線重建索引方法及裝置,用于提高在線重建索引的效率和成功率,以下分別進(jìn)行詳細(xì)說明。
[0045]為了便于理解本發(fā)明實施例,下面先對本發(fā)明實施例的數(shù)據(jù)庫系統(tǒng)進(jìn)行描述。在一個數(shù)據(jù)庫系統(tǒng)中,包含了數(shù)據(jù)庫客戶端、數(shù)據(jù)庫服務(wù)器和數(shù)據(jù)源,數(shù)據(jù)庫客戶端用于接收第三方軟件或者管理員等發(fā)送的各類請求或者命令,并把各類請求或者命令發(fā)送給數(shù)據(jù)庫服務(wù)器,數(shù)據(jù)庫服務(wù)器根據(jù)不同的請求或者命令,做相應(yīng)處理。數(shù)據(jù)源為數(shù)據(jù)庫中對數(shù)據(jù)表、視圖、儲存過程等資源進(jìn)行管理的一個對象,如Oracle數(shù)據(jù)庫中的一個架構(gòu)(schema)或MySQL數(shù)據(jù)庫中的一個數(shù)據(jù)庫(database)。數(shù)據(jù)源可以包含了多張不同的數(shù)據(jù)表,而每張數(shù)據(jù)表都有一個根頁(root),在根頁上包含了該數(shù)據(jù)表的索引的入口地址,通過該入口地址可以查詢到該數(shù)據(jù)表的索引,通過索引可以查詢到該數(shù)據(jù)表的各個數(shù)值。數(shù)據(jù)源還保存了該數(shù)據(jù)表的根頁,以及原始索引和影子索引,數(shù)據(jù)