簡單分析Oracle的資料存放區

來源:互聯網
上載者:User

簡單分析Oracle的資料存放區

在資料庫的儲存結構中,我們知道一般來說一個表都儲存在對應的資料檔案裡,資料檔案可以分為多個段,一般來說一個表會對應一個資料區段,單純考慮資料區段的時候,資料區段又可以分為多個區,每個區都可以分為若干個資料區塊,在作業系統層面,有對應的資料區塊和資料庫層面的資料區塊有一個映射,可以打個比方來說,一棟大樓裡面可以有很多的樓層,每個樓層可能都有不同的公司,這樣來考慮,這棟大樓就類似資料檔案,樓的每一層就類似一個資料區段,每一層比方最多可以有4家公司,一家公司有40個人,有的公司大一點,佔用兩層,那麼就是8個區,320個資料區塊,有的公司小一點,就佔用一層裡面的一塊,那麼這個公司就類似一個較小的資料區段,佔用1個區,包含40個資料區塊。

從儲存層面來說,目前資料庫中只能夠查詢到區這一層級的資訊了。

在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來做底層的分析。

在CentOS 6.4下安裝Oracle 11gR2(x64)

Oracle 11gR2 在VMWare虛擬機器中安裝步驟

Debian 下 安裝 Oracle 11g XE R2

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.