首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

億級資料分區表建立本地索引實戰:從參數調校到統計資訊收集

     編輯:Oracle 資料庫基礎

案例背景

目標表 STAT_SUBMIT_CENTER 為範圍分區表(依 MSGDATE 分 50 個分區),總大小 17.2 GB,記錄數 1.7 億筆。需在 RECORDTIME 欄位建立本地索引 IDX_SUBMIT_RECORDTIME。環境:SunOS 5.9, Oracle 9.2.0.4, 8 CPU, 3GB 記憶體。

前置評估與資源規劃

  1. 磁碟空間:預估索引需數 GB 空間,確認資料表空間剩餘足夠。
  2. PGA 記憶體:建立索引需大量排序,將 pga_aggregate_target 從 200MB 提升至 2GB(配合 workarea_size_policy=AUTO,單一 Session 可用 PGA = MIN(5% PGA, 100MB))。
  3. 暫存表空間:若記憶體不足會落盤排序,將 TEMP 表空間從 3.4GB 擴充至 8GB(參考社群經驗:15 億筆曾用 34GB)。
  4. 離線建立:經評估決定停止業務存取,採用 NOLOGGING 非線上模式建立,縮短時間窗。

實際操作腳本化流程

-- 1. 擴充暫存檔
ALTER DATABASE TEMPFILE '/bgdata/Oracle/temp01.dbf' RESIZE 8192M;

-- 2. 調大 PGA
ALTER SYSTEM SET PGA_AGGREGATE_TARGET=2048M;

-- 3. 背景執行建立索引腳本
nohup time createind.sh &

-- createind.sh 內容:
#!/bin/sh
sqlplus user/password <

建立過程觀察與分區級行為

監控發現 v$sort_segment.used_blocks 與 v$sort_usage.blocks 呈現「遞增→歸零」的週期性波動,共發生 14 次,對應 14 個較大分區的索引建立過程。每個分區建立時會產生大量暫存段排序,完成後釋放。期間 user_segments 查不到索引段,實際上以系統產生的數字段名暫存,失敗會自動回滾。

總耗時 99 分鐘 完成全部 50 個分區的本地索引建立。

關鍵後續動作:收集索引統計資訊

索引建立完成後,必須收集統計資訊,否則優化器可能選擇錯誤存取路徑(如 INDEX FAST FULL SCAN 導致查詢極慢)。

ANALYZE INDEX IDX_SUBMIT_RECORDTIME ESTIMATE STATISTICS;

收集前:查詢 RECORDTIME > TRUNC(SYSDATE) 採 INDEX FAST FULL SCAN,11 分鐘無結果。
收集後:優化器轉為 INDEX RANGE SCAN,查詢僅耗 5.37 秒,效能提升超過 100 倍。

經驗總結

  • 大表建索引核心在於 PGA + TEMP 空間雙保障。
  • 分區表本地索引建立呈現分區級串行特性,可透過暫存段觀察進度。
  • 統計資訊收集不可省略,是索引生效的關鍵。
  • 生產環境建議配合 DBMS_STATS 並行收集,進一步縮短維護窗口。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved