使用sql baseline替换执行计划
1.分别执行下列SQL
点击(此处)折叠或打开
SQL1:select /*www1*/ /*+ full(LOGIN_LOG) */IP_ADDRESS from LOGIN_LOG where session_id=1273523;SQL2:select /*www2*/ /*+ index(LOGIN_LOG LOGIN_LOG_PK) */IP_ADDRESS from LOGIN_LOG where session_id=1273523;
2.查看SQL_ID和PLAN_HASH_VALUE
点击(此处)折叠或打开
select * from v$sql where sql_text like '%www1%'select * from v$sql where sql_text like '%www2%'
SQL1: 2pqkr80bqn6wb 3779830307
SQL2: 7510s3wam524g 3865870674
3.查看执行计划
点击(此处)折叠或打开
SQL1SQL> select * from table(dbms_xplan.display_cursor('2pqkr80bqn6wb','',''));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID 2pqkr80bqn6wb, child number 0
-------------------------------------
select /*www1*/ /*+ full(LOGIN_LOG) */IP_ADDRESS from LOGIN_LOG where
session_id=1273523
Plan hash value: 3779830307
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 95461 (100)| |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|* 1 | TABLE ACCESS FULL| LOGIN_LOG | 286K| 10M| 95461 (1)| 00:19:06 |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("SESSION_ID"=1273523)
19 rows selected.
SQL2
SQL> select * from table(dbms_xplan.display_cursor('7510s3wam524g','',''));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID 7510s3wam524g, child number 0
-------------------------------------
select /*www2*/ /*+ index(LOGIN_LOG LOGIN_LOG_PK) */IP_ADDRESS from
LOGIN_LOG where session_id=1273523
Plan hash value: 3865870674
--------------------------------------------------------------------------------
------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
| Time |
--------------------------------------------------------------------------------
------------
| 0 | SELECT STATEMENT | | | | 3433 (100)
| |
| 1 | TABLE ACCESS BY INDEX ROWID| LOGIN_LOG | 286K| 10M| 3433 (1)
| 00:00:42 |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|* 2 | INDEX RANGE SCAN | LOGIN_LOG_PK | 114K| | 3 (0)
| 00:00:01 |
--------------------------------------------------------------------------------
------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("SESSION_ID"=1273523)
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
20 rows selected.
4.从库缓存中为SQL1创建baseline
点击(此处)折叠或打开
DECLAREl_plans_loaded PLS_INTEGER;
BEGIN
l_plans_loaded := DBMS_SPM.load_plans_from_cursor_cache(sql_id => '2pqkr80bqn6wb',plan_hash_value=>'3779830307');
END;
/
select sql_handle,plan_name,dbms_lob.substr(sql_text,60,1) sql_text,ACCEPTED from dba_sql_plan_baselines;
SQL_d3e16c6839796f24 SQL_PLAN_d7sbcd0wrkvt433a13db8 select /*www1*/ /*+ full(LOGIN_LOG) */IP_ADDRESS from LOGIN_ YES
5.将符合我们预期的SQL2的执行计划的载入到第一次生成的sql baseline中
点击(此处)折叠或打开
DECLAREk1 pls_integer;
begin
k1 := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE (
sql_id=>'7510s3wam524g',
plan_hash_value=>3865870674,sql_handle=>'SQL_d3e16c6839796f24'
);
end;
/
基线SQL_d3e16c6839796f24出现2个执行计划
select sql_handle,plan_name,dbms_lob.substr(sql_text,60,1) sql_text,ACCEPTED from dba_sql_plan_baselines;
SQL_d3e16c6839796f24 SQL_PLAN_d7sbcd0wrkvt433a13db8 select /*www1*/ /*+ full(LOGIN_LOG) */IP_ADDRESS from LOGIN_ YES
SQL_d3e16c6839796f24 SQL_PLAN_d7sbcd0wrkvt47b166b46 select /*www1*/ /*+ full(LOGIN_LOG) */IP_ADDRESS from LOGIN_ YES
6.修改原先SQL2执行计划的状态为fixed
点击(此处)折叠或打开
SET SERVEROUTPUT ONDECLARE
v_text PLS_INTEGER;
BEGIN
v_text := DBMS_SPM.alter_sql_plan_baseline(sql_handle => 'SQL_d3e16c6839796f24',plan_name => 'SQL_PLAN_d7sbcd0wrkvt47b166b46',
attribute_name => 'fixed',attribute_value => 'YES');
DBMS_OUTPUT.put_line('Plans Altered: ' || v_text );
END;
/
select sql_handle,plan_name,dbms_lob.substr(sql_text,60,1) sql_text,ACCEPTED,FIXED from dba_sql_plan_baselines;
SQL_d3e16c6839796f24 SQL_PLAN_d7sbcd0wrkvt433a13db8 select /*www1*/ /*+ full(LOGIN_LOG) */IP_ADDRESS from LOGIN_ YES NO
SQL_d3e16c6839796f24 SQL_PLAN_d7sbcd0wrkvt47b166b46 select /*www1*/ /*+ full(LOGIN_LOG) */IP_ADDRESS from LOGIN_ YES YES
7.原SQL1执行计划被改变
点击(此处)折叠或打开
SQL> select /*www1*/ /*+ full(LOGIN_LOG) */IP_ADDRESS from LOGIN_LOG where session_id=1273523;Execution Plan
----------------------------------------------------------
--------------------------------------------------------------------------------
-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)
|
--------------------------------------------------------------------------------
-
| 0 | SELECT STATEMENT | | 286K| 10M| 3433 (1)
|
| 1 | TABLE ACCESS BY INDEX ROWID| LOGIN_LOG | 286K| 10M| 3433 (1)
|
| 2 | INDEX RANGE SCAN | LOGIN_LOG_PK | 114K| | 3 (0)
|
--------------------------------------------------------------------------------
-
Note
-----
- 'PLAN_TABLE' is old version
Statistics
----------------------------------------------------------
18 recursive calls
16 db block gets
19 consistent gets
4 physical reads
11856 redo size
541 bytes sent via SQL*Net to client
524 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> select * from table(dbms_xplan.display_cursor('2pqkr80bqn6wb','',''));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID 2pqkr80bqn6wb, child number 0
-------------------------------------
select /*www1*/ /*+ full(LOGIN_LOG) */IP_ADDRESS from LOGIN_LOG where
session_id=1273523
Plan hash value: 3779830307
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 95461 (100)| |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|* 1 | TABLE ACCESS FULL| LOGIN_LOG | 286K| 10M| 95461 (1)| 00:19:06 |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("SESSION_ID"=1273523)
SQL_ID 2pqkr80bqn6wb, child number 2
-------------------------------------
select /*www1*/ /*+ full(LOGIN_LOG) */IP_ADDRESS from LOGIN_LOG where
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
session_id=1273523
Plan hash value: 3865870674
--------------------------------------------------------------------------------
------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)
| Time |
--------------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
------------
| 0 | SELECT STATEMENT | | | | 3433 (100)
| |
| 1 | TABLE ACCESS BY INDEX ROWID| LOGIN_LOG | 286K| 10M| 3433 (1)
| 00:00:42 |
|* 2 | INDEX RANGE SCAN | LOGIN_LOG_PK | 114K| | 3 (0)
| 00:00:01 |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("SESSION_ID"=1273523)
Note
-----
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
- SQL plan baseline SQL_PLAN_d7sbcd0wrkvt47b166b46 used for this statement
43 rows selected.
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。