oracle数据block默认是,oracleBLOCK(数据块)
11.4 BLOCK(數據塊)
11.4.1 BLOCK(數據塊)的特點:
BLOCK是Oracle進行存儲空間IO操作的最小單位,BLOCK的管理方法是區的管理和段管理的具體體現:
1、自動管理方式 如創建表空間時區為本地管理方式,并且將段的存儲空間方式設置為AUTO(即ASSM),該表空間的所有塊均采用位圖自動管理方式。這是系統默認的。
2、空閑列表方式(MSSM) 引入FREELIST概念,以及PCTFREE和PCTUSED兩個參數控制可用存儲區的大小,避免行遷移現象的發生。這兩個參數可在創建表空間時設置,也可在建立數據庫的模式對象(表,索引)中設置。模式對象中設置的優先級比表空間的要高。就是說;如表和索引中沒有設置,則按表空間的設置,如表空間也沒設置,則按自動管理方式管理塊。
data block :oracle 11g 標準塊:8k,支持2-32k,有block header 、free space 、data 組成
數據塊頭部:
ITL:事務槽,可以有多個ITL以支持并發事務,每當一個事務要更新數據塊里的數據時,必須先得到一個ITL槽,然后將當前事務ID,事務所用的undo數據塊地址,SCN號,當前事務是否提交等信息寫到ITL槽里。
initrans:初始化事務槽的個數,表默認1, index 默認為2;
maxtrans: 最大的事務槽個數 (默認255)
ROW DIR: 行目錄, 指向空閑行起始和結束的偏移量。
考點:使塊頭增加的可能情況是,row entries增加,增加更多的ITL空間。
空閑列表方式的數據塊的管理:
freelist:空閑列表中登記了可以插入數據的可用塊,位置在段頭,插入表行數據時首先查找該列表。
pctfree:用來為一個塊保留的空間百分比,以防止在今后的更新操作中增加一列或多列值的長度。達到該值,從freelist清除該塊信息。
pctused:一個塊的使用水位的百分比,這個水位將使該塊返回到可用列表中去等待更多的插入操作。達到該值,該塊信息加入freelist
。這個參數在ASSM下不使用。
行鏈接:指一行存儲在多個塊中的情況,這是因為該行的長度超過了一個塊的可用空間大小,即行鏈接是跨越多塊的行。
行遷移:指一個數據行由于update語句導致當前塊被重新定位到另一個塊(那里有充足的空間)中,但在原始塊中保留一個指針的情形(PPT-II-470)。原始塊中的指針是必需的,因為索引的ROWID項仍然指向原始位置。行遷移是update語句當pctfree空間不足時引起的,它與insert和delete語句無關(考點)。
如何能夠知道發生了行鏈接或行遷移?
查看dba_tables的AVG_ROW_LEN列和CHAIN_CNT列,當CHAIN_CNT有值時,看AVG_ROW_LEN,它表示行的平均長度(byte),如果AVG_ROW_LEN塊大小,那么是鏈接行。
查看發生遷移或連接的行,使用analyze table xx list chained rows; 但命令需要將結果插入chained_rows表,創建此表用utlchained.sql或utlchn1.sql腳本。參見sql referenve中的analyze命令。
SQL> create table t1 (c1 varchar2(20));
SQL>
begin
for i in 1..1000 loop
insert into t1 values(null);
end loop;
end;
/
分析t1表確定無行遷移
SQL> analyze table t1 compute statistics;
SQL> select pct_free,pct_used,avg_row_len,chain_cnt from user_tables where table_name='T1';
AVG_ROW_LEN,它表示行的平均長度(byte)
填充這些空列,再分析t1,有了行遷移
SQL> update t1 set c1='timran is my drt';
SQL> analyze table t1 compute statistics;
SQL> select pct_free,pct_used,avg_row_len,chain_cnt from user_tables where table_name='T1';
move表,再分析t1,行遷移消失。 思考:段重組對于行鏈接有效嗎?
SQL> alter table t1 move;
SQL> analyze table t1 compute statistics;
SQL> select pct_free,pct_used,avg_row_len,chain_cnt,blocks from user_tables where table_name='T1';
考點:對于大部分目的而言,應該用DBMS_STATS包中的過程分析表,但要查看行鏈接或行遷移信息,只能通過ANALYZE命令檢測。
11.4.2 表和數據塊(block)的關系
1)什么是高水位線?
高水位線(high-water mark,HWM)
在數據庫中,如果把表想象成從左到右依次排開的一系列塊,高水位線就是曾經包含了數據的最右邊的塊。原則上HWM只會增大, 即使將表中的數據全部刪除,HWM也不會降低。
HWM不是好事,使用全表掃描時通常要讀出HWM以下的所有數據塊(盡管該表中可能僅有少量數據),這將白白耗費大量IO資源。
2)兩個解決辦法可降低HWM:
2.1)移動表,move方法, 將表從一個表空間移動到另一個表空間(也可以在本表空間內move)。
語法:alter table t1 move [tablespace users];
優點:可以清除數據塊中的碎片,降低高水位線。
缺點:move需要額外(一倍)的空間。
move過程中會鎖表,其他用戶不能在該表上做DML或DDL操作。
move之后,相關索引都不可用了,表上的索引需要重建(考點)。
2.2)收縮表,shrink 也叫段重組,表收縮的底層實現的是通過匹配的INSERT和DELETE操作。
它分兩個不同的階段:壓縮階段和降低HWM階段。(PPT-II-491)
語法:alter table t2 shrink space [cascade][compact];
兩個前提:1)表所在的表空間段管理是ASSM方式,因為位圖方法才記錄有關塊實際的滿度信息(考點)。2)表上啟用了row movement。
你發出alter table t2 shrink space compact; 那么只完成了第一階段。這是壓縮階段。在業務高峰時可以先完成第一階段 delete insert
高峰過后,再次alter table t2 shrink space; 因壓縮階段工作大部分已完成,將很快進入第二階段,DML操作會有短暫的鎖等待發生。
測試:
create tablespace timran datafile '/u01/oradata/timran11g/timran01.dbf' size 100m;
create table scott.t2 tablespace timran as select * from dba_objects;
scott:
select max(rownum) from t2;
select table_name, blocks, empty_blocks, num_rows from user_tables where table_name='T2';
analyze table t2 compute statistics;
delete t2 where rownum<=40000;
commit;
analyze table t2 compute statistics for table;
select table_name, blocks, num_rows from user_tables where table_name='T2';
這時候,num_rows已經減掉了40000條, 但 blocks 并沒有減少, 說明HWM沒有下降。
做shrink
alter table t2 enable row movement; //使能行移動
進行第一步----壓縮階段
alter table t2 shrink space compact;
analyze table t2 compute statistics for table;
select table_name, blocks, num_rows from user_tables where table_name='T2';
//HWM不會降低。
進行第二步----降低HWM階段
alter table t2 shrink space;
analyze table t2 compute statistics for table;
select table_name, blocks, num_rows from user_tables where table_name='T2';
//HWM已經降低。
考點:
1,表收縮操作生成undo和redo數據,索引可以得到維護。
2,收縮分為兩個階段 第一階段是壓縮階段,第二階段是降低HWM階段。SHRINK不占用額外的空間。
3,可以單獨完成第一階段,即SHRINK SPACE COMPACT 此階段不降低HWM,DML操作幾乎不受影響。
4,可以級聯相關的段一起收縮,即SHRINK SPACE CASCADE。
5,段必須ASSM管理方式,且使能行移動,否則不能收縮,如果不滿足這兩個前提,MOVE就是重組表的唯一方式。
6,不能收縮MSSM管理,或有LONG列表或是有refresh_on_commit物化視圖的表。
來自 “ ITPUB博客 ” ,鏈接:http://blog.itpub.net/31485142/viewspace-2151295/,如需轉載,請注明出處,否則將追究法律責任。
總結
以上是生活随笔為你收集整理的oracle数据block默认是,oracleBLOCK(数据块)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 临沂市兰山区枣园镇闫屯社区水表感应去在什
- 下一篇: 吴川电费收费标准?