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

1.7 億筆記錄大表建立高效索引完整實錄:資源規劃、監控與統計資訊收集

     編輯:Oracle 資料庫基礎

專案概況

環境:SunOS 5.9, Oracle 9.2.0.4, 8 CPU, 3GB RAM。目標:在分區表 STAT_SUBMIT_CENTER (50 分區, 17.2 GB, 1.7 億筆) 的 RECORDTIME 欄位建立本地索引 IDX_SUBMIT_RECORDTIME。

關鍵資源評估與預先調整

  1. 索引空間:預估需數 GB,確認資料表空間充足。
  2. PGA 目標:workarea_size_policy=AUTO 時,單 Session 可用 PGA = MIN(5% PGA, 100MB)。將 pga_aggregate_target 從 200MB 增至 2048MB,使排序盡量在記憶體完成。
  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/pass <

建立過程深度觀察

  • 階段 1(啟動前):v$sort_segment.used_blocks=0, v$sort_usage 無資料。
  • 階段 2(初始化):捕捉到系統內部 INSERT INTO OBJ$... 建立索引字典物件。
  • 階段 3(分區級排序循環):used_blocks 從 0 遞增至 ~46,720,v$sort_usage 顯示活躍排序 Session,SQL 為 SELECT FILE# FROM FILE$ WHERE TS#=:1。隨後歸零。
  • 階段 4(重複 14 次):對應 14 個大分區依序建立索引,每個分區經歷完整「排序→寫入→釋放」週期。
  • 字典可見性:建立期間 user_segments 查不到索引,實際以系統產生數字段名暫存;失敗自動回滾。

總耗時 99 分鐘 完成。

不可或缺的收尾:統計資訊收集

建立完成後若不收集統計資訊,優化器會誤判採用 INDEX FAST FULL SCAN 導致查詢極慢(測試 11 分鐘無結果)。

ANALYZE INDEX IDX_SUBMIT_RECORDTIME ESTIMATE STATISTICS;  -- 耗時 6.84 秒

收集後優化器轉為 INDEX RANGE SCAN,同樣查詢僅耗 5.37 秒,效能提升逾百倍。

最佳實踐總結

  1. 雙重保障:PGA + TEMP 空間同時準備充足,避免多次磁碟排序往返。
  2. 分區級監控:透過 v$sort_segment 觀察分區建立進度與資源消耗。
  3. 統計資訊強制收集:索引建立與統計收集視為單一原子作業,缺一不可。
  4. 生產化建議:改用 DBMS_STATS.GATHER_INDEX_STATS 並行收集;考慮 PARALLEL 子句加速索引建立(需評估 CPU/IO 壓力)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved