[20151201]備份遷移sql profile.txt
--在生産系統使用 sql profile 來穩定計劃,需要将這些内容移植到測試環境。自己做一個測試:
1.環境:
SCOTT@book> @ &r/ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
SCOTT@book> create table tx as select rownum id ,'test' name from dual connect by level<=1e5;
Table created.
SCOTT@book> create unique index pk_tx on tx(id);
Index created.
exec sys.dbms_stats.gather_table_stats ( OwnName => user,TabName => 'tx',Estimate_Percent => NULL,Method_Opt => 'FOR ALL COLUMNS SIZE 1 ',Cascade => True ,No_Invalidate => false)
PL/SQL procedure successfully completed.
SCOTT@book> variable x number;
SCOTT@book> exec :x := 42;
SCOTT@book> select /*+ full(tx) */ * from tx where id = :x ;
ID NAME
---------- --------------------
42 test
SCOTT@book> @ &r/dpcz ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID 4rgrzpar16sv2, child number 0
select /*+ full(tx) */ * from tx where id = :x
Plan hash value: 40191160
---------------------------------------------------------------------------
| Id | Operation | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time |
| 0 | SELECT STATEMENT | | | | 61 (100)| |
|* 1 | TABLE ACCESS FULL| TX | 179 | 3401 | 61 (0)| 00:00:01 |
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1 / TX@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("ID"=:X)
2.建立sql profile:
SCOTT@book> @ &r/sp1 4rgrzpar16sv2
SCOTT@book> execute dbms_sqltune.accept_sql_profile(task_name => 'tuning 4rgrzpar16sv2', replace => TRUE, name=>'tuning 4rgrzpar16sv2', FORCE_MATCH=>True);
Plan hash value: 1336555843
--------------------------------------------------------------------------------------
| Id | Operation | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time |
| 0 | SELECT STATEMENT | | | | 2 (100)| |
| 1 | TABLE ACCESS BY INDEX ROWID| TX | 1 | 10 | 2 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | PK_TX | 1 | | 1 (0)| 00:00:01 |
2 - SEL$1 / TX@SEL$1
Peeked Binds (identified by position):
--------------------------------------
1 - (NUMBER): 42
2 - access("ID"=:X)
Note
-----
- SQL profile tuning 4rgrzpar16sv2 used for this statement
- Warning: basic plan statistics not available. These are only collected when:
* hint 'gather_plan_statistics' is used for the statement or
* parameter 'statistics_level' is set to 'ALL', at session or system level
37 rows selected.
--可以發現現在執行計劃已經發生了改變,使用索引。
3.如何儲存:
--檢查發現可以使用包dbms_sqltune完成。
SCOTT@book> @&r/desc_proc sys dbms_sqltune %_stgtab_sqlprof%
INPUT OWNER PACKAGE_NAME OBJECT_NAME
sample : @desc_proc sys dbms_stats gather_%_stats
OWNER PACKAGE_NAME OBJECT_NAME SEQUENCE ARGUMENT_NAME DATA_TYPE IN_OUT DATA_TYPE D
----- ------------- ---------------------- -------- -------------------- --------------- --------- --------------- -
SYS DBMS_SQLTUNE CREATE_STGTAB_SQLPROF 1 TABLE_NAME VARCHAR2 IN VARCHAR2 N
2 SCHEMA_NAME VARCHAR2 IN VARCHAR2 Y
3 TABLESPACE_NAME VARCHAR2 IN VARCHAR2 Y
PACK_STGTAB_SQLPROF 1 PROFILE_NAME VARCHAR2 IN VARCHAR2 Y
2 PROFILE_CATEGORY VARCHAR2 IN VARCHAR2 Y
3 STAGING_TABLE_NAME VARCHAR2 IN VARCHAR2 N
4 STAGING_SCHEMA_OWNER VARCHAR2 IN VARCHAR2 Y
REMAP_STGTAB_SQLPROF 1 OLD_PROFILE_NAME VARCHAR2 IN VARCHAR2 N
2 NEW_PROFILE_NAME VARCHAR2 IN VARCHAR2 Y
3 NEW_PROFILE_CATEGORY VARCHAR2 IN VARCHAR2 Y
4 STAGING_TABLE_NAME VARCHAR2 IN VARCHAR2 N
5 STAGING_SCHEMA_OWNER VARCHAR2 IN VARCHAR2 Y
UNPACK_STGTAB_SQLPROF 1 PROFILE_NAME VARCHAR2 IN VARCHAR2 Y
3 REPLACE PL/SQL BOOLEAN IN PL/SQL BOOLEAN N
17 rows selected.
SCOTT@book> exec DBMS_SQLTUNE.CREATE_STGTAB_SQLPROF(TABLE_NAME=>'t_sql_profile',SCHEMA_NAME=>user);
--這樣建立了t_sql_profile表。
SCOTT@book> select count(*) from t_sql_profile ;
COUNT(*)
----------
SCOTT@book> exec DBMS_SQLTUNE.PACK_STGTAB_SQLPROF(STAGING_TABLE_NAME=>'t_sql_profile',STAGING_SCHEMA_OWNER=>user);
1
SCOTT@book> @ &r/pt2 'select * from t_sql_profile'
ROW_NUM COL_NUM COL_NAME COL_VALUE
------- ---------- --------------- ----------------------------------------------------------------------------------------------------
1 1 VERSION 3
2 SIGNATURE 12082737585315772852
3 SQL_HANDLE SQL_a7ae81d11701f9b4
4 OBJ_NAME tuning 4rgrzpar16sv2
5 OBJ_TYPE SQL_PROFILE
6 PLAN_ID 0
7 SQL_TEXT select /*+ full(tx) */ * from tx where id = :x
8 CREATOR SCOTT
9 ORIGIN MANUAL
10 DB_VERSION 11.2.0.4.0
11 CREATED 01-DEC-15 08.12.52.000000 AM
12 LAST_MODIFIED 01-DEC-15 08.12.52.000000 AM
13 STATUS 1
14 CATEGORY DEFAULT
15 SQLFLAGS 1
16 TASK_ID 360
17 TASK_EXEC_NAME EXEC_363
18 TASK_OBJ_ID 1
19 TASK_FND_ID 1
20 TASK_REC_ID 1
21 INUSE_FEATURES 1
22 COMP_DATA <outline_data><hint><![CDATA[OPTIMIZER_FEATURES_ENABLE(default)]]></hint><hint><![CDATA[IGNORE_OPTIM
22 rows selected.
4.測試導入:
--先删除sql profile,單機環境先删除在導入。
SCOTT@book> execute dbms_sqltune.drop_sql_profile(name => 'tuning 4rgrzpar16sv2')
SCOTT@book> @ &r/spext 4rgrzpar16sv2
no rows selected
--導入:
SCOTT@book> exec DBMS_SQLTUNE.UNPACK_STGTAB_SQLPROF(STAGING_TABLE_NAME=>'t_sql_profile',STAGING_SCHEMA_OWNER=>user);
BEGIN DBMS_SQLTUNE.UNPACK_STGTAB_SQLPROF(STAGING_TABLE_NAME=>'t_sql_profile',STAGING_SCHEMA_OWNER=>user); END;
*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'UNPACK_STGTAB_SQLPROF'
PL/SQL: Statement ignored
--參數REPLACE必須指派。
SCOTT@book> exec DBMS_SQLTUNE.UNPACK_STGTAB_SQLPROF(REPLACE=>false,STAGING_TABLE_NAME=>'t_sql_profile',STAGING_SCHEMA_OWNER=>user);
HINT NAME
----------------------------------------- ------------------------------
OPTIMIZER_FEATURES_ENABLE(default) tuning 4rgrzpar16sv2
IGNORE_OPTIM_EMBEDDED_HINTS tuning 4rgrzpar16sv2
--附上抽取hint腳本:
$ cat spext.sql
/* Formatted on 2015/4/10 17:03:49 (QP5 v5.252.13127.32867) */
column hint format a200
column name format a30
SELECT EXTRACTVALUE (VALUE (h), '.') AS hint,so.name
FROM SYS.sqlobj$data od
,SYS.sqlobj$ so
,TABLE
(
XMLSEQUENCE
(
EXTRACT (XMLTYPE (od.comp_data), '/outline_data/hint')
)
) h
WHERE so.NAME in ( 'profile &&1', 'tuning &&1','switch tuning &&1')
AND so.signature = od.signature
AND so.CATEGORY = od.CATEGORY
AND so.obj_type = od.obj_type
AND so.plan_id = od.plan_id;
總結:
1.建立表exec DBMS_SQLTUNE.CREATE_STGTAB_SQLPROF(TABLE_NAME=>'t_sql_profile',SCHEMA_NAME=>user);
2.導入表 exec DBMS_SQLTUNE.PACK_STGTAB_SQLPROF(STAGING_TABLE_NAME=>'t_sql_profile',STAGING_SCHEMA_OWNER=>user);
2a.使用exp/expdp導出表。
3.導出exec DBMS_SQLTUNE.UNPACK_STGTAB_SQLPROF(REPLACE=>false,STAGING_TABLE_NAME=>'t_sql_profile',STAGING_SCHEMA_OWNER=>user);