又是一年雙11,雙十一對從事電商的it人員來說是一場噩夢,這個只是前奏,下面說重點:
表碎片整理,首先收集那些表需要做碎片整理:
1.1根據統計信息檢查表碎片:
SELECT table_name,
ROUND ( (blocks 8), 2) "高水位空間 k",
ROUND ( (num_rows avg_row_len / 1024), 2) "真實使用空間 k",
ROUND ( (blocks 10 / 100) 8, 2) "預留空間(pctfree) k",
ROUND ( ( blocks 8 - (num_rows avg_row_len / 1024) - blocks 8 10 / 100), 2) "浪費空間 k"
FROM user_tables
WHERE temporary = 'N'
ORDER BY 5 DESC;
1.2. 是和業務開發人員溝通那些主要的業務表做了大量的delete、update操作,確定要整理的表范圍。
2.1.下面是碎片整理步驟:
alter table app_info enable row movement; --打開行移動
alter table app_info shrink space cascade; --壓縮表及相關數據段并下調HWM (此步驟會影響業務)
alter table app_info shrink space compact; --只壓縮不下調HWM
alter table app_info shrink space ; --下調HWM (此步驟會影響業務)
alter table app_info disable row movement; --關閉行移動
其中alter table app_info shrink space compact; alter table app_info shrink space ; 兩個步驟等于alter table app_info shrink space cascade; 操作
注意:
IOT索引組織表、用rowid創建的物化視圖的基表、帶有函數索引的表、SECUREFILE 大對象、壓縮表不能使用Shrink 操作。
3.1 整理完碎片后最好重新收集統計信息:
begin
dbms_stats.gather_table_stats(ownname => 'chunqiu',tabname => 'app_info',cascade => true);
end;
4.1下面為寫在plsql語句塊中的參考,為下面腳本準備:
begin
EXECUTE IMMEDIATE 'alter table app_info shrink space ';
EXECUTE IMMEDIATE 'alter table app_info disable row movement ';
end;
5.1如果表很多怎么辦?,特備是最后的下調高水位線基本上都需要在晚上業務低峰期操作,甚至有的會申請掛免戰牌,下面寫個腳本批量處理加上定時任務,可以讓dba們節約時間好好休息下:
create table T_TABALE
(
table_name VARCHAR2(200) not null,
compact_status NUMBER default 0 not null,
shrink_status NUMBER default 0 not null
);
alter table T_TABALE add constraint PK_T_TABALE primary key (TABLE_NAME);
把要整理的表名字插入到該表。
5.1.先開啟row movement:
BEGIN
FOR i IN (select table_name from T_TABALE ) LOOP
EXECUTE IMMEDIATE 'alter table ' || i.table_name ||' enable row movement ' ;
END LOOP;
END;
5.2.整理碎片:
BEGIN
FOR i IN (select table_name from T_TABALE where compact_status = 0 ) LOOP
begin
EXECUTE IMMEDIATE 'alter table ' || i.table_name ||' shrink space compact ' ;
update T_TABALE set status = 1 where table_name = i.table_name ;
commit;
EXCEPTION WHEN OTHERS THEN null;
END;
END LOOP;
END;
5.3.降低高水位,步驟最好結合定時任務放在晚上執行:
這個可以寫個定時任務,晚上執行
BEGIN
FOR i IN (select table_name from T_TABALE where compact_status = 0 ) LOOP
begin
EXECUTE IMMEDIATE 'alter table ' || i.table_name ||' shrink space ' ;
update T_TABALE set shrink_status = 1 where table_name = i.table_name ;
commit;
EXCEPTION WHEN OTHERS THEN null;
END;
END LOOP;
END;
5.5 關閉row movement:
BEGIN
FOR i IN (select table_name from T_TABALE ) LOOP
BEGIN
EXECUTE IMMEDIATE 'alter table ' || i.table_name ||' disable row movement ' ;
END LOOP;
END;
6.1 最后別忘了收集下統計信息,收集統計信息的批量腳本自己實現吧。
突然想起來了,供參考:
BEGIN
FOR i IN (select blocks*8/1024/1024 ,table_name from dba_tables where table_name in(select table_name from pacs.T_TABALE where status = 11 ) order by 1 ) LOOP
begin
EXECUTE IMMEDIATE 'begin dbms_stats.gather_table_stats(ownname =>' || '''pacs'''|| ', tabname => ''' || i.table_name || '''' || ' ,cascade => true) ; end; ' ;
update pacs.T_TABALE set status = 12 where table_name = i.table_name ;
commit;
-- EXCEPTION WHEN OTHERS THEN null;
END;
END LOOP;
END;
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。