環境: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。
workarea_size_policy=AUTO 時,單 Session 可用 PGA = MIN(5% PGA, 100MB)。將 pga_aggregate_target 從 200MB 增至 2048MB,使排序盡量在記憶體完成。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 <
v$sort_segment.used_blocks=0, v$sort_usage 無資料。INSERT INTO OBJ$... 建立索引字典物件。used_blocks 從 0 遞增至 ~46,720,v$sort_usage 顯示活躍排序 Session,SQL 為 SELECT FILE# FROM FILE$ WHERE TS#=:1。隨後歸零。user_segments 查不到索引,實際以系統產生數字段名暫存;失敗自動回滾。總耗時 99 分鐘 完成。
建立完成後若不收集統計資訊,優化器會誤判採用 INDEX FAST FULL SCAN 導致查詢極慢(測試 11 分鐘無結果)。
ANALYZE INDEX IDX_SUBMIT_RECORDTIME ESTIMATE STATISTICS; -- 耗時 6.84 秒
收集後優化器轉為 INDEX RANGE SCAN,同樣查詢僅耗 5.37 秒,效能提升逾百倍。
v$sort_segment 觀察分區建立進度與資源消耗。DBMS_STATS.GATHER_INDEX_STATS 並行收集;考慮 PARALLEL 子句加速索引建立(需評估 CPU/IO 壓力)。