核心原則:同一表空間內所有對象的NEXT_EXTENT應與表空間默認值完全一致,避免碎片化、空間浪費、擴展失敗。
-- nextext.sql
-- 找出NEXT_EXTENT與表空間默認值不一致的段
-- 隱含規則:同一表空間所有對象應使用相同NEXT,等於表空間默認NEXT
COL segment_name FOR A30
COL segment_type FOR A15
COL tablespace_name FOR A20
COL actual_next FOR 999,999,999,999
COL default_next FOR 999,999,999,999
SELECT
ds.segment_name,
ds.segment_type,
ds.next_extent AS actual_next,
dt.tablespace_name,
dt.next_extent AS default_next
FROM dba_tablespaces dt
JOIN dba_segments ds ON dt.tablespace_name = ds.tablespace_name
WHERE dt.next_extent != ds.next_extent
AND ds.owner = UPPER('&OWNER')
ORDER BY dt.tablespace_name, ds.segment_type, ds.segment_name;
| 情況 | 原因 | 處置動作 |
|---|---|---|
| INITIAL/NEXT極小(如64K) | 對象創建時未指定STORAGE,繼承了舊版本默認值 | ALTER TABLE ... STORAGE (NEXT 10M); ALTER INDEX ... REBUILD STORAGE (NEXT 10M); |
| INITIAL/NEXT極大(如100M) | 早期為大表手工指定,現表空間默認已調整 | 評估實際增長,調整至表空間默認值 |
| 混合區管理(Dictionary/Local) | 遷移歷史遺留 | 規劃遷移至LMT(Locally Managed Tablespace) |
-- existext.sql
-- 分析段的現有Extents分佈,識別碎片化風險
COL segment_name FOR A30
COL segment_type FOR A15
COL extent_id FOR 9999
COL bytes FOR 999,999,999,999
COL blocks FOR 999,999,999
SELECT
segment_name,
segment_type,
extent_id,
bytes,
blocks,
tablespace_name
FROM dba_extents
WHERE owner = UPPER('&OWNER')
AND segment_name = UPPER('&SEGMENT_NAME')
ORDER BY segment_name, extent_id;
ALTER TABLE ... MOVE後的物理聚簇度。-- fix_next_extent.sql
-- 批量修正指定Schema下所有表/索引的NEXT_EXTENT至表空間默認值
SET SERVEROUTPUT ON
DECLARE
v_sql VARCHAR2(4000);
BEGIN
FOR rec IN (
SELECT ds.segment_name, ds.segment_type, dt.tablespace_name, dt.next_extent AS target_next
FROM dba_tablespaces dt
JOIN dba_segments ds ON dt.tablespace_name = ds.tablespace_name
WHERE dt.next_extent != ds.next_extent
AND ds.owner = UPPER('&OWNER')
AND ds.segment_type IN ('TABLE','INDEX','TABLE PARTITION','INDEX PARTITION')
) LOOP
BEGIN
IF rec.segment_type LIKE 'TABLE%' THEN
v_sql := 'ALTER TABLE '||rec.segment_name||' STORAGE (NEXT '||rec.target_next||')';
ELSE
v_sql := 'ALTER INDEX '||rec.segment_name||' REBUILD STORAGE (NEXT '||rec.target_next||')';
END IF;
EXECUTE IMMEDIATE v_sql;
DBMS_OUTPUT.PUT_LINE('SUCCESS: '||v_sql);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('FAILED: '||v_sql||' - '||SQLERRM);
END;
END LOOP;
END;
/
-- 注意:索引REBUILD會短暫鎖表,建議維護窗口執行
| 表空間類型 | 建議INITIAL/NEXT | EXTENT MANAGEMENT | 適用對象 |
|---|---|---|---|
| SYSTEM/SYSAUX | 默認(勿動) | LOCAL AUTOALLOCATE | 數據字典/內部對象 |
| DATA_SMALL | 64K / 1M | LOCAL UNIFORM SIZE 1M | 小表、查找表、配置表 |
| DATA_MEDIUM | 1M / 10M | LOCAL UNIFORM SIZE 10M | 業務主表、歷史表 |
| DATA_LARGE | 10M / 100M | LOCAL UNIFORM SIZE 100M | 大表、分區表、數據倉庫事实表 |
| INDEX_* | 對應DATA_*同級 | LOCAL UNIFORM SIZE 同級 | 索引段 |
| UNDO | 1M / 10M | LOCAL AUTOALLOCATE | Undo段 |
| TEMP | 1M / 10M | LOCAL UNIFORM SIZE 10M | 臨時段 |
NEXT_EXTENT一致性看似微末,實則是表空間空間管理規範化的基石。建議將nextext.sql納入每周自動巡檢作業,異常自動生成工單分派至DBA;將fix_next_extent.sql封裝為標準化變更腳本,經審批後在維護窗口執行,構建「發現-審批-修復-驗證」閉環治理體系。