首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle DBA每周維護作業庫(四):NEXT_EXTENT一致性檢查與現有Extent分析腳本

     編輯:Oracle 資料庫相關知識

維護目標:表空間存儲參數標準化治理

核心原則:同一表空間內所有對象的NEXT_EXTENT應與表空間默認值完全一致,避免碎片化、空間浪費、擴展失敗。

腳本一:nextext.sql — 發現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分佈

-- 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;

分析維度

  • Extent數量: >1000個Extents可能影響全表掃描性能(Extent Map查找開銷);
  • 大小分佈: 極不均勻(如大量64K夾雜幾個100M)表明存儲參數歷史變更頻繁;
  • 連續性: 同一數據文件內Extents是否連續,影響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/NEXTEXTENT MANAGEMENT適用對象
SYSTEM/SYSAUX默認(勿動)LOCAL AUTOALLOCATE數據字典/內部對象
DATA_SMALL64K / 1MLOCAL UNIFORM SIZE 1M小表、查找表、配置表
DATA_MEDIUM1M / 10MLOCAL UNIFORM SIZE 10M業務主表、歷史表
DATA_LARGE10M / 100MLOCAL UNIFORM SIZE 100M大表、分區表、數據倉庫事实表
INDEX_*對應DATA_*同級LOCAL UNIFORM SIZE 同級索引段
UNDO1M / 10MLOCAL AUTOALLOCATEUndo段
TEMP1M / 10MLOCAL UNIFORM SIZE 10M臨時段

結語

NEXT_EXTENT一致性看似微末,實則是表空間空間管理規範化的基石。建議將nextext.sql納入每周自動巡檢作業,異常自動生成工單分派至DBA;將fix_next_extent.sql封裝為標準化變更腳本,經審批後在維護窗口執行,構建「發現-審批-修復-驗證」閉環治理體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved