資料庫rowid實現問題

2021-09-24 10:23:45 字數 1080 閱讀 4677

在實現位圖索引的時候,出現了一些問題,引發出對rowid的一些思考。

位圖索引的目的就是對於重複值較多的字段,如果通過b樹索引,可能要不斷的進行比較操作,而使用位圖索引,則可以通過按位操作直接定位到滿足條件的記錄上,這樣位圖索引對於每個關鍵字的值都應該有乙個位圖,通過按位操作,找到記錄的rowid,然後通過rowid就可以直接定位到對應的記錄。

但是在達夢資料庫實現的時候,rowid並不是和記錄的物理位置相關聯的,而只是系統中的乙個唯一值而已,這樣如果使用rowid的話,則找到rowid之後還需要一次聚簇索引查詢操作,效率上就大打折扣了。

鑑於此,檢視了一下oracle的rowid,oracle的rowid是直接和記錄的物理位置相關聯的,其組成為:data_object_id#+rfile#+block#+row#組成,占用10個bytes的空間, 32bit的 data_object_id#,10 bit 的 rfile#,22bit 的 block#,16 bit 的 row#. 這樣oracle在實現位圖索引的時候,可以很容易的通過rowid定位到記錄的物理位置。

達夢在實現位圖索引的時候,也考慮考慮修改rowid,將其改為具體的物理位置,這樣一來帶來了另外乙個問題,達夢建立表的時候會預設的建立聚簇索引,聚簇索引的葉子節點儲存了實際的記錄,這樣在對錶進行一些更新、刪除、插入操作的時候,記錄的物理位置可能發生變化,那麼位圖索引中響應的物理位置的值也需要跟隨著變化。

試驗了一下oracle的rowid,在對錶進行更新、刪除、插入操作的時候,記錄的rowid並不會發生變化,因此可以反推,oracle是不是沒有建立聚簇索引,而是將記錄分開存放的?這樣在插入、更新、刪除的時候,其物理位置並沒有發生改變?這樣來實現應該也是有其一定的道理的,聚簇的概念就是將相關的記錄盡可能的在物理上連續存放,這樣在讀取的時候可以減少很多的io操作,而將記錄在物理上連續存放也是需要付出一定的代價的,即記錄可能在做更新操作的時候位置被挪動,從而帶來一定的開銷,因此使用者應該根據自己的需要在確實需要聚簇的時候來使用聚簇儲存。

但是達夢資料庫則預設的就建立了聚簇索引,這從一定程度上加快了記錄的訪問速度,但是不可避免的也帶來了一部分的額外開銷。

不知有沒有高手來解答一下oracle的rowid在聚簇的時候到底是如何處理的?是否也可能發生變化?

Oracle資料庫中rowid與rownum的區別

在查詢中,我們可以注意到,類似於 select xx from table where rownum n n 1 這樣的查詢是有正確含義的,而 select xx from table where rownum n 這樣的查詢只在n 1的時候成立,select xx from table where...

資料庫問題

資料庫問題 delphi windows sdk api 怎樣將兩個.dbf資料庫檔案,匯入到乙個表裡?在sql中有乙個叫企業管理器的東西.找到它然後找到你的目標資料庫,滑鼠右鍵有個匯入資料,裡面有個選項叫 使用一條查詢語句匯入.然後你就在這個查詢語句中寫一條sql命令,該命令同時查兩張表,但是只會...

資料庫問題!!

怎麼合併成乙個?這麼寫可以 select model,price from pcs where model in select model from products where maker b union select model,price from laptops where model in...