Oracle學習指南之rowid詳解
本篇文章為大家帶來了關於Oracle的相關知識,其中主要介紹了關於rowid的相關問題,oracle資料庫的表中的每一行資料都有一個唯一的標識符,或稱為rowid,在oracle內部通常就是使用它來存取資料的,希望對大家有幫助。
推薦教學:《Oracle學習教學》
一、rowid中儲存資訊概述
oracle資料庫的表中的每一行資料都有一個唯一的標識符,或稱為rowid,在oracle內部通常就是使用它來存取資料的。 rowid需要 10個位元組的儲存空間,並用18個字元來顯示。該值顯示了該行在oracle資料庫中的物理具體位置。可以在一個查詢中使用rowid來表示查詢結果中包含該值。
儲存rowid需要10個位元組或80個位元二進位位元。一個擴充rowid採用10個byte來存儲,共80bit,其中obj#32bit,rfile#10bit,block#22bit,row#16bit。所以相對文件號不能超過1023,也就是一個表空間的資料檔不能超過1023個(不存在文件號為0的文件),一個datafile只能有2^22=4M個block,,一個block不能超過2^16=64K行資料。而一個資料庫內不能有超過2^32=4G個object。
這80個二進位位元分別是:
1. 資料物件編號,表示此行所屬的資料庫物件的編號,每個資料物件在資料庫建立的時候都被唯一分配編號,而此編號唯一。資料物件編號佔用約32位元。
2. 對應檔案編號,表示該行所在檔案的編號,表空間的每一個檔案標號都是唯一的。文件編號所佔用的位置是10位。
3. 區塊編號,表示改行所在檔案的區塊的位置區塊編號需要22位元。
4. 行編號,表示該行在行目錄中的特定位置行編號需要16位。
這樣加起來就是80位。
備註:在oracle 8版本以前,rowid由file# block# row#組成,佔用6個bytes的空間,10 bit 的file# ,22bit 的block# ,16 bit 的row# 。 oracle8以後版本改為10個bytes的空間。
Oracle的物理擴展ROWID有18位,每位採用64位編碼,分別以A~Z、a~z、0~9、 、/共64個字元表示。 A表示0,B表示1,…Z表示25,a表示26,…z表示51,0表示52,…,9表示61, 表示62,/表示63。
SELECT T.ROWID, T.* FROM DEPT T
為了驗證rowid的儲存空間為10位元組,其中32bit的object#,10bit的rfile#,22bit的block#,16bit的row#。我們需要使用dump函數。
select rowid,dump(rowid,16) from DEPT
二、驗證查看rowid內容
1、使用dbms_rowid套件中函數查看
SELECT ROWID, DBMS_ROWID.ROWID_OBJECT(ROWID) AS OBJECT, DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) AS FILENUM, DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) AS BLOCK, DBMS_ROWID.ROWID_ROW_NUMBER(ROWID) AS ROWN FROM DEPT;
結果如下:
2、從表格中查詢資料資訊
1)查詢物件編號:DATA_OBJECT_ID
SELECT OBJECT_NAME, OBJECT_TYPE, SUBOBJECT_NAME, OBJECT_ID, DATA_OBJECT_ID FROM DBA_OBJECTS T WHERE T.OBJECT_NAME ='DEPT' AND T.OWNER = 'CHF';
結果如下:
大多數情況下兩者是相等的。但對object 進行truncate,move, rebuild 等操作後,data_object_id就會改變,而object_id不會改變。# #說明:DATA_OBJECT_ID與OBJECT_ID的差異
object_id和data_object_id 都是物件的唯一識別。
object_id是物件的邏輯標識
data_object_id是物件的物理標識
只有表,索引,undo這些有實際物理儲存位置的物件才有data_object_id。而對於沒有實體儲存的對象,data_object_id就是空。例如:(procedure,function,package,data type,db link,mv定義,view定義,臨時表,分區表定義等等)
對標DEPT執行truncate操作,代碼:TRUNCATE TABLE DEPT;
再次查詢結果:
將truncate前資料重新插入表中,查看rowid代表物件號碼的部分已發生變化由AAAUOO變為AAAUOP,增加了1。
2)查詢檔案編號:
SELECT T.SEGMENT_NAME, T.HEADER_BLOCK, T.BLOCKS, T.EXTENTS, T.RELATIVE_FNO FROM DBA_SEGMENTS T WHERE T.SEGMENT_NAME = 'DEPT' AND T.OWNER = 'CHF';
HEADER_BLOCK:本表的第一個資料區塊號
BLOCKS:本表的資料區塊數
RELATIVE_FNO:相對檔案編號
###結果如下:###说明:
从Oracle8开始,Oracle开始使用“相对文件号”,使原来一个数据库最多只能有1023个文件,扩展为一个表空间最多可以有1023个文件,每个库最多可以有65534个文件
验证文件号
SELECT T.TABLE_NAME, T.TABLESPACE_NAME, G.FILE_NAME, G.FILE_ID, G.RELATIVE_FNO FROM DBA_TABLES T INNER JOIN DBA_DATA_FILES G ON G.TABLESPACE_NAME = T.TABLESPACE_NAME WHERE T.TABLE_NAME = 'DEPT' AND T.OWNER = 'CHF';
执行结果:
因为创建用户时没用指定默认表空间,建表时也没用指定表空间,所以此处使用的USERS表空间(大家不必在意这些细节...),可以看到文件号和相对文件号都是 4 ,这是因为我的数据库中每个表空间只有一个数据文件,如果一个表空间有多个数据文件,这两个值有可能不一样。
知识扩展:
我们可以使用跟踪文件查看数据文件信息,命令:alter session set events 'immediate trace name FILE_HDRS level 10';
执行完此代码后,将在数据库服务器生成一个跟踪文件,查看文件路径代码:
select u_dump.value || '/' || db_name.value || '_ora_' || v$process.spid || nvl2(v$process.traceid, '_' || v$process.traceid, null ) || '.trc' "Trace File" from v$parameter u_dump cross join v$parameter db_name cross join v$process join v$session on v$process.addr = v$session.paddr where u_dump.name = 'user_dump_dest' and db_name.name = 'db_name' and v$session.audsid=sys_context('userenv','sessionid');登入後複製
推荐教程:《Oracle教程》
以上是Oracle學習指南之rowid詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Oracle 打不開的解決辦法包括:1. 啟動數據庫服務;2. 啟動監聽器;3. 檢查端口衝突;4. 正確設置環境變量;5. 確保防火牆或防病毒軟件未阻止連接;6. 檢查服務器是否已關閉;7. 使用 RMAN 恢復損壞的文件;8. 檢查 TNS 服務名稱是否正確;9. 檢查網絡連接;10. 重新安裝 Oracle 軟件。

解決 Oracle 游標關閉問題的方法包括:使用 CLOSE 語句顯式關閉游標。在 FOR UPDATE 子句中聲明游標,使其在作用域結束後自動關閉。在 USING 子句中聲明游標,使其在關聯的 PL/SQL 變量關閉時自動關閉。使用異常處理確保在任何異常情況下關閉游標。使用連接池自動關閉游標。禁用自動提交,延遲游標關閉。

Oracle 中,FOR LOOP 循環可動態創建游標, 步驟為:1. 定義游標類型;2. 創建循環;3. 動態創建游標;4. 執行游標;5. 關閉游標。示例:可循環創建游標,顯示前 10 名員工姓名和工資。

Oracle 日誌文件寫滿時,可採用以下解決方案:1)清理舊日誌文件;2)增加日誌文件大小;3)增加日誌文件組;4)設置自動日誌管理;5)重新初始化數據庫。在實施任何解決方案前,建議備份數據庫以防數據丟失。

Oracle不僅是數據庫公司,還是雲計算和ERP系統的領導者。 1.Oracle提供從數據庫到雲服務和ERP系統的全面解決方案。 2.OracleCloud挑戰AWS和Azure,提供IaaS、PaaS和SaaS服務。 3.Oracle的ERP系統如E-BusinessSuite和FusionApplications幫助企業優化運營。

在CentOS系統上搭建Hadoop分佈式文件系統(HDFS)需要多個步驟,本文提供一個簡要的配置指南。一、前期準備安裝JDK:在所有節點上安裝JavaDevelopmentKit(JDK),版本需與Hadoop兼容。可從Oracle官網下載安裝包。環境變量配置:編輯/etc/profile文件,設置Java和Hadoop的環境變量,使系統能夠找到JDK和Hadoop的安裝路徑。二、安全配置:SSH免密登錄生成SSH密鑰:在每個節點上使用ssh-keygen命令

要停止 Oracle 數據庫,請執行以下步驟:1. 連接到數據庫;2. 優雅關機數據庫(shutdown immediate);3. 完全關機數據庫(shutdown abort)。

可以通過使用 Oracle 的動態 SQL 來根據運行時輸入創建和執行 SQL 語句。步驟包括:準備一個空字符串變量來存儲動態生成的 SQL 語句。使用 EXECUTE IMMEDIATE 或 PREPARE 語句編譯和執行動態 SQL 語句。使用 bind 變量傳遞用戶輸入或其他動態值給動態 SQL。使用 EXECUTE IMMEDIATE 或 EXECUTE 執行動態 SQL 語句。
