coe_load_sql_profile_v2.sql脚本利用的是profile原理,只是做了半自动的形式来使用,下面是测试过程。
专业领域包括网站制作、网站建设、购物商城网站建设、微信营销、系统平台开发, 与其他网站设计及系统开发公司不同,创新互联建站的整合解决方案结合了帮做网络品牌建设经验和互联网整合营销的理念,并将策略和执行紧密结合,为客户提供全网互联网整合方案。
coe_load_sql_profile_v2.txt
创建环境,构建测试表:
SQL> create table t1 as select * from dba_objects where object_id is not null;
Table created.
SQL> alter table t1 modify object_id not null;
Table altered.
SQL> create index idx_t1_obj_id on t1(object_id);
Index created.
索引不存储null值
SQL> analyze table t1 compute statistics;
Table analyzed.
SQL> select count(*) from t1;
COUNT(*)
----------
87070
SQL> select * from table(dbms_xplan.display_cursor(null,0));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------
SQL_ID 12c0v4my7dvr3, child number 0
-------------------------------------
select count(*) from t1
Plan hash value: 1657298618
-------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | 54 (100)| |
| 1 | SORT AGGREGAT | | 1 | | |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------
| 2 | INDEX FAST FULL SCAN| IDX_T1_OBJ_ID | 87070 | 54 (0)| 00:00:01 |
-------------------------------------------------------------------------------
14 rows selected.
会发现是进行的索引快速扫描。
使用hint提示,强行走全表扫描,然后生成执行计划。
SQL> select /*+ full(t1) */ count(*)from t1;
COUNT(*)
----------------------
87070
SQL> select * from table(dbms_xplan.display_cursor(null,0));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------
SQL_ID 20pat9zfypprh, child number 0
-------------------------------------
select /*+ full(t1) */ count(*)from t1
Plan hash value: 3724264953
-----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | 347 (100)| |
| 1 | SORT AGGREGATE | | 1| | |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------
| 2 | TABLE ACCESS FULL| T1 | 87070 | 347 (1)| 00:00:05 |
-------------------------------------------------------------------
14 rows selected.
SQL> @coe_load_sql_profile_v2.sql
Parameter 1:
SQL_ID (required)
Enter value for 1: 12c0v4my7dvr3
PLAN_HASH_VALUE AVG_ET_SECS
--------------- -----------
1657298618 .141
Parameter 2:
PLAN_HASH_VALUE (required)
Enter value for 2: 3724264953
Values passed to coe_xfr_sql_profile:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL_ID : "12c0v4my7dvr3"
PLAN_HASH_VALUE: "3724264953"
SQL>BEGIN
2 IF :sql_text IS NULL THEN
3 RAISE_APPLICATION_ERROR(-20100, 'SQL_TEXT for SQL_ID &&sql_id. was not found in memory (gv$sqltext_with_newlines) or AWR (dba_hist_sqltext).');
4 END IF;
5 END;
6 /
SQL>SET TERM OFF;
SQL>BEGIN
2 IF :other_xml IS NULL THEN
3 RAISE_APPLICATION_ERROR(-20101, 'PLAN for SQL_ID &&sql_id. and PHV &&plan_hash_value. was not found in memory (gv$sql_plan) or AWR (dba_hist_sql_plan).');
4 END IF;
5 END;
6 /
SQL>SET TERM OFF;
Execute coe_xfr_sql_profile_12c0v4my7dvr3_3724264953.sql
on TARGET system in order to create a custom SQL Profile
with plan 3724264953 linked to adjusted sql_text.
.........省略
COE_XFR_SQL_PROFILE_12c0v4my7dvr3_3724264953 completed
COE_XFR_SQL_PROFILE completed.
SQL>explain plan for select count(*) from t1;
Explained.
SQL>select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------
Plan hash value: 3724264953
-------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 347 (1)| 00:00:05 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| T1 | 87070 | 347 (1)| 00:00:05 |
-------------------------------------------------------------------
Note
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------
-----
- SQL profile "coe_12c0v4my7dvr3_3724264953" used for this statement
13 rows selected.
SQL> select name,category,status,sql_text from dba_sql_profiles;
NAME CATEGORY STATUS SQL_TEXT
------------------------------------------- --------------------- ---------------- ------------------------------
coe_12c0v4my7dvr3_3724264953 DEFAULT ENABLED select count(*) from t1
可以看到脚本coe_load_sql_profile_v2.sql将执行计划固定了。