簡單分析oracle的資料儲存
從儲存層面來說,目前資料庫中只能夠查詢到區這一級別的資訊了。
在user_extents中只能夠檢視到最基本的區的資訊,user_segment裡面可以得到一個大體的資訊
SQL> desc user_extents
Name Null? Type
----------------------------------------- -------- ----------------------------
SEGMENT_NAME VARCHAR2(81)
PARTITION_NAME VARCHAR2(30)
SEGMENT_TYPE VARCHAR2(18)
TABLESPACE_NAME VARCHAR2(30)
EXTENT_ID NUMBER
BYTES NUMBER
BLOCKS NUMBER
SQL> select extent_id,blocks from user_extents where segment_name='DATA';
EXTENT_ID BLOCKS
---------- ----------
0 8
1 8
2 8
3 8
4 8
5 8
SQL> select extents,blocks from user_segments where segment_name='DATA';
EXTENTS BLOCKS
---------- ----------
6 48
如果想檢視每個區中包含哪些資料塊,就無能為力了。這個時候dba_extents可以作為一個補充。可以看到哪些區包含哪些資料塊。
SQL> select block_id,extent_id,BLOCKS from dba_extents where owner='N1' and segment_name='DATA';
BLOCK_ID EXTENT_ID BLOCKS
---------- ---------- ----------
12800 0 8
12808 5 8
3600 4 8
5224 3 8
12672 2 8
12672 1 8
當然了這個也不能讓熱滿意,有時候想看看一些記錄大概佔有多大的空間,就可以使用rowid來輔助了。
目前我們得到表data的資料型別如下:
DATA_LENGTH DATA_TYPE
----------- ------------------------------
10 VARCHAR2
22 NUMBER
22 NUMBER
22 NUMBER
22 NUMBER
22 NUMBER
22 NUMBER
22 NUMBER
22 NUMBER
22 NUMBER
SQL> select sum(data_length) from user_tab_cols where table_name='DATA';
SUM(DATA_LENGTH)
----------------
208
那麼這些資料型別的資料佔用的空間是否是按照最大位元組208來儲存的呢,換句話說就是表裡存放著一條記錄,可能長度只有number(2),但是是否會依舊佔用22個位元組來儲存呢。
我們隨機抽取一個資料塊來簡單的測試一下。
可以看到如下兩條記錄是從0開始計數的,都在12803這個資料塊中。
select dbms_rowid.ROWID_OBJECT(rowid) object_id,
dbms_rowid.ROWID_RELATIVE_FNO(rowid) file_no,
dbms_rowid.rowid_row_number(rowid) row_no,
dbms_rowid.rowid_block_number(rowid) blk_number
from data where rownum<3;
OBJECT_ID FILE_NO ROW_NO BLK_NUMBER
---------- ---------- ---------- ----------
18993 11 0 12803
18993 11 1 12803
我們來進一步檢視12803這個資料塊中含有哪些記錄。不考慮資料塊的其他儲存引數。按照預設的值來看。
裡面含有約148條記錄。
OBJECT_ID FILE_NO ROW_NO BLK_NUMBER
---------- ---------- ---------- ----------
。。。。。。
18993 11 143 12803
18993 11 144 12803
18993 11 145 12803
18993 11 146 12803
18993 11 147 12803
148 rows selected.
可以得到每條記錄的平均大小就是55位元組。
SQL> select 1024*8/148 from dual;
1024*8/148
----------
55.3513514
另外需要注意的是,這個rownum,block number可以給予不同的資料檔案有不同的含義。
同樣一個表中的記錄在資料檔案5中是資料塊12676,在7號資料檔案是也含有資料塊為12767的。而且對應的資料行數也是重新從0開始計算。
OBJECT_ID FILE_NO ROW_NO BLK_NUMBER
---------- ---------- ---------- ----------
18993 5 143 12676
18993 5 144 12676
18993 5 145 12676
18993 5 146 12676
18993 5 147 12676
18993 5 148 12676
18993 7 0 12676
18993 7 1 12676
18993 7 2 12676
18993 7 3 12676
18993 7 4 12676
從上面的小測試可以簡單得出:
資料型別的儲存是有一定的收縮性的,比如資料型別為number(22),最大支援22位,但是它實際儲存的時候會按照實際的儲存資料進行分配
另外一個資料段可以儲存在多個資料檔案中,資料塊號為12676在不同的資料檔案中有不同的含義,對應的row_number也有不同的意義。
我們可以從user_extents中檢視對應的區段資訊,可以從dba_extents中得到更多的資訊,但是更深入的分析,可以藉助rowid來檢視,在情況允許的時候,甚至可以匯出對應的資料塊dump來做底層的分析。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1347032/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle大物件資料儲存簡介Oracle物件
- oracle中的數值資料儲存格式分析(ZT)Oracle
- ORACLE PL/SQL 物件、表資料對比功能儲存過程簡單實現OracleSQL物件儲存過程
- Oracle資料儲存結構Oracle
- Oracle儲存單位Oracle
- oracle10gR1 asm儲存簡單示例OracleASM
- Hive簡易教程 - 資料儲存Hive
- Oracle 資料倉儲簡單時間維度表的建立Oracle
- MySQL資料庫儲存引擎簡介MySql資料庫儲存引擎
- 【Redis】redis各型別資料儲存分析Redis型別
- Druid:實時分析資料儲存UI
- 簡單的造數儲存過程儲存過程
- 簡單的鍵值儲存測試
- 簡單的儲存過程分頁儲存過程
- 簡單的分頁儲存過程儲存過程
- MongoDB 預設寫入關注儲存資料丟失問題與原始碼簡單分析MongoDB原始碼
- oracle資料塊中資料儲存(摘錄)Oracle
- 資料儲存--檔案儲存
- 檔案系統儲存與oracle資料庫儲存對比Oracle資料庫
- 低程式碼平臺+阿里雲端儲存:讓業務開發更簡單,資料儲存更安全阿里
- 資料儲存--面向列的儲存設計
- 簡單認識MySQL儲存引擎MySql儲存引擎
- 簡單檔案的上傳與儲存
- 資料儲存
- 單細胞資料 儲存方式彙總
- 更簡單易用的資料倉儲,阿里雲重磅推出分析型資料庫3.0版阿里資料庫
- 聚焦資料時代新儲存需求,浪潮儲存的新儲存之道
- 資料儲存(1):從資料儲存看人類文明-資料儲存器發展歷程
- oracle RAC 更換儲存遷移資料Oracle
- ORACLE資料檔案儲存之我見Oracle
- oracle資料型別與儲存結構Oracle資料型別
- 【融雲分析】從過剩儲存資源到分散式時序資料庫的長儲存分散式資料庫
- 資料遷移工具簡單分析
- HDU-安卓程式開發之簡單儲存/內部儲存/外部儲存 & 捉蟲安卓
- EMC儲存Raid故障資料分析報告AI
- 50億海量資料如何高效儲存和分析?
- MySQL資料分析儲存引擎示例講解HKEAMySql儲存引擎
- Hive的壓縮儲存和簡單優化Hive優化