本篇內(nèi)容主要講解“Oracle數(shù)據(jù)庫中怎么實(shí)現(xiàn)數(shù)據(jù)行遷移與行鏈接”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Oracle數(shù)據(jù)庫中怎么實(shí)現(xiàn)數(shù)據(jù)行遷移與行鏈接”吧!
鳳縣ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
在Oracle數(shù)據(jù)庫中存在兩種數(shù)據(jù)存儲現(xiàn)象:行遷移和行鏈接。這兩者現(xiàn)象嚴(yán)重時都會導(dǎo)致數(shù)據(jù)庫查詢性能嚴(yán)重低下,處理好數(shù)據(jù)存儲的行鏈接或者行遷移也是有效提升數(shù)據(jù)庫性能的有效方式。
1.行遷移:
ORACLE一個BLOCK的DEFAULT SIZE是8K,事實(shí)上,一個BLOCK不可以存儲8K的數(shù)據(jù).一個BLOCK可以存儲多少數(shù)據(jù),由PCTFREE,PCTUSED參數(shù)控制(對于以前的手工管理的表空間而言).
PCTFREE:是指BLOCK保留空閑空間的百分比,用于UPDATE。對于已經(jīng)插入到BLOCK的行而言,后面的UPDATE操作有可能使行的長度增加;PCTFREE就是用于容納增加的那部分長度而保留的空閑空間。如果UPDATE時PCTFREE再也不能夠容納行增加的長度,則ORACLE會將整個行遷移到一個新的BLOCK,行的ROWID保留(不是太明白為什么ORACLE不改變ROWID),原來的BLOCK有一個指針指向ROW存放的新BLOCK。這就是行遷移。
可見,行遷移是由于UPDATE操作所導(dǎo)致。從字面上理解,所謂遷移,肯定先有存在這一行,才能叫著遷移.
2.行鏈接:
是指一個BLOCK不能容納一行(行的長度太大),而必須將此行存放于幾個BLOCK.行鏈接一般是在Insert時產(chǎn)生的.一個BLOCK能否用于insert是由PCTUSED控制.
PCTUSED:是指BLOCK用于INSERT的百分比。對于INSERT操作,BLOCK可用于容納新行的最大空間為Blocksize-pctfree-overhead.當(dāng)BLOCK數(shù)據(jù)存儲已高于PCTUSED,ORACLE會將該塊從自由鏈表中移除,直到該塊已使用空間降到PCTUSED以下,才會再次將此塊重新加入到Freelist(這是ORACLE以前手工管理的表空間管理空閑塊的原理,現(xiàn)在ORACLE推薦使用ASSM).
對表分析后檢查表中行遷移的情況:
select TABLE_NAME,NUM_ROWS,AVG_ROW_LEN,BLOCKS,EMPTY_BLOCKS,CHAIN_CNT from user_tables where table_name='EMP';
(其中字段CHAIN_CNT顯示的就是行遷移或者行鏈接的表中的行數(shù))
檢測表中是否存在行遷移或者行鏈接需要對表進(jìn)行分析:
表分析的方法有兩種:
1, analyze table emp compute statistics;2, exec dbms_stats.gather_schema_stats('scott','emp'); --前者為用戶名,后者為表名
但是ORACLE的dbms_stats.gather_schema_stats只會收集優(yōu)化器統(tǒng)計(jì)信息,不會檢測表的記錄是否存在行遷移和行鏈接,因此要分析行鏈接或者行遷移必須用analyse命令。
行遷移和行鏈接的檢測:
select b.NAME,a.VALUE from v$mystat a,v$statname b where a.STATISTIC#=b.STATISTIC# and b.NAME like 'table fetch continued row';
當(dāng)有返回值時,可以知道表的數(shù)據(jù)存在行遷移和行鏈接。
行遷移和行鏈接的清除:
能過REBUILD數(shù)據(jù)來清除行遷移:
create table MM_PM_temp as select * from MM_PM; truncate table MM_PM; insert into MM_PM select * from MM_PM_temp
再重新分析表:
analyze table MM_PM compute statistics;
分析過后再查看:
select t.table_name, t.num_rows, t.chain_cnt, t.avg_row_len, round((t.chain_cnt / t.num_rows) * 100, 2) as "chained rows %" from user_tables t where t.chain_cnt > 0;
如果該表的chain_cnt變?yōu)?時,表示原先的chain_cnt全部是行遷移,而不是行鏈接。
如果REBUILD數(shù)據(jù)后chain_cnt變少,但還大于0,則可以證明,這個表即包含行遷移,又包含真正的行鏈接。
事實(shí)證明,行遷移是可以通過REBUILD數(shù)據(jù)和增加PCTFREE%來清除和減少發(fā)生頻率的。
注意,對于ASSM,PCTUSED,F(xiàn)REELIST,F(xiàn)REELIST GROUPS參數(shù)會被忽略。
但對于真正的行鏈接,只能通過將表移植到大的BLOCSIZE的表空間上。
例如:
創(chuàng)建一個16K的表空間:
CREATE TABLESPACE LARGETBS BLOCKSIZE 16 K LOGGING DATAFILE '/data/app/oracle/oradata/ora33/LARGETBS_01.dbf' SIZE 64M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO ;
在創(chuàng)建的時候報了個ORA-的錯,原因我們沒有設(shè)定16的DB_Buffer_cache,我們設(shè)定一下:
alter system set db_16k_cache_size=34603008;
將表MOVE到16K的表空間:
alter table SRC_CS move tablespace LARGETBS; alter table MM_PM move tablespace LARGETBS;
由于進(jìn)行了遷移,表的索引會失效,所以我們要REBUILD索引:
alter index PK_SRC_CS rebuild; alter index PK_MM_PM rebuild;
再重新分析:
analyze table SRC_CS compute statistics; analyze table MM_PM compute statistics;
重新查詢:
select t.table_name, t.num_rows, t.chain_cnt, t.avg_row_len, round((t.chain_cnt / t.num_rows) * 100, 2) as "chained rows %" from user_tables t where t.chain_cnt > 0 order by t.table_name;
發(fā)現(xiàn),這些表都沒有ROW CHAIN了??梢姡琈OVE到16K的表空間可以清除ROW CHAIN。
一:生成一張表(chained_rows),保存遷移的行的rowid
@?/rdbms/admin/utlchain
使用分析命令將產(chǎn)生遷移的行的rowid插入到chained_rows表:
analyze table test01 list chained rows into chained_rows;create table tmp as select * from test01 where rowid in (select head_rowid from chained_rows);delete test01 where rowid in (select head_rowid from chained_rows);insert into test01 select * from tmp;drop table tmp purge;
再分析表:
analyze table test01 compute statistics;
再查看字典中的統(tǒng)計(jì)信息:
select TABLE_NAME,NUM_ROWS,AVG_ROW_LEN,BLOCKS,EMPTY_BLOCKS,CHAIN_CNT from user_tables where table_name='TEST01';
二、將存在行遷移的表用導(dǎo)出工具導(dǎo)出數(shù)據(jù)庫,將原表truncate后,再講數(shù)據(jù)重新導(dǎo)入。
到此,相信大家對“Oracle數(shù)據(jù)庫中怎么實(shí)現(xiàn)數(shù)據(jù)行遷移與行鏈接”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!