從上表可以看出,乙個資料庫是由多個表空間(tablespace)組成,乙個表空間又由多個段(segment)組成,乙個段又由多個區(extent)組成,乙個區則由多個塊(block)組成。
乙個資料庫中,undo和system表空間是必須存在的。
舉個例子:
話說張三是大壩縣的乙個農民,每年秋收的稻穀都必須放到縣里的糧倉裡統一管理。跟他一同去的還有李
四、王五等以種稻穀為主的農民。
剛開始的時候縣里糧倉給他分配了一塊5㎡的地方(block塊)給他存放。後來不夠用了,他又向管糧倉的領導申請了5㎡。誰知道今年大豐收,這10㎡的地方根本就不夠他用,下次又申請了5㎡。這三兩天就要了幾次地方放稻穀,領導覺得煩了,這樣下去豈不把我忙死?於是領導批准張三可以一次性申請90㎡(extent區),這樣的話張三就可以少去煩領導要地方放稻穀了。可是隨著張三的地一年一年地增多,收穫的稻子也一年比一年多,90㎡也不夠他用了,於是他再向領導申請,但這次他輕鬆多了,只去了一次,90㎡就到手了。。。但是很快,張三的業務發展迅速,已經不止種稻穀了,還種了蘋果!他又用同樣的方式申請了一塊90㎡的地方放蘋果,再下一年業務增加了種植菠蘿。。。就這樣一直發展,張三靠起家了,他這次真正的大豐收,縣里的糧倉給他分配的地方又不夠用了,張三就直接把整個糧倉(segment段)買了下來,正好儲備所有的農作物。但第二年,張三已經發展到養殖業了,於是直接在旁邊自己建了幾個倉庫,並且給這些倉庫(包括之前的糧倉)起了個名字,張生倉庫(tablespace)。
而李四、王五也幾乎同時,也跟張三一樣發家致富,各自也建了自己的倉庫,李生倉庫(tablespace1)、王生倉庫(tablespace2)。。。
他們幾十個發家致富的農民的倉庫共同組成了大壩縣的糧食倉庫(database)。
實驗一:建立測試表test_a,插入資料並檢視資料塊分布情況。
實驗過程:
-- 1.建立乙個有1000條記錄的表
create table test_a as select * from dba_objects do where rownum<=1000;
-- 2.檢視表中的資料塊儲存位置
select a.rowid ,b.file_name ,dbms_rowid.rowid_block_number(a.rowid) block_number,
dbms_rowid.rowid_row_number(a.rowid) row_number
from test_a a ,dba_data_files b
where b.file_id=dbms_rowid.rowid_to_absolute_fno(a.rowid,user,'test_a');
-- 3.檢視每個資料塊分布情況(每個實驗都用到此sql)
select dbms_rowid.rowid_block_number(a.rowid) as block_number,count(*) as record from test_a a ,dba_data_files b
where b.file_id=dbms_rowid.rowid_to_absolute_fno(a.rowid,user,'test_a')
group by rollup(dbms_rowid.rowid_block_number(a.rowid));
資料塊位置結果(樣本):
資料塊分布情況統計:
-----資料塊----- ----資料行數---
實驗結論:當我們在資料庫中建立表時,系統會自動分配連續的n塊資料塊存放資料,由於塊大小固定,插入資料時,每個塊裡面有大致相當的資料量,因為具體每行資料位元組數都會不一樣,所以塊儲存的資料量大致一樣。
實驗二:在實驗一基礎上刪除資料再重新查詢資料在塊中的分布情況
實驗過程:
-- 4.刪除表test_a在資料塊931中的資料
delete from test_a a where
dbms_rowid.rowid_block_number(a.rowid)=931;
刪除後資料塊分布情況:
-----資料塊----- ----資料行數---
插入資料,再觀察塊中資料量分布情況:
-- 5.插入資料,再觀察資料分布情況
insert into test_a select * from dba_objects do where rownum<=80;
-----資料塊----- ----資料行數---
實驗結論:
刪除表資料時,之前資料庫向系統申請的資料塊空間並不會一同刪除。而當我們再次插入資料的時候,會優先填補之前為此表分配過的塊,如空間不夠再擴充套件。
實驗三: 建立表test_b,跟test_a一樣的資料。
實驗過程:
-- 1.建立乙個有1000條記錄的表
create table test_b as select * from dba_objects do where rownum<=1000;
-- 2.檢視每個資料塊分布情況
select dbms_rowid.rowid_block_number(a.rowid) as block_number,count(*) as record from test_b a ,dba_data_files b
where b.file_id=dbms_rowid.rowid_to_absolute_fno(a.rowid,user,'test_b')
group by rollup(dbms_rowid.rowid_block_number(a.rowid));
-----資料塊----- ----資料行數---
實驗總結:
1. 建立新錶會分配新塊。
2. 留意test_a,建立後終結塊號為943,而在建立test_b的時候開始塊號已經是947,中間的一段944~946去了哪?答案體現在對區(extend)的理解上了,區是系統分配的最少單位(雖然塊是最小儲存單位),所以可以推測944~946塊也是分配給了test_a。
對於我們在資料庫裡新建資料庫(database),在資料庫中建立多個表空間(tablespace),在每個表空間內建表。例如我們可以分配多個使用者,在user1使用者下建立table1,table2,user2下建立table3,table4,user1、user2就等於不同的表空間,table1、table2是建立在表空間下的不同段(segment),而每張表的每個資料就是塊(block),一列資料可看做乙個區(extent),區滿了之後不斷擴充套件就組成了表。
本文只作為總結用,如有錯誤請更正。
Oracle邏輯結構
oracle的邏輯結構包括表空間 tablespace 段 segment 資料塊 data block 以及模式物件 schema 一 表空間 1.什麼是表空間?查詢表空間的檔案資訊 select from dba data files。查詢表空間的空閒空間資訊 select from dba f...
ORACLE邏輯結構
img 1 表空間 tablespace 表空間是資料庫中的基本邏輯結構,一系列資料檔案的集合。乙個表空間可以包含多個資料檔案,但是乙個資料檔案只能屬於乙個表空間。2 段 segment 段是物件在資料庫中占用的空間,雖然段和資料庫物件是一一對應的,但段是從資料庫儲存的角度來看的。乙個段只能屬於乙個...
oracle邏輯結構
對於我們在資料庫裡新建資料庫 database 在資料庫中建立多個表空間 tablespace 在每個表空間內建表。例如我們可以分配多個使用者,在user1使用者下建立table1,table2,user2下建立table3,table4,user1 user2就等於不同的表空間,table1 ta...