[20190221]sql patch 问题.txt

来源:这里教程网 时间:2026-03-03 12:58:20 作者:

[20190221]sql patch 问题.txt --//链接 http://www.itpub.net/thread-2108398-1-1.html ,遇到的问题,重复测试看看. 1.环境: SCOTT@book> @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 t01 as select * from dba_objects; Table created. SCOTT@book> create index ind_t01_object_id on t01(object_id); Index created. --//注:我的测试不能分析,分析执行计划会选择索引. BEGIN   SYS.DBMS_SQLDIAG_INTERNAL.i_create_patch(     sql_text  => 'select * from t01 where object_id between 10000 and 30000',     hint_text => 'INDEX(T01,IND_T01_OBJECT_ID)',     name      => 't01_sql_patch'); END; / select * from t01 where object_id between 10000 and 30000; --//可以发现依旧选择全表扫描. BEGIN     DBMS_SQLDIAG.drop_sql_patch(name =>'t01_sql_patch'); END; / --//这样不行. select /*+ index(t01) */ * from t01 where object_id between 10000 and 30000; SCOTT@book> @ dpc '' outline PLAN_TABLE_OUTPUT ------------------------------------- SQL_ID  8x42dpxgg1fgp, child number 0 ------------------------------------- select /*+ index(t01) */ * from t01 where object_id between 10000 and 30000 Plan hash value: 1880243119 -------------------------------------------------------------------------------------------------- | Id  | Operation                   | Name              | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | -------------------------------------------------------------------------------------------------- |   0 | SELECT STATEMENT            |                   |        |       |   463 (100)|          | |   1 |  TABLE ACCESS BY INDEX ROWID| T01               |  26993 |  5456K|   463   (1)| 00:00:06 | |*  2 |   INDEX RANGE SCAN          | IND_T01_OBJECT_ID |  26993 |       |    62   (0)| 00:00:01 | -------------------------------------------------------------------------------------------------- Query Block Name / Object Alias (identified by operation id): -------------------------------------------------------------    1 - SEL$1 / T01@SEL$1    2 - SEL$1 / T01@SEL$1 Outline Data -------------   /*+       BEGIN_OUTLINE_DATA       IGNORE_OPTIM_EMBEDDED_HINTS       OPTIMIZER_FEATURES_ENABLE('11.2.0.4')       DB_VERSION('11.2.0.4')       ALL_ROWS       OUTLINE_LEAF(@"SEL$1")       INDEX_RS_ASC(@"SEL$1" "T01"@"SEL$1" ("T01"."OBJECT_ID"))       END_OUTLINE_DATA   */ Predicate Information (identified by operation id): ---------------------------------------------------    2 - access("OBJECT_ID">=10000 AND "OBJECT_ID"<=30000) --//注意提示是INDEX_RS_ASC(@"SEL$1" "T01"@"SEL$1" ("T01"."OBJECT_ID")). --//改写如下,以sys用户执行. BEGIN   SYS.DBMS_SQLDIAG_INTERNAL.i_create_patch(     sql_text  => 'select * from t01 where object_id between 10000 and 30000',     hint_text => 'INDEX_RS_ASC(@"SEL$1" "T01"@"SEL$1" ("T01"."OBJECT_ID"))',     name      => 't01_sql_patch'); END; / select * from t01 where object_id between 10000 and 30000; SCOTT@book> @ dpc '' '' PLAN_TABLE_OUTPUT ------------------------------------- SQL_ID  043grz1fjh9s7, child number 0 ------------------------------------- select * from t01 where object_id between 10000 and 30000 Plan hash value: 1880243119 -------------------------------------------------------------------------------------------------- | Id  | Operation                   | Name              | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | -------------------------------------------------------------------------------------------------- |   0 | SELECT STATEMENT            |                   |        |       |   463 (100)|          | |   1 |  TABLE ACCESS BY INDEX ROWID| T01               |  26993 |  5456K|   463   (1)| 00:00:06 | |*  2 |   INDEX RANGE SCAN          | IND_T01_OBJECT_ID |  26993 |       |    62   (0)| 00:00:01 | -------------------------------------------------------------------------------------------------- Query Block Name / Object Alias (identified by operation id): -------------------------------------------------------------    1 - SEL$1 / T01@SEL$1    2 - SEL$1 / T01@SEL$1 Predicate Information (identified by operation id): ---------------------------------------------------    2 - access("OBJECT_ID">=10000 AND "OBJECT_ID"<=30000) -----    - dynamic sampling used for this statement (level=2)    - SQL patch "t01_sql_patch" 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 33 rows selected. --//OK,现在可以使用索引了.也就是sql patch不能使用平时的提示. --//我个人认为最好使用sql profile,或者sql planbase...sql patch一般使用比较特殊的提示比如bind_ware,result_cache等等。

相关推荐