案例背景
- 醫院 HIS 系統:Windows 2000 + Oracle 9.2.0.1 (32-bit) 升級為 IBM P55A (AIX 64-bit) + Oracle 10.2.0.1 RAC。
- 客戶端從 550 台增至 800+ 台,業務高峰期叢集頻繁死機,效能嚴重下降。
問題分析
- AWR 報告 顯示 Top 5 SQL 均為:
SELECT OWNER, SYNONYM_NAME FROM SYS.ALL_SYNONYMS
WHERE OWNER = 'PUBLIC' AND SYNONYM_NAME = '表名稱'
- 對比 Oracle 9.2.0.1 與 10.2.0.3 的
SYS.ALL_SYNONYMS 視圖定義,發現 10g 新增 UNION 部分,引入 sys."_ALL_SYNONYMS_TREE" 以支援同義詞鏈結(避免 9i 同義詞遞迴 Bug)。
set autotrace traceonly 對比執行計畫,10g 版本效率較 9i 差數十倍。HIS 所有表皆建有同義詞,所有存取經由同義詞,故確定為根因。
嘗試解決方案
方案一:「移花接木」建立私有同義詞覆蓋系統視圖
CREATE OR REPLACE FORCE VIEW sys.ALL_SYNONYMS_9201 AS ( ... 9.2.0.1 定義 ... );
CREATE SYNONYM puba.ALL_SYNONYMS FOR SYS.ALL_SYNONYMS_9201;
測試工具 (SQL*Plus, PL/SQL) 有效,但 HIS 應用 (PowerBuilder) 繞過私有同義詞直接存取系統視圖,效能無改善。
方案二:直接修改系統視圖定義(經 Oracle 官方確認可行)
- 與 Oracle 支援溝通,確認:若系統未使用「同義詞的同義詞」,可安全移除 10g 新增的 UNION 部分,還原 9i 定義。
- 執行修改後,高峰期兩節點 CPU 負載從 80-90% 驟降至 20-30%,所有功能效能顯著提升,問題徹底解決。
經驗總結
- 升級跨度大時,系統視圖定義變更可能帶來劇烈效能影響。
- 善用 AWR/Statspack 定位 Top SQL,對比執行計畫找出根因。
- 修改內部系統物件風險高,務必與廠商溝通確認後再執行。
- 軟體層面問題機率往往大於硬體,抓住關鍵點可事半功倍。