基于 SQLT 的執行計劃固化方法解析
在 Oracle 數據庫運維與性能優化過程中,執行計劃漂移是一個極為常見、也極具風險的問題。
一次錯誤的執行計劃選擇,往往會導致 SQL 性能斷崖式下降,甚至直接影響核心業務系統。
本文結合 SQLT(SQLTXPLAIN)工具,詳細說明如何通過 SQL Profile 的方式,對 SQL 執行計劃進行固化,并在必要時進行安全回退,適用于對執行計劃穩定性有嚴格要求的生產環境。
本文內容整理自浙商銀行內部 SQL 優化實踐文檔,僅作技術方法說明。
一、SQL Profile 說明
SQLTXPLAIN(簡稱 SQLT) 是 Oracle 官方提供的一款非常強大的 SQL 調優診斷工具。
截至文檔編寫時,SQLT 的最新版本為 2018-07-25.v1。
在實際生產環境中,當用戶遇到 SQL 性能問題時,Oracle Support 通常會要求提供大量診斷信息,例如:
? SQL 原文
? 10046 / 10053 Trace
? 對象統計信息
? Optimizer 相關參數
? 執行計劃與運行信息等
這些信息的收集過程 非常繁瑣,且高度依賴 DBA 對 Oracle 內核機制的理解。
一旦信息不完整,或者采集方式不正確,問題往往難以定位甚至無法解決。
SQLT 工具的價值就在于:
? 自動收集單條 SQL 的完整上下文信息
? 自動分析 SQL 相關對象、統計信息、執行路徑
? 生成 SQL Profile 腳本,用于固化 SQL 執行計劃
通過 SQLT,可以顯著降低 SQL 調優與執行計劃穩定控制的復雜度。
二、SQLT 簡單實用說明
下面結合實際操作步驟,說明如何使用 SQLT 固化執行計劃。
2.1 上傳文件
上傳 sqlt.zip 文件,并進行解壓。
進入解壓目錄后,在 utl 目錄 中,可以看到我們需要使用的所有腳本文件。
2.2 運行分析腳本
切換到 Oracle 用戶,并以 SYSDBA 身份登錄數據庫:
su - oracle
$ sqlplus “/ as sysdba”
執行 SQL Profile 轉換腳本:
SQL>@coe_xfr_sql_profile.sql cdwjdd67x27mh
說明:
cdwjdd67x27mh 為出現性能問題的 SQL 對應的 SQL_ID
2.3 輸入對應的希望固化的執行計劃
腳本運行后,會列出該 SQL 對應的所有執行計劃信息,例如:
SQL_ID (required)
PLAN_HASH_VALUE AVG_ET_SECS
--------------- -----------
2979024279 .011
647855111 5.164
Oracle 會根據輸入的 SQL_ID,找出該 SQL 的所有歷史執行計劃。
此時,需要 DBA 人工判斷 哪一個執行計劃是期望被固化的。
選擇正確的 PLAN_HASH_VALUE 并輸入:
Parameter 2:
PLAN_HASH_VALUE (required)
Enter value for 2: 2979024279
確認信息如下:
Values passed:
~~~~~~~~~~~~~
SQL_ID : "cdwjdd67x27mh"
PLAN_HASH_VALUE: "2979024279"
2.4 運行輸出結果
上述步驟完成后,系統會提示執行生成的 SQL Profile 腳本:
Execute coe_xfr_sql_profile_cdwjdd67x27mh_2979024279.sql
on TARGET system in order to create a custom SQL Profile
with plan 2979024279 linked to adjusted sql_text.
執行該腳本:
SQL>@coe_xfr_sql_profile_cdwjdd67x27mh_2979024279.sql
腳本執行完成后,即完成 SQL Profile 的創建與執行計劃固化。
2.5 檢查固化情況
通過查詢系統視圖 DBA_SQL_PROFILES,檢查 SQL Profile 是否已生效:
SQL> select name, SQL_TEXT, status from dba_sql_profiles;
確認對應 SQL Profile 狀態為 ENABLED,即表示固化成功。
三、回退 SQL Profile
在生產環境中,如果發現固化后的執行計劃并不符合預期,或者引入了新的性能問題,應及時進行回退操作。
3.1 查找固化 SQL
通過前述查詢方式,找出需要回退的 SQL Profile:
SQL> select name, SQL_TEXT, status from dba_sql_profiles;
記錄對應的 Profile 名稱。
3.2 刪除固化
執行以下命令刪除 SQL Profile:
SQL> exec dbms_sqltune.drop_sql_profile('coe_f4sgavkagjb1q_2593387201');
刪除完成后,該 SQL 將恢復為優化器自行選擇執行計劃。
總結
通過 SQLT 工具配合 SQL Profile,可以:
? 有效解決執行計劃漂移問題
? 在不修改 SQL 代碼的前提下穩定性能
? 具備可控、可回退的安全機制
但需要注意的是:
執行計劃固化是一把“雙刃劍”
它要求 DBA 對業務 SQL、數據分布、執行路徑具備充分理解,
否則錯誤固化可能帶來更嚴重的系統風險。
在核心業務系統中,建議將 SQL Profile 固化作為謹慎使用的高級調優手段,并配合完整的驗證與回退策略。




