一條純粹的單表查詢 SELECT COUNT(*) FROM sfda_product_china WHERE ... 拋出 ORA-00600: internal error code, arguments: [15599]。Trace 文件堆棧卻指向 qerhjBuildHashTable(Hash Join 構建階段)。本文複盤排查過程,鎖定 Oracle 9.2.0.4 已知 Bug 3479075 / 2805580,給出規避與升級建議。
qerhjIterateOverBuffers -> ksxb1inc -> kxhrPhash -> qerhjBuildHashTable -> qerhjFetch -> qervwFetch -> qergsFetch -> opifch2
明顯進入了 Hash Join 代碼路徑(qerhj*),但 SQL 完全不應觸發 Join。ORA-600 [15599] 僅命中一條已知 Bug 描述:與 Hash Join 相關。qerhjIterateOverBuffers, ksxb1inc, kxhrPhash, qerhjBuildHashTable...)。ORA-7445 / ORA-600 事件。優化器在特定條件下(統計信息缺失、隱式類型轉換、複雜視圖合併邊界情況),**錯誤地為單表查詢生成了 Hash Join 執行計劃內部結構**,或在行源樹構建階段誤調用 Hash Join 相關函數,導致內部不一致觸發 ksxb1inc 異常拋出 15599。
| 方案 | 操作 | 優缺點 |
|---|---|---|
| 1. 升級 PSU/补丁集(推薦) | 應用 Oracle 9.2.0.8 或 10g/11g 修正版本 | ✅ 徹底修復;⚠️ 需回歸測試、停機窗口 |
| 2. 設置隱含參數禁用 Hash Join | _hash_join_enabled=false (Session 或 System 級) | ✅ 即時生效;⚠️ 影響其他正常 Join 性能,非根治 |
| 3. 收集/鎖定統計信息 | DBMS_STATS.GATHER_TABLE_STATS + LOCK_TABLE_STATS | ✅ 降低誤判概率;⚠️ 不保證 100% 規避 |
| 4. SQL 改寫/ Hint | /*+ NO_USE_HASH(t) */ 或改寫避開觸發路徑 | ✅ 針對性強;⚠️ 業務侵入、維護成本高 |
qerhj* 堆棧。qerhj* = Hash Join,qerjo* = Nested Loop,qerso* = Sort,識別內部操作類型是定位內部錯誤的關鍵技能。qerhjIterateOverBuffers ksxb1inc) 而非僅用錯誤碼搜尋,命中率高 10 倍。ORA-600[15599] 在 9.2.0.4 上是確鑿的 Hash Join 內部 Bug (2805580/3479075)。單表查詢觸發 Join 代碼路徑是典型特徵。**根治唯有升級**,臨時可用隱含參數或 Hint 規避。此案例再次警示:數據庫版本生命週期管理是穩定性的基石。