11g 改變SQL執行計劃
1.先檢視是否啟用了baseline
SQL> show parameter sql
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
optimizer_capture_sql_plan_baselines boolean FALSE
optimizer_use_sql_plan_baselines boolean TRUE
2.檢視不同的執行計劃:
壞的執行計劃:
SQL> SELECT/*+ full(t)*/* FROM TEST.TEST_HARDPARSE T WHERE T.A=200;
A B
---------- ---------------
200 28-OCT-11
Execution Plan
----------------------------------------------------------
Plan hash value: 2522350317
------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 12 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| TEST_HARDPARSE | 1 | 12 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("T"."A"=200)
好的執行計劃:
SQL> SELECT * FROM TEST.TEST_HARDPARSE T WHERE T.A=200;
A B
---------- ---------------
200 28-OCT-11
Execution Plan
----------------------------------------------------------
Plan hash value: 3429616802
----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 12 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TEST_HARDPARSE | 1 | 12 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | TTT | 1 | | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("T"."A"=200)
3.將需要改變的執行計劃的SQL,放入sql baseline,有兩種方法:
a)var nv number;
exec :nv:=dbms_spm.load_plans_from_cursor_cache(sql_id => 'bp8twr81cz4sy');
b)alter session set optimizer_capture_sql_plan_baselines = true; 執行2次壞的SQL.
4.確認SQL已經被LOAD到spm
select * from dba_sql_plan_baselines t order by t.created desc;
1.21102128764653E19 SYS_SQL_a8101e72d0134aba
5.使用壞的執行計劃的sql_handle ,好的執行計劃的SQL_ID 和好的 plan_hash_value 來做替換。
var nu number;
exec :nu:=dbms_spm.load_plans_from_cursor_cache( sql_handle => 'SYS_SQL_a8101e72d0134aba' ,sql_id => '9f6rj4v8d98mx' ,plan_hash_value => '3429616802' );
6.驗證是否使用了新的執行計劃:
SQL> SELECT/*+ full(t)*/* FROM TEST.TEST_HARDPARSE T WHERE T.A=200;
A B
---------- ---------------
200 28-OCT-11
Execution Plan
----------------------------------------------------------
Plan hash value: 3429616802
----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 12 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TEST_HARDPARSE | 1 | 12 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | TTT | 1 | | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("T"."A"=200)
Note
-----
- SQL plan baseline "SQL_PLAN_ah40yfb816kpu61947bb7" used for this statement
7.如果好的執行計劃和壞的執行計劃都在base line中。也可以通過上面的方法互換執行計劃。 互換後要將壞的執行計劃置為 disable或者刪除
var nu number;
exec :nu:=dbms_spm.alter_sql_plan_baseline(sql_handle => 'SYS_SQL_a8101e72d0134aba',plan_name => 'SQL_PLAN_ah40yfb816kpu70d8e22c',attribute_name => 'ENABLED',attribute_value => 'NO' );
或者將其刪除
var nu number;
exec :nu:=dbms_spm.drop_sql_plan_baseline(sql_handle => 'SYS_SQL_a8101e72d0134aba',plan_name => 'SQL_PLAN_ah40yfb816kpu70d8e22c');
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10113559/viewspace-715841/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- sql執行計劃是否改變SQL
- 利用coe_xfr_sql_profile 改變執行計劃SQL
- 11g改變了DELETE語句的執行計劃delete
- 使用hint改變執行計劃
- 加hint改變執行計劃訪問順序優化sql優化SQL
- Oracle 通過註釋改變執行計劃Oracle
- sql 執行計劃SQL
- sql執行計劃變更和刪除快取中執行計劃的方法SQL快取
- SQL優化案例-改變那些CBO無能為力的執行計劃(一)SQL優化
- 增加索引改變執行計劃——SQL優化之Everything is possible索引SQL優化
- Oracle sql執行計劃OracleSQL
- SQL Server執行計劃SQLServer
- SQL的執行計劃SQL
- SQL執行計劃分析SQL
- SQL最佳化案例-改變那些CBO無能為力的執行計劃(一)SQL
- 檢視sql 執行計劃的歷史變更SQL
- 【sql調優之執行計劃】獲取執行計劃SQL
- 使用rownum改變執行計劃的一個典型情況
- SQLServer統計監控SQL執行計劃突變的方法SQLServer
- PostgreSQL執行計劃變化SQL
- oracle 執行計劃變更Oracle
- 獲取SQL執行計劃SQL
- SQL 執行計劃案例1SQL
- 剖析SQL Server執行計劃SQLServer
- 檢視sql執行計劃SQL
- 一條SQL語句的執行計劃變化探究SQL
- 恆等查詢條件改變執行計劃——SQL優化之Everything is PossibleSQL優化
- 【Oracle】如何檢視sql 執行計劃的歷史變更OracleSQL
- sql的執行計劃 詳解SQL
- sql執行計劃基本命令SQL
- SQL PROFILE修改固定執行計劃SQL
- 使用sql profile固定執行計劃SQL
- Oracle中檢視已執行sql的執行計劃OracleSQL
- ORACLE 11G 使用SPM來調整SQL語句的執行計劃OracleSQL
- oracle 11g 基數反饋造成同一sql執行產生不同的執行計劃OracleSQL
- 執行計劃變化的處理
- 如何檢視SQL的執行計劃SQL
- 檢視SQL的執行計劃方法SQL