背景與價值
- **SQL Tuning Set (STS)**:SQL 語句集合 + 執行上下文 (綁定變量、執行計劃、統計信息)。
- **用途**:SQL Tuning Advisor 輸入源、SQL Performance Analyzer (SPA) 對比基線、回歸測試。
- **跨實例遷移場景**:生產庫捕獲 STS → 測試庫分析調優 → 避免生產庫負擔、權限隔離。
- **版本支持**:10gR2 (10.2.0.1+) 引入 `DBMS_SQLTUNE.PACK_STGTAB_SQLSET` / `UNPACK_STGTAB_SQLSET`。
遷移全流程 (5 步)
步驟 1:創建/選擇 STS (源庫)
-- 方式 A: Enterprise Manager (GUI) 從 AWR/ASH/游標緩存/用戶定義創建
-- 方式 B: PL/SQL 手動創建
EXEC DBMS_SQLTUNE.CREATE_SQLSET(sqlset_name => 'MY_STS', description => 'Prod Top SQL');
DECLARE
cur DBMS_SQLTUNE.SQLSET_CURSOR;
BEGIN
OPEN cur FOR SELECT VALUE(p) FROM TABLE(DBMS_SQLTUNE.SELECT_CURSOR_CACHE) p;
DBMS_SQLTUNE.LOAD_SQLSET(sqlset_name => 'MY_STS', populate_cursor => cur);
END;
/
步驟 2:創建中轉表 (源庫)
EXEC DBMS_SQLTUNE.CREATE_STGTAB_SQLSET(table_name => 'STS_STAGING', schema_name => 'DBA_TOOLS');
-- 生成表 DBA_TOOLS.STS_STAGING
步驟 3:打包 STS 到中轉表 (源庫)
EXEC DBMS_SQLTUNE.PACK_STGTAB_SQLSET(
sqlset_name => 'MY_STS',
staging_table_name => 'STS_STAGING',
staging_schema_owner => 'DBA_TOOLS'
);
-- 驗證
SELECT COUNT(*) FROM DBA_TOOLS.STS_STAGING;
步驟 4:遷移中轉表 (Data Pump / DB Link / 物理拷貝)
# 源庫導出
expdp dba_tools/pass directory=DP_DIR dumpfile=sts.dmp tables=STS_STAGING logfile=sts_exp.log
# 目標庫導入
impdp dba_tools/pass directory=DP_DIR dumpfile=sts.dmp tables=STS_STAGING logfile=sts_imp.log
-- 或 Database Link: INSERT INTO target.DBA_TOOLS.STS_STAGING SELECT * FROM source.DBA_TOOLS.STS_STAGING@dblink;
步驟 5:解包 STS 到目標庫 (目標庫)
EXEC DBMS_SQLTUNE.UNPACK_STGTAB_SQLSET(
sqlset_name => 'MY_STS',
staging_table_name => 'STS_STAGING',
staging_schema_owner => 'DBA_TOOLS',
replace => TRUE -- 同名覆蓋
);
-- 驗證
SELECT name, statement_count FROM USER_SQLSET WHERE name = 'MY_STS';
關鍵 API 速查
| API | 用途 | 關鍵參數 |
| CREATE_SQLSET | 創建空 STS | sqlset_name, description |
| LOAD_SQLSET | 從游標緩存/AWR/用戶表填充 | populate_cursor, load_option (INSERT/UPDATE/MERGE) |
| SELECT_CURSOR_CACHE | 選擇共享池 SQL 填充游標 | basic_filter (SQL_TEXT LIKE '%...%') |
| SELECT_WORKLOAD_REPOSITORY | 從 AWR 快照選擇 | begin_snap, end_snap |
| CREATE_STGTAB_SQLSET | 創建中轉表 | table_name, schema_name, tablespace_name |
| PACK_STGTAB_SQLSET | STS → 中轉表 | sqlset_name, staging_table_name, staging_schema_owner |
| UNPACK_STGTAB_SQLSET | 中轉表 → STS | sqlset_name, staging_table_name, replace |
| DROP_SQLSET | 刪除 STS | sqlset_name |
Enterprise Manager 操作路徑
- Performance → SQL Tuning Sets → Create / Import / Export。
- Export 向導自動執行 `PACK_STGTAB_SQLSET` + Data Pump 導出 `.dmp`。
- Import 向導自動 Data Pump 導入 + `UNPACK_STGTAB_SQLSET`。
遷移後驗證與分析
-- 目標庫運行 SQL Tuning Advisor
DECLARE
tname VARCHAR2(30) := 'MY_TUNING_TASK';
BEGIN
tname := DBMS_SQLTUNE.CREATE_TUNING_TASK(sqlset_name => 'MY_STS', scope => 'COMPREHENSIVE', time_limit => 3600);
DBMS_SQLTUNE.EXECUTE_TUNING_TASK(tname);
END;
/
-- 查看報告
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_TUNING_TASK') FROM DUAL;