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

Oracle 全局臨時表統計信息鎖定策略:禁止自動收集,避免執行計劃誤判

     編輯:Oracle 教學

Oracle 全局臨時表統計信息鎖定策略

全局臨時表(GTT)的數據具有會話隔離性,若收集統計信息會因所有會話共享同一統計而導致嚴重不準(通常為 0),進而產生錯誤執行計劃。最佳實踐是鎖定統計信息並刪除現有統計,強制優化器使用動態採樣。

標準操作流程

-- 1. 解鎖(若已鎖定)
EXEC DBMS_STATS.UNLOCK_TABLE_STATS('SCHEMA', 'GTT_TABLE');

-- 2. 刪除現有統計
EXEC DBMS_STATS.DELETE_TABLE_STATS('SCHEMA', 'GTT_TABLE');

-- 3. 鎖定統計,禁止自動/手工收集
EXEC DBMS_STATS.LOCK_TABLE_STATS('SCHEMA', 'GTT_TABLE');

核心原理

  • GTT 統計若被收集,反映的是當前會話的數據分布,其他會話使用時極不準確。
  • 鎖定後,優化器無法使用靜態統計,會觸發動態採樣(Dynamic Sampling),在硬解析時實時掃描該會話的實際數據,生成精準計劃。
  • 若業務極其特殊需固定統計,可手工收集後鎖定,但極不推薦。

驗證鎖定狀態

SELECT table_name, stattype_locked
FROM dba_tab_statistics
WHERE table_name = 'GTT_TABLE';

返回 STATTYPE_LOCKED = 'ALL' 表示已完全鎖定。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved