Rumah > pangkalan data > Oracle > teks badan

Penjelasan terperinci tentang rowid dalam Panduan Kajian Oracle

WBOY
Lepaskan: 2022-03-15 20:04:55
ke hadapan
3374 orang telah melayarinya

Artikel ini membawa anda pengetahuan yang berkaitan tentang Oracle, yang terutamanya memperkenalkan isu yang berkaitan dengan rowid Setiap baris data dalam jadual pangkalan data Oracle mempunyai pengecam unik Atau dipanggil rowid, ia biasanya digunakan di dalam Oracle untuk mengakses data saya harap ia akan membantu semua orang.

Penjelasan terperinci tentang rowid dalam Panduan Kajian Oracle

Tutorial yang disyorkan: "Tutorial Pembelajaran Oracle"

1. Gambaran keseluruhan menyimpan maklumat dalam rowid

oracle pangkalan data Setiap baris data dalam jadual mempunyai pengecam unik, atau rowid, yang biasanya digunakan untuk mengakses data dalam Oracle. rowid memerlukan 10 bait ruang storan dan menggunakan 18 aksara untuk dipaparkan. Nilai ini menunjukkan lokasi fizikal tertentu baris dalam pangkalan data Oracle. Rowid boleh digunakan dalam pertanyaan untuk menunjukkan bahawa nilai disertakan dalam hasil pertanyaan.

Simpan rowid memerlukan 10 bait atau 80 bit binari. Rowid lanjutan disimpan dalam 10 bait, dengan jumlah 80 bit, termasuk obj#32bit, rfile#10bit, block#22bit dan row#16bit. Oleh itu, nombor fail relatif tidak boleh melebihi 1023, iaitu bilangan fail data dalam ruang jadual tidak boleh melebihi 1023 (tiada fail dengan nombor fail 0 Fail data hanya boleh mempunyai 2^22=4M blok, dan tidak lebih daripada 1023 blok boleh dimasukkan dalam satu blok 2^16=64K baris data. Tidak boleh ada lebih daripada 2^32=4G objek dalam pangkalan data.
80 bit perduaan ini ialah:
1. Nombor objek data, menunjukkan nombor objek pangkalan data yang mana baris ini dimiliki Setiap objek data diberikan nombor secara unik apabila pangkalan data dicipta, dan nombor ini unik . Nombor objek data menduduki kira-kira 32 bit.
2. Nombor fail yang sepadan, menunjukkan nombor fail di mana baris terletak Setiap label fail dalam ruang jadual adalah unik. Nombor fail menduduki 10 digit.
3. Nombor blok, menunjukkan lokasi blok fail di mana baris dihalakan Nombor blok memerlukan 22 digit.
4. Nombor baris, menunjukkan kedudukan khusus baris dalam direktori baris Nombor baris memerlukan 16 digit.
Ini menambah sehingga 80 bit.

Nota: Sebelum Oracle versi 8, rowid terdiri daripada fail# blok# baris#, menduduki 6 bait ruang, 10 bit fail#, 22bit blok#, 16 bit baris# . Oracle8 dan versi yang lebih baru menukar ruang kepada 10 bait.

ROWID lanjutan fizikal Oracle mempunyai 18 bit, setiap bit dikodkan dalam 64 bit, menggunakan A~Z, a~z, 0~9, , / A sejumlah 64 aksara diwakili. A mewakili 0, B mewakili 1, ...Z mewakili 25, a mewakili 26, ...z mewakili 51, 0 mewakili 52, ..., 9 mewakili 61, mewakili 62, / mewakili 63.

SELECT T.ROWID, T.* FROM DEPT T
Salin selepas log masuk

Untuk mengesahkan bahawa ruang storan rowid ialah 10 bait, termasuk objek 32bit#, 10bit rfile#, 22bit block# dan 16bit row#. Kita perlu menggunakan fungsi dump.

select rowid,dump(rowid,16) from DEPT
Salin selepas log masuk

2. Sahkan dan lihat kandungan rowid

1 Gunakan fungsi dalam pakej dbms_rowid untuk melihat

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;
Salin selepas log masuk

Hasilnya adalah seperti berikut: <.>

2. Pertanyaan maklumat data daripada jadual

1) Nombor objek pertanyaan: 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';
Salin selepas log masuk
Hasilnya adalah seperti berikut:

Penjelasan: Perbezaan antara DATA_OBJECT_ID dan OBJECT_ID

Object_id dan data_object_id kedua-duanya adalah pengecam unik objek.

object_id ialah pengenalan logik objek

data_object_id ialah pengenalan fizikal objek

Hanya jadual, indeks dan buat asal objek dengan lokasi storan fizikal sebenar mempunyai data_object_id. Untuk objek tanpa storan fizikal, data_object_id kosong. Contohnya: (prosedur, fungsi, pakej, jenis data, pautan db, definisi mv, definisi paparan, jadual sementara, definisi jadual partition, dll.)

Dalam kebanyakan kes, kedua-duanya adalah sama. Walau bagaimanapun, selepas memotong, memindahkan, membina semula dan operasi lain dilakukan pada objek, data_object_id akan berubah, tetapi object_id tidak akan berubah.

Lakukan operasi potong pada DEPT sasaran, kod: TRUNCATE TABLE DEPT;

Soal keputusan sekali lagi:

Letakkan truncate sebelum Masukkan semula data ke dalam jadual dan semak bahawa rowid yang mewakili nombor objek telah berubah daripada AAAUOO kepada AAAUOP, meningkat sebanyak 1.

2) Nombor fail pertanyaan:

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';
Salin selepas log masuk
HEADER_BLOCK: nombor blok data pertama jadual ini

BLOK: Nombor ini blok data dalam jadual

RELATIVE_FNO: nombor fail relatif

Hasilnya adalah seperti berikut:

说明:

从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';
Salin selepas log masuk

执行结果:

因为创建用户时没用指定默认表空间,建表时也没用指定表空间,所以此处使用的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');
Salin selepas log masuk

推荐教程:《Oracle教程

Atas ialah kandungan terperinci Penjelasan terperinci tentang rowid dalam Panduan Kajian Oracle. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:csdn.net
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan