Informix入門之 -空間管理

mrhutoo發表於2013-09-04
    說起資料庫就不能不說資料庫的儲存,說儲存就不能不說資料庫對空間的管理。這裡我們主要談的是IDS對空間的管理的相關問題。
    從物理上來說,IDS管理的主要是page,chunk;從邏輯上來說主要是extent,tablespace,dbsapce。連續的page組成extent,多個extent組成tablespace,dbspace用來邏輯的管理chunk,而每個tablespace又是建立在dbsapce上的。
    Chunk:一個單位的物理磁碟空間,在9.4版本之前不應許超過2G。一個chunk由path,offset,size三部分組成。因此我們在使用onspaces命令來加chunk的時候這三個引數是必不可少的。理論上一個資料庫伺服器上最多有2048個儲存塊,但是實際上由UNIX核心規定的一個程式所能開啟的檔案數來確定的。如果是使用cooked file來做為儲存,那麼offset可以設定為0,如果使用raw device來做為儲存,那偏移量不能為0,至少第一個CHUNK的offset不能為0。
   Page:是一最基本的I/O單位。一個page的大小是由OS來決定的,有2K的,也有4K的。我們拿2K的來舉例說明。一個page有2048個bit,頁頭由24bit組成,頁尾有一個4bit的時間戳,也就是說每一個page剩餘的空間只有2020個bit,另外在每一個page上還有一個槽表,一個槽表4bit,一條記錄對應一個槽表,這樣在每一個page上存放的記錄數就可以定下來。說這些的目的是為了說明在我們建表的時候儘量表不要建的太大,有的表一條記錄的大小就超過了一個page,這樣在讀取的效率上並不是太高。另外還有一個FILLFACTOR的引數決定了資料頁的填充程度,如果此值設定的不是太合理,經常上現節點分裂的情況,那對錶的讀取效率肯定是有影響的。
   Extent:是磁碟上連續page的一組集合。在每個extent內的page都是連續的,在表中預設的extent的大小是16K,extent&的大小決定了表中資料存放的集中程度。如果資料存放的過與分散在做磁碟I/O的時間肯定會變長,一般的情況下每個表的extent的大小建議不要超過50,如果太大,就需要做合理的調整。另外不能不提的是在隨著extent數目的增長,每次分出的空間的大小是不不一樣的,在每到16的時候,就翻倍。例如第一個extent是16K,第17個extent就是32K,第33個就是64K了,在翻倍的增長。
   Tablespace:是extent的邏輯集合。各個extent在物理上不一定是連續的。
   Dbspace:是一組chunk的邏輯集合。一般是把裸裝置的chunk放在一個dbspace中,或者把一組熟檔案放在一組chunk中,也有的把裸裝置和熟檔案放在一組dbspace中,但不建議這麼做。
    其實在dbsapce中又有三類,一類就是一般的存放資料的dbsapce,另一類就是tempdbspace,還有一種是blobspace。第一種我就不說了。我們先說blobsapce.
    Blobspace:blobspace是一組邏輯組織的chunk,但是是用來儲存byte和text型別的資料。Blobspace中不能存放行或索引,只能存放儲存了blob的頁面和儲存了關於BLOB的系統資訊頁面。因為blobspace中的BLOB頁面的大小是在建立的時候指定的,所有一個blobspace中的所有BLOB頁面大小相同。對BLOB的寫,是沒有在緩衝池中緩衝的,因此BLOB的值不寫邏輯日誌檔案。當修改了BLOB的值之後,應該在磁碟上留出足夠的空間以放BLOB的初始值和修改值。
   Tempdbspace:是一組臨時的dbspace。他在DBSPACETEMP引數中指定。需要在onspaces建立的時候加上-t的引數。對tempsaces的操作是不寫邏輯日誌的。在建立臨時表和做group by ,order by,使用join語句,建立index的時候都是需要臨時空間的。一般的情況下所有的tempspace的大小為正常業務資料的10%。如果太小了很大的操作就會出問題。
Select * from tab_a insert into temp tab_b是不寫到tempdbspace的。
Select * from tab_a insert into temp tab_b with no log才寫到tempdbspace。
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24955184/viewspace-772120/,如需轉載,請註明出處,否則將追究法律責任。

相關文章