1. 程式人生 > >oracle -- 數據塊(data Block)

oracle -- 數據塊(data Block)

性能問題 創建 行為 情況 參數 data 性能 鏈接 一定的

基本關系:數據庫---表空間---數據段---分區---數據塊


數據塊(data Block)
一、數據塊Block是Oracle存儲數據信息的最小單位。這裏說的是Oracle環境下的最小單位。Oracle也就是通過數據塊來屏蔽不同操作系統存儲結構的差異。無論是Windows環境,還是Unix/Linux環境,他們的操作系統存儲結構和方式、甚至字符排列的方式都是不同的。Oracle利用數據塊將這些差異加以屏蔽,全部數據操作采用對Oracle塊的操作,相當於是一個層次的抽象。

二、Oracle所有對數據的操作和空間分配,實際上都是針對數據塊Block的操作。我們從數據表中搜索出一行,實際中Oracle就會從內存緩沖區(或者硬盤)中讀取到該行所在的數據塊,再返回這數據塊上的指定數據行。Oracle無論是在緩沖區,還是在硬盤,進行數據操作的雖小單位也就是數據塊。

三、數據塊是有大小的,在一個數據庫建立的時候,通過參數進行設置。註意,在Oracle數據庫參數中,只有數據塊大小的參數是建庫之後不能進行修改的。數據塊的大小,在一個數據庫中可以支持多個,但是一般沒有太大的意義,會給管理和調試帶來一定的負擔。

四、數據塊(data block)的大小是操作系統的data block的整數倍,ORACLE默認是8K,還有4K,16K,32k幾種。設置數據塊的大小是依據不同類型的系統的。如果數據塊設置比較大,那麽一次讀取的數據行較多,相應對SGA內存消耗比較大,特定查詢引發的換入換出可能較多。如果設置的過小,頻繁的IO邏輯物理讀也會引起性能問題。
-----相關參數為db_block_size,查看block大小。


SQL> show parameter db_block_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_size integer 8192 //1024×8
註:
1、DB_BLOCK_SIZE作為數據庫的最小操作單位,是在創建數據庫的時候指定的,在創建完數據庫之後便不可修改。要修改DB_BLOCK_SIZE,需要重建數據庫。一般可以將數據EXP出來,然後重建數據庫,指定新的DB_BLOCK_SIZE,然後再將數據IMP進數據庫。

2、 DB_BLOCK_SIZE一般設置為操作系統塊的倍數,即2K,4K,8K,16K或32K,但它的大小一般受數據庫用途的影響。對於聯機事務,其特點是事務量大,但每個事務處理的數據量小,所以DB_BLOCK_SIZE設置小點就足夠了,一般為4K或者8K,設置太大話一次讀出的數據有部分是沒用的,會拖慢數據庫的讀寫時間,同時增加無必要的IO操作。而對於數據倉庫和ERP方面的應用,每個事務處理的數據量很大,所以DB_BLOCK_SIZE一般設置得比較大,一般為8K,16K或者32K,此時如果DB_BLOCK_SIZE小的話,那麽I/O自然就多,消耗太大。
3、 大一點的DB_BLOCK_SIZE對索引的性能有一定的提高。因為DB_BLOCK_SIZE比較大的話,一個DB_BLOCK一次能夠索引的行數就比較多。
4、 對於行比較大的話,比如一個DB_BLOCK放不下一行,數據庫在讀取數據的時候就需要進行行鏈接,從而影響讀取性能。此時DB_BLOCK_SIZE大一點的話就可以避免這種情況的發生。

初始化參數db_file_multiblock_read_count是用來約束Oracle進行多數據塊讀取時的行為,所謂多數據塊讀取,就是Oracle在一次I/O時,可以讀取多個數據塊,從而用最小的I/O完成數據的讀取。
db_file_multiblock_read_count的設置要受OS最大IO能力影響,也就是說,如果你系統的硬件IO能力有限,即使設置再大的db_file_multiblock_read_count也是沒用的。
------初始化參數db_file_multiblock_read_count,查看一次I/O完成數據的讀取。
SQL> show parameter db_file_multiblock_read_count;
NAME TYPE VALUE
-------------------------------------------------------
db_file_multiblock_read_count integer 32

SQL> alter session set db_file_multiblock_read_count=256;
會話已更改。

SQL> show parameter db_file;
NAME TYPE VALUE
-----------------------------------------------------
db_file_multiblock_read_count integer 128


oracle -- 數據塊(data Block)