oracle绑定执行计划测试

创建表

SQL>  create table xytest as select * from dba_objects where object_id is not null;Table created.
查询数据
SQL> select count(*) from xytest;COUNT(*)
----------87577在object_id创建索引
SQL>  create index idx_obj_id on xytest(object_id);Index created.进行统计信息收集
SQL>  analyze table xytest compute statistics;Table analyzed.

查询执行计划及sql_id

SQL> select count(*) from xytest where object_id='3';COUNT(*)
----------1SQL>  select * from table(dbms_xplan.display_cursor(null,0));PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID	7s637th6qp2vy, child number 0
-------------------------------------
select count(*) from xytest where object_id='3'Plan hash value: 3427986586--------------------------------------------------------------------------------
| Id  | Operation	  | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |	       |       |       |     1 (100)|	       |
|   1 |  SORT AGGREGATE   |	       |     1 |     4 |	    |	       |PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|*  2 |   INDEX RANGE SCAN| IDX_OBJ_ID |     1 |     4 |     1	 (0)| 00:00:01 |
--------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------2 - access("OBJECT_ID"=3)19 rows selected.

使其强制走全表扫

SQL>  select /*+ full(xytest) */ count(*) from xytest where object_id='3';COUNT(*)
----------1SQL> select * from table(dbms_xplan.display_cursor(null,0));PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID	0zwqj3t8k5u8m, child number 0
-------------------------------------select /*+ full(xytest) */ count(*) from xytest where object_id='3'Plan hash value: 2099202247-----------------------------------------------------------------------------
| Id  | Operation	   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |	    |	    |	    |	349 (100)|	    |
|   1 |  SORT AGGREGATE    |	    |	  1 |	  4 |		 |	    |PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|*  2 |   TABLE ACCESS FULL| XYTEST |	  1 |	  4 |	349   (1)| 00:00:05 |
-----------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------2 - filter("OBJECT_ID"=3)19 rows selected.

执行coe_xfr_sql_profile.sql 脚本

sql_id 为需要改变的
PLAN_HASH_VALUE为全表扫的值

SQL> @coe_xfr_sql_profile.sqlParameter 1:
SQL_ID (required)Enter value for 1: 7s637th6qp2vy
PLAN_HASH_VALUE AVG_ET_SECS
--------------- -----------3427986586 	  0Parameter 2:
PLAN_HASH_VALUE (required)Enter value for 2: 2099202247会生成如下脚本
-rw-r--r-- 1 oracle oinstall  3363 Jun 13 09:57 coe_xfr_sql_profile_7s637th6qp2vy_2099202247.sql

执行脚本

SQL> @coe_xfr_sql_profile_7s637th6qp2vy_2099202247.sql

验证查询

select count(*) from xytest where object_id='3';COUNT(*)
----------1SQL>  select * from table(dbms_xplan.display_cursor(null,0));PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID	7s637th6qp2vy, child number 0
-------------------------------------
select count(*) from xytest where object_id='3'Plan hash value: 2099202247-----------------------------------------------------------------------------
| Id  | Operation	   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |	    |	    |	    |	349 (100)|	    |
|   1 |  SORT AGGREGATE    |	    |	  1 |	  4 |		 |	    |PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|*  2 |   TABLE ACCESS FULL| XYTEST |	  1 |	  4 |	349   (1)| 00:00:05 |
-----------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------2 - filter("OBJECT_ID"=3)Note
------ SQL profile coe_7s637th6qp2vy_2099202247 used for this statementPLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------23 rows selected.
已经走了需要绑定的执行计划

查询强制绑定计划有哪些

select * from dba_sql_profiles;

如需要取消强制绑定计划

begin 
DBMS_SQLTUNE.DROP_SQL_PROFILE(name => 'coe_7s637th6qp2vy_2099202247'); 
end;

查询7天内执行计划是否改变

set lines 150 pages 150
col BEGIN_INTERVAL_TIME for a23
col PLAN_HASH_VALUE for 9999999999
col date_time for a30
col snap_id heading 'SnapId'
col executions_delta heading "No. of exec"
col sql_profile heading "SQL|Profile" for a7
col date_time heading 'Date time'
col avg_lio heading 'LIO/exec' for 99999999999.99
col avg_cputime heading 'CPUTIM/exec' for 9999999.99
col avg_etime heading 'ETIME(MS)/exec' for 9999999.99
col avg_pio heading 'PIO/exec' for 9999999.99
col avg_row heading 'ROWs/exec' for 9999999.99
SELECT distinct
s.snap_id ,
PLAN_HASH_VALUE,
to_char(s.BEGIN_INTERVAL_TIME,'mm/dd/yy_hh24mi')|| to_char(s.END_INTERVAL_TIME,'_hh24mi') Date_Time,
SQL.executions_delta,
SQL.buffer_gets_delta/decode(nvl(SQL.executions_delta,0),0,1,SQL.executions_delta) avg_lio,
--SQL.ccwait_delta,
(SQL.cpu_time_delta/1000000)/decode(nvl(SQL.executions_delta,0),0,1,SQL.executions_delta) avg_cputime ,
(SQL.elapsed_time_delta/1000)/decode(nvl(SQL.executions_delta,0),0,1,SQL.executions_delta) avg_etime,
SQL.DISK_READS_DELTA/decode(nvl(SQL.executions_delta,0),0,1,SQL.executions_delta) avg_pio,
SQL.rows_processed_DELTA/decode(nvl(SQL.executions_delta,0),0,1,SQL.executions_delta) avg_row
--,SQL.sql_profile
FROM
dba_hist_sqlstat SQL,
dba_hist_snapshot s
WHERE
s.instance_number =(select instance_number from v$instance)
and s.instance_number=SQL.instance_number
and SQL.dbid =(select dbid from v$database)
and s.snap_id = SQL.snap_id
AND sql_id in
('&SQLID') order by s.snap_id
/

查询历史执行计划

select distinct SQL_ID,PLAN_HASH_VALUE,to_char(TIMESTAMP, 'yyyymmdd hh24:mi:ss') TIMESTAMPfrom dba_hist_sql_planwhere SQL_ID = '04fwzdrkfv4jb'order by TIMESTAMP;

脚本coe_xfr_sql_profile.sql

SPO coe_xfr_sql_profile.log;
SET DEF ON TERM OFF ECHO ON FEED OFF VER OFF HEA ON LIN 2000 PAGES 100 LONG 8000000 LONGC 800000 TRIMS ON TI OFF TIMI OFF SERVEROUT ON SIZE 1000000 NUMF "" SQLP SQL>;
SET SERVEROUT ON SIZE UNL;
REM
REM $Header: 215187.1 coe_xfr_sql_profile.sql 11.4.5.5 2013/03/01 carlos.sierra $
REM
REM Copyright (c) 2000-2013, Oracle Corporation. All rights reserved.
REM
REM AUTHOR
REM   carlos.sierra@oracle.com
REM
REM SCRIPT
REM   coe_xfr_sql_profile.sql
REM
REM DESCRIPTION
REM   This script generates another that contains the commands to
REM   create a manual custom SQL Profile out of a known plan from
REM   memory or AWR. The manual custom profile can be implemented
REM   into the same SOURCE system where the plan was retrieved,
REM   or into another similar TARGET system that has same schema
REM   objects referenced by the SQL that generated the known plan.
REM
REM PRE-REQUISITES
REM   1. Oracle Tuning Pack license.
REM
REM PARAMETERS
REM   1. SQL_ID (required)
REM   2. Plan Hash Value for which a manual custom SQL Profile is
REM      needed (required). A list of known plans is presented.
REM      You may choose from list provided or enter a valid phv
REM      from a version of the SQL modified with Hints.
REM
REM EXECUTION
REM   1. Connect into SQL*Plus as user with access to data dictionary.
REM      Do not use SYS.
REM   2. Execute script coe_xfr_sql_profile.sql passing SQL_ID and
REM      plan hash value (parameters can be passed inline or until
REM      requested).
REM
REM EXAMPLE
REM   # sqlplus system
REM   SQL> START coe_xfr_sql_profile.sql [SQL_ID] [PLAN_HASH_VALUE];
REM   SQL> START coe_xfr_sql_profile.sql gnjy0mn4y9pbm 2055843663;
REM   SQL> START coe_xfr_sql_profile.sql gnjy0mn4y9pbm;
REM   SQL> START coe_xfr_sql_profile.sql;
REM
REM NOTES
REM   1. For possible errors see coe_xfr_sql_profile.log
REM   2. If SQLT is installed in SOURCE, you can use instead:
REM      sqlt/utl/sqltprofile.sql
REM   3. Be aware that using DBMS_SQLTUNE requires a license for
REM      Oracle Tuning Pack.
REM   4. Use a DBA user but not SYS.
REM   5. If you get "ORA-06532: Subscript outside of limit, ORA-06512: at line 1"
REM      Then you may consider this change (only in a test and disposable system):
REM      create or replace TYPE sys.sqlprof_attr AS VARRAY(5000) of VARCHAR2(500);
REM
SET TERM ON ECHO OFF;
PRO
PRO Parameter 1:
PRO SQL_ID (required)
PRO
DEF sql_id = '&1';
PRO
WITH
p AS (
SELECT plan_hash_valueFROM gv$sql_planWHERE sql_id = TRIM('&&sql_id.')AND other_xml IS NOT NULLUNION
SELECT plan_hash_valueFROM dba_hist_sql_planWHERE sql_id = TRIM('&&sql_id.')AND other_xml IS NOT NULL ),
m AS (
SELECT plan_hash_value,SUM(elapsed_time)/SUM(executions) avg_et_secsFROM gv$sqlWHERE sql_id = TRIM('&&sql_id.')AND executions > 0GROUP BYplan_hash_value ),
a AS (
SELECT plan_hash_value,SUM(elapsed_time_total)/SUM(executions_total) avg_et_secsFROM dba_hist_sqlstatWHERE sql_id = TRIM('&&sql_id.')AND executions_total > 0GROUP BYplan_hash_value )
SELECT p.plan_hash_value,ROUND(NVL(m.avg_et_secs, a.avg_et_secs)/1e6, 3) avg_et_secsFROM p, m, aWHERE p.plan_hash_value = m.plan_hash_value(+)AND p.plan_hash_value = a.plan_hash_value(+)ORDER BYavg_et_secs NULLS LAST;
PRO
PRO Parameter 2:
PRO PLAN_HASH_VALUE (required)
PRO
DEF plan_hash_value = '&2';
PRO
PRO Values passed to coe_xfr_sql_profile:
PRO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PRO SQL_ID         : "&&sql_id."
PRO PLAN_HASH_VALUE: "&&plan_hash_value."
PRO
SET TERM OFF ECHO ON;
WHENEVER SQLERROR EXIT SQL.SQLCODE;-- trim parameters
COL sql_id NEW_V sql_id FOR A30;
COL plan_hash_value NEW_V plan_hash_value FOR A30;
SELECT TRIM('&&sql_id.') sql_id, TRIM('&&plan_hash_value.') plan_hash_value FROM DUAL;VAR sql_text CLOB;
VAR sql_text2 CLOB;
VAR other_xml CLOB;
EXEC :sql_text := NULL;
EXEC :sql_text2 := NULL;
EXEC :other_xml := NULL;-- get sql_text from memory
DECLAREl_sql_text VARCHAR2(32767);
BEGIN -- 10g see bug 5017909FOR i IN (SELECT DISTINCT piece, sql_textFROM gv$sqltext_with_newlinesWHERE sql_id = TRIM('&&sql_id.')ORDER BY 1, 2)LOOPIF :sql_text IS NULL THENDBMS_LOB.CREATETEMPORARY(:sql_text, TRUE);DBMS_LOB.OPEN(:sql_text, DBMS_LOB.LOB_READWRITE);END IF;-- removes NUL charactersl_sql_text := REPLACE(i.sql_text, CHR(00), ' ');-- adds a NUL character at the end of each lineDBMS_LOB.WRITEAPPEND(:sql_text, LENGTH(l_sql_text) + 1, l_sql_text||CHR(00));END LOOP;-- if found in memory then sql_text is not nullIF :sql_text IS NOT NULL THENDBMS_LOB.CLOSE(:sql_text);END IF;
EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('getting sql_text from memory: '||SQLERRM);:sql_text := NULL;
END;
/SELECT :sql_text FROM DUAL;-- get sql_text from awr
DECLAREl_sql_text VARCHAR2(32767);l_clob_size NUMBER;l_offset NUMBER;
BEGINIF :sql_text IS NULL OR NVL(DBMS_LOB.GETLENGTH(:sql_text), 0) = 0 THENSELECT sql_textINTO :sql_text2FROM dba_hist_sqltextWHERE sql_id = TRIM('&&sql_id.')AND sql_text IS NOT NULLAND ROWNUM = 1;END IF;-- if found in awr then sql_text2 is not nullIF :sql_text2 IS NOT NULL THENl_clob_size := NVL(DBMS_LOB.GETLENGTH(:sql_text2), 0);l_offset := 1;DBMS_LOB.CREATETEMPORARY(:sql_text, TRUE);DBMS_LOB.OPEN(:sql_text, DBMS_LOB.LOB_READWRITE);-- store in clob as 64 character pieces plus a NUL character at the end of each pieceWHILE l_offset < l_clob_sizeLOOPIF l_clob_size - l_offset > 64 THENl_sql_text := REPLACE(DBMS_LOB.SUBSTR(:sql_text2, 64, l_offset), CHR(00), ' ');ELSE -- last piecel_sql_text := REPLACE(DBMS_LOB.SUBSTR(:sql_text2, l_clob_size - l_offset + 1, l_offset), CHR(00), ' ');END IF;DBMS_LOB.WRITEAPPEND(:sql_text, LENGTH(l_sql_text) + 1, l_sql_text||CHR(00));l_offset := l_offset + 64;END LOOP;DBMS_LOB.CLOSE(:sql_text);END IF;
EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('getting sql_text from awr: '||SQLERRM);:sql_text := NULL;
END;
/SELECT :sql_text2 FROM DUAL;
SELECT :sql_text FROM DUAL;-- validate sql_text
SET TERM ON;
BEGINIF :sql_text IS NULL THENRAISE_APPLICATION_ERROR(-20100, 'SQL_TEXT for SQL_ID &&sql_id. was not found in memory (gv$sqltext_with_newlines) or AWR (dba_hist_sqltext).');END IF;
END;
/
SET TERM OFF;-- get other_xml from memory
BEGINFOR i IN (SELECT other_xmlFROM gv$sql_planWHERE sql_id = TRIM('&&sql_id.')AND plan_hash_value = TO_NUMBER(TRIM('&&plan_hash_value.'))AND other_xml IS NOT NULLORDER BYchild_number, id)LOOP:other_xml := i.other_xml;EXIT; -- 1stEND LOOP;
EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('getting other_xml from memory: '||SQLERRM);:other_xml := NULL;
END;
/-- get other_xml from awr
BEGINIF :other_xml IS NULL OR NVL(DBMS_LOB.GETLENGTH(:other_xml), 0) = 0 THENFOR i IN (SELECT other_xmlFROM dba_hist_sql_planWHERE sql_id = TRIM('&&sql_id.')AND plan_hash_value = TO_NUMBER(TRIM('&&plan_hash_value.'))AND other_xml IS NOT NULLORDER BYid)LOOP:other_xml := i.other_xml;EXIT; -- 1stEND LOOP;END IF;
EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('getting other_xml from awr: '||SQLERRM);:other_xml := NULL;
END;
/-- get other_xml from memory from modified SQL
BEGINIF :other_xml IS NULL OR NVL(DBMS_LOB.GETLENGTH(:other_xml), 0) = 0 THENFOR i IN (SELECT other_xmlFROM gv$sql_planWHERE plan_hash_value = TO_NUMBER(TRIM('&&plan_hash_value.'))AND other_xml IS NOT NULLORDER BYchild_number, id)LOOP:other_xml := i.other_xml;EXIT; -- 1stEND LOOP;END IF;
EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('getting other_xml from memory: '||SQLERRM);:other_xml := NULL;
END;
/-- get other_xml from awr from modified SQL
BEGINIF :other_xml IS NULL OR NVL(DBMS_LOB.GETLENGTH(:other_xml), 0) = 0 THENFOR i IN (SELECT other_xmlFROM dba_hist_sql_planWHERE plan_hash_value = TO_NUMBER(TRIM('&&plan_hash_value.'))AND other_xml IS NOT NULLORDER BYid)LOOP:other_xml := i.other_xml;EXIT; -- 1stEND LOOP;END IF;
EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('getting other_xml from awr: '||SQLERRM);:other_xml := NULL;
END;
/SELECT :other_xml FROM DUAL;-- validate other_xml
SET TERM ON;
BEGINIF :other_xml IS NULL THENRAISE_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).');END IF;
END;
/
SET TERM OFF;-- generates script that creates sql profile in target system:
SET ECHO OFF;
PRO coe_xfr_sql_profile_&&sql_id._&&plan_hash_value..sql.
SET FEED OFF LIN 666 TRIMS ON TI OFF TIMI OFF SERVEROUT ON SIZE 1000000 FOR WOR;
SET SERVEROUT ON SIZE UNL FOR WOR;
SPO OFF;
SPO coe_xfr_sql_profile_&&sql_id._&&plan_hash_value..sql;
DECLAREl_pos NUMBER;l_clob_size NUMBER;l_offset NUMBER;l_sql_text VARCHAR2(32767);l_len NUMBER;l_hint VARCHAR2(32767);
BEGINDBMS_OUTPUT.PUT_LINE('SPO coe_xfr_sql_profile_&&sql_id._&&plan_hash_value..log;');DBMS_OUTPUT.PUT_LINE('SET ECHO ON TERM ON LIN 2000 TRIMS ON NUMF 99999999999999999999;');DBMS_OUTPUT.PUT_LINE('REM');DBMS_OUTPUT.PUT_LINE('REM $Header: 215187.1 coe_xfr_sql_profile_&&sql_id._&&plan_hash_value..sql 11.4.4.4 '||TO_CHAR(SYSDATE, 'YYYY/MM/DD')||' carlos.sierra $');DBMS_OUTPUT.PUT_LINE('REM');DBMS_OUTPUT.PUT_LINE('REM Copyright (c) 2000-2012, Oracle Corporation. All rights reserved.');DBMS_OUTPUT.PUT_LINE('REM');DBMS_OUTPUT.PUT_LINE('REM AUTHOR');DBMS_OUTPUT.PUT_LINE('REM   carlos.sierra@oracle.com');DBMS_OUTPUT.PUT_LINE('REM');DBMS_OUTPUT.PUT_LINE('REM SCRIPT');DBMS_OUTPUT.PUT_LINE('REM   coe_xfr_sql_profile_&&sql_id._&&plan_hash_value..sql');DBMS_OUTPUT.PUT_LINE('REM');DBMS_OUTPUT.PUT_LINE('REM DESCRIPTION');DBMS_OUTPUT.PUT_LINE('REM   This script is generated by coe_xfr_sql_profile.sql');DBMS_OUTPUT.PUT_LINE('REM   It contains the SQL*Plus commands to create a custom');DBMS_OUTPUT.PUT_LINE('REM   SQL Profile for SQL_ID &&sql_id. based on plan hash');DBMS_OUTPUT.PUT_LINE('REM   value &&plan_hash_value..');DBMS_OUTPUT.PUT_LINE('REM   The custom SQL Profile to be created by this script');DBMS_OUTPUT.PUT_LINE('REM   will affect plans for SQL commands with signature');DBMS_OUTPUT.PUT_LINE('REM   matching the one for SQL Text below.');DBMS_OUTPUT.PUT_LINE('REM   Review SQL Text and adjust accordingly.');DBMS_OUTPUT.PUT_LINE('REM');DBMS_OUTPUT.PUT_LINE('REM PARAMETERS');DBMS_OUTPUT.PUT_LINE('REM   None.');DBMS_OUTPUT.PUT_LINE('REM');DBMS_OUTPUT.PUT_LINE('REM EXAMPLE');DBMS_OUTPUT.PUT_LINE('REM   SQL> START coe_xfr_sql_profile_&&sql_id._&&plan_hash_value..sql;');DBMS_OUTPUT.PUT_LINE('REM');DBMS_OUTPUT.PUT_LINE('REM NOTES');DBMS_OUTPUT.PUT_LINE('REM   1. Should be run as SYSTEM or SYSDBA.');DBMS_OUTPUT.PUT_LINE('REM   2. User must have CREATE ANY SQL PROFILE privilege.');DBMS_OUTPUT.PUT_LINE('REM   3. SOURCE and TARGET systems can be the same or similar.');DBMS_OUTPUT.PUT_LINE('REM   4. To drop this custom SQL Profile after it has been created:');DBMS_OUTPUT.PUT_LINE('REM      EXEC DBMS_SQLTUNE.DROP_SQL_PROFILE(''coe_&&sql_id._&&plan_hash_value.'');');DBMS_OUTPUT.PUT_LINE('REM   5. Be aware that using DBMS_SQLTUNE requires a license');DBMS_OUTPUT.PUT_LINE('REM      for the Oracle Tuning Pack.');DBMS_OUTPUT.PUT_LINE('REM   6. If you modified a SQL putting Hints in order to produce a desired');DBMS_OUTPUT.PUT_LINE('REM      Plan, you can remove the artifical Hints from SQL Text pieces below.');DBMS_OUTPUT.PUT_LINE('REM      By doing so you can create a custom SQL Profile for the original');DBMS_OUTPUT.PUT_LINE('REM      SQL but with the Plan captured from the modified SQL (with Hints).');DBMS_OUTPUT.PUT_LINE('REM');DBMS_OUTPUT.PUT_LINE('WHENEVER SQLERROR EXIT SQL.SQLCODE;');DBMS_OUTPUT.PUT_LINE('REM');DBMS_OUTPUT.PUT_LINE('VAR signature NUMBER;');DBMS_OUTPUT.PUT_LINE('VAR signaturef NUMBER;');DBMS_OUTPUT.PUT_LINE('REM');DBMS_OUTPUT.PUT_LINE('DECLARE');DBMS_OUTPUT.PUT_LINE('sql_txt CLOB;');DBMS_OUTPUT.PUT_LINE('h       SYS.SQLPROF_ATTR;');DBMS_OUTPUT.PUT_LINE('PROCEDURE wa (p_line IN VARCHAR2) IS');DBMS_OUTPUT.PUT_LINE('BEGIN');DBMS_OUTPUT.PUT_LINE('DBMS_LOB.WRITEAPPEND(sql_txt, LENGTH(p_line), p_line);');DBMS_OUTPUT.PUT_LINE('END wa;');DBMS_OUTPUT.PUT_LINE('BEGIN');DBMS_OUTPUT.PUT_LINE('DBMS_LOB.CREATETEMPORARY(sql_txt, TRUE);');DBMS_OUTPUT.PUT_LINE('DBMS_LOB.OPEN(sql_txt, DBMS_LOB.LOB_READWRITE);');DBMS_OUTPUT.PUT_LINE('-- SQL Text pieces below do not have to be of same length.');DBMS_OUTPUT.PUT_LINE('-- So if you edit SQL Text (i.e. removing temporary Hints),');DBMS_OUTPUT.PUT_LINE('-- there is no need to edit or re-align unmodified pieces.');l_clob_size := NVL(DBMS_LOB.GETLENGTH(:sql_text), 0);l_offset := 1;WHILE l_offset < l_clob_sizeLOOPl_pos := DBMS_LOB.INSTR(:sql_text, CHR(00), l_offset);IF l_pos > 0 THENl_len := l_pos - l_offset;ELSE -- last piecel_len := l_clob_size - l_pos + 1;END IF;l_sql_text := DBMS_LOB.SUBSTR(:sql_text, l_len, l_offset);/* cannot do such 3 replacement since a line could end with a comment using "--"l_sql_text := REPLACE(l_sql_text, CHR(10), ' '); -- replace LF with SPl_sql_text := REPLACE(l_sql_text, CHR(13), ' '); -- replace CR with SPl_sql_text := REPLACE(l_sql_text, CHR(09), ' '); -- replace TAB with SP*/l_offset := l_offset + l_len + 1;IF l_len > 0 THENIF INSTR(l_sql_text, '''[') + INSTR(l_sql_text, ']''') = 0 THENl_sql_text := '['||l_sql_text||']';ELSIF INSTR(l_sql_text, '''{') + INSTR(l_sql_text, '}''') = 0 THENl_sql_text := '{'||l_sql_text||'}';ELSIF INSTR(l_sql_text, '''<') + INSTR(l_sql_text, '>''') = 0 THENl_sql_text := '<'||l_sql_text||'>';ELSIF INSTR(l_sql_text, '''(') + INSTR(l_sql_text, ')''') = 0 THENl_sql_text := '('||l_sql_text||')';ELSIF INSTR(l_sql_text, '''"') + INSTR(l_sql_text, '"''') = 0 THENl_sql_text := '"'||l_sql_text||'"';ELSIF INSTR(l_sql_text, '''|') + INSTR(l_sql_text, '|''') = 0 THENl_sql_text := '|'||l_sql_text||'|';ELSIF INSTR(l_sql_text, '''~') + INSTR(l_sql_text, '~''') = 0 THENl_sql_text := '~'||l_sql_text||'~';ELSIF INSTR(l_sql_text, '''^') + INSTR(l_sql_text, '^''') = 0 THENl_sql_text := '^'||l_sql_text||'^';ELSIF INSTR(l_sql_text, '''@') + INSTR(l_sql_text, '@''') = 0 THENl_sql_text := '@'||l_sql_text||'@';ELSIF INSTR(l_sql_text, '''#') + INSTR(l_sql_text, '#''') = 0 THENl_sql_text := '#'||l_sql_text||'#';ELSIF INSTR(l_sql_text, '''%') + INSTR(l_sql_text, '%''') = 0 THENl_sql_text := '%'||l_sql_text||'%';ELSIF INSTR(l_sql_text, '''$') + INSTR(l_sql_text, '$''') = 0 THENl_sql_text := '$'||l_sql_text||'$';ELSEl_sql_text := CHR(96)||l_sql_text||CHR(96);END IF;DBMS_OUTPUT.PUT_LINE('wa(q'''||l_sql_text||''');');END IF;END LOOP;DBMS_OUTPUT.PUT_LINE('DBMS_LOB.CLOSE(sql_txt);');DBMS_OUTPUT.PUT_LINE('h := SYS.SQLPROF_ATTR(');DBMS_OUTPUT.PUT_LINE('q''[BEGIN_OUTLINE_DATA]'',');FOR i IN (SELECT /*+ opt_param('parallel_execution_enabled', 'false') */SUBSTR(EXTRACTVALUE(VALUE(d), '/hint'), 1, 4000) hintFROM TABLE(XMLSEQUENCE(EXTRACT(XMLTYPE(:other_xml), '/*/outline_data/hint'))) d)LOOPl_hint := i.hint;WHILE NVL(LENGTH(l_hint), 0) > 0LOOPIF LENGTH(l_hint) <= 500 THENDBMS_OUTPUT.PUT_LINE('q''['||l_hint||']'',');l_hint := NULL;ELSEl_pos := INSTR(SUBSTR(l_hint, 1, 500), ' ', -1);DBMS_OUTPUT.PUT_LINE('q''['||SUBSTR(l_hint, 1, l_pos)||']'',');l_hint := '   '||SUBSTR(l_hint, l_pos);END IF;END LOOP;END LOOP;DBMS_OUTPUT.PUT_LINE('q''[END_OUTLINE_DATA]'');');DBMS_OUTPUT.PUT_LINE(':signature := DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE(sql_txt);');DBMS_OUTPUT.PUT_LINE(':signaturef := DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE(sql_txt, TRUE);');DBMS_OUTPUT.PUT_LINE('DBMS_SQLTUNE.IMPORT_SQL_PROFILE (');DBMS_OUTPUT.PUT_LINE('sql_text    => sql_txt,');DBMS_OUTPUT.PUT_LINE('profile     => h,');DBMS_OUTPUT.PUT_LINE('name        => ''coe_&&sql_id._&&plan_hash_value.'',');DBMS_OUTPUT.PUT_LINE('description => ''coe &&sql_id. &&plan_hash_value. ''||:signature||'' ''||:signaturef||'''',');DBMS_OUTPUT.PUT_LINE('category    => ''DEFAULT'',');DBMS_OUTPUT.PUT_LINE('validate    => TRUE,');DBMS_OUTPUT.PUT_LINE('replace     => TRUE,');DBMS_OUTPUT.PUT_LINE('force_match => FALSE /* TRUE:FORCE (match even when different literals in SQL). FALSE:EXACT (similar to CURSOR_SHARING) */ );');DBMS_OUTPUT.PUT_LINE('DBMS_LOB.FREETEMPORARY(sql_txt);');DBMS_OUTPUT.PUT_LINE('END;');DBMS_OUTPUT.PUT_LINE('/');DBMS_OUTPUT.PUT_LINE('WHENEVER SQLERROR CONTINUE');DBMS_OUTPUT.PUT_LINE('SET ECHO OFF;');DBMS_OUTPUT.PUT_LINE('PRINT signature');DBMS_OUTPUT.PUT_LINE('PRINT signaturef');DBMS_OUTPUT.PUT_LINE('PRO');DBMS_OUTPUT.PUT_LINE('PRO ... manual custom SQL Profile has been created');DBMS_OUTPUT.PUT_LINE('PRO');DBMS_OUTPUT.PUT_LINE('SET TERM ON ECHO OFF LIN 80 TRIMS OFF NUMF "";');DBMS_OUTPUT.PUT_LINE('SPO OFF;');DBMS_OUTPUT.PUT_LINE('PRO');DBMS_OUTPUT.PUT_LINE('PRO COE_XFR_SQL_PROFILE_&&sql_id._&&plan_hash_value. completed');
END;
/
SPO OFF;
SET DEF ON TERM ON ECHO OFF FEED 6 VER ON HEA ON LIN 80 PAGES 14 LONG 80 LONGC 80 TRIMS OFF TI OFF TIMI OFF SERVEROUT OFF NUMF "" SQLP SQL>;
SET SERVEROUT OFF;
PRO
PRO Execute coe_xfr_sql_profile_&&sql_id._&&plan_hash_value..sql
PRO on TARGET system in order to create a custom SQL Profile
PRO with plan &&plan_hash_value linked to adjusted sql_text.
PRO
UNDEFINE 1 2 sql_id plan_hash_value
CL COL
PRO
PRO COE_XFR_SQL_PROFILE completed.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/26224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

17.路由配置与页面创建

路由配置与页面创建 官网&#xff1a;https://router.vuejs.org/zh/ Vue Router 和 组合式 API | Vue Router (vuejs.org) 1. 修改index.ts import { RouteRecordRaw, createRouter, createWebHistory } from "vue-router"; import Layout from /layout/Index.vueco…

中国版Sora?快手「可灵」到底行不行?

“可灵”与Sora有相似的技术架构&#xff0c;生成的视频动作流畅、幅度大&#xff0c;对物理世界理解力与还原度很高。可生成120秒、每秒30帧的高清视频&#xff0c;分辨率高达1080p&#xff0c;并且支持多种不同的屏幕比例。 “中国版SORA”到底是不是名副其实&#xff1f;能…

【Android面试八股文】1. 你说一说Handler机制吧 2. 你知道Handler的同步屏障吗? 3. Looper一直在循环,会造成阻塞吗?为什么?

文章目录 一. 你说一说Handler机制吧二、你知道Handler的同步屏障吗&#xff1f;2.1 Handler消息的分类2.2 什么是同步屏障2.3 为什么要设计同步屏障2.4 同步屏障的用法 三、Looper一直在循环&#xff0c;会造成阻塞吗&#xff1f;为什么&#xff1f;扩展阅读 一. 你说一说Hand…

YASKAWA机器人HW1171921-B电缆维修

安川机器人作为现代工业自动化的重要设备&#xff0c;其稳定运行对于生产线的连续性和效率至关重要。然而&#xff0c;随着使用时间的增长&#xff0c;可能会出现各种YASKAWA机器人本体线缆故障&#xff0c;如断线、短路、接触不良等。 一、安川工业机器人电缆维修前的准备 在进…

leetcode打卡#day43 携带研究材料(第六期模拟笔试)、416. 分割等和子集

携带研究材料&#xff08;第六期模拟笔试&#xff09; #include<iostream> #include<algorithm> #include<vector>using namespace std;int getMaxValue(vector<int>& weights, vector<int>& values, int n, int m) {vector<vector&…

2024/06/13--代码随想录算法2/17| 62.不同路径、63. 不同路径 II、343. 整数拆分 (可跳过)、96.不同的二叉搜索树 (可跳过)

62.不同路径 力扣链接 动态规划5步曲 确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a; dp[i][j] &#xff1a;表示从&#xff08;0 &#xff0c;0&#xff09;出发&#xff0c;到(i, j) 有dp[i][j]条不同的路径。确定递推公式&#xff0c;dp[i][j] d…

vue3delete请求报403forbidden,前后端解决方式

在做开发时&#xff0c;前期已经在Controller类加上CrossOrigin(origins "*")&#xff0c;发送get和post请求都没问题&#xff0c;但遇到delete请求时&#xff0c;又报出跨域问题 一.前端添加proxy代理服务器&#xff08;未能解决&#xff09; 在vue.config.js中使…

热门开源项目推荐~商城系统mall项目详细介绍

Mall 项目是一个开源的电商系统&#xff0c;它包括前台商城系统和后台管理系统&#xff0c;主要基于 SpringBoot 和 MyBatis 进行实现&#xff0c;并采用 Docker 容器化部署1315161819。以下是对 Mall 项目的详细介绍&#xff1a; 项目概览 Mall 项目旨在提供一个高效、可扩展…

【面经总结】Java基础 - Java8 新特性

Java8 新特性 Java8 有什么新特性 Stream API&#xff1a;函数式编程思想&#xff0c;更方便处理集合、文件Optional 类&#xff1a;解决空指针异常Lambda 表达式&#xff1a;替代匿名内部类来实现函数式接口默认方法&#xff1a;接口中可以定义默认实现 Stream API Stream…

【Python入门与进阶】Python如何处理不同进制的数据

Python 提供了多种方法来处理不同进制的数据&#xff0c;包括二进制、八进制、十进制和十六进制。以下是一些常见的操作方式&#xff1a; 1. 进制转换 Python 内置了一些函数&#xff0c;可以方便地在不同进制之间进行转换。 1.1 从不同进制转换为十进制 二进制&#xff1a…

u-boot启动第一阶段 Start.S

从sram的uboot的第一阶段跳转到ddr下的uboot的第二阶段地址&#xff08;不直接从ram中完成uboot是因为ram空间有限&#xff09; 从start.s中构建异常向量表&#xff0c;然后到lowlevel中&#xff0c;然后完成2到7&#xff0c;之后再再ram中做栈重定位动作&#xff0c;建立mmu&a…

澳洲前端与后端开发的区别:深入解析两者之间的异同

澳洲前端与后端开发的区别&#xff1a;深入解析两者之间的异同 在澳洲的IT行业中&#xff0c;前端开发和后端开发是两个不可或缺的岗位。虽然它们都致力于构建出色的Web应用&#xff0c;但在职责、技术要求、工作方式和职业发展等方面却存在着显著的差异。本文将从四个方面、五…

Java概述与历史

引言 Java是一门广泛使用的编程语言&#xff0c;自1995年由Sun Microsystems发布以来&#xff0c;其平台无关性、稳定性和安全性使得它在软件开发领域中占据了重要地位。本文将详细介绍Java的起源与发展、核心理念、Java虚拟机&#xff08;JVM&#xff09;、版本演进等内容&…

嵌套查询(一)-谓词IN、量词ANY、量词ALL

一、在多个表之间进行数据查询&#xff0c;除了可以使用连接查询之外&#xff0c;也可以使用嵌套查询&#xff0c;那么什么是嵌套查询呢&#xff1f;如何使用嵌套查询呢&#xff1f; 1、将一个SELECT-FROM查询&#xff0c;嵌套在另一个SELECT查询语句中&#xff0c;那么这个SE…

C语言 | 文件操作(上)【必收藏】

文件操作&#xff08;上&#xff09; 1、使用文件的原因2、什么是文件3、二进制文件和文本文件4、 流的打开与关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开和关闭 5、文件的顺序读写5.1 顺序读写函数介绍5.1.1 fputc与fgetc 1、使用文件的原因 首先来看…

Codeforces Round 614 (Div. 1) B. Aroma‘s Search

Aroma’s Search time limit per test: 1 second memory limit per test: 256 megabytes input: standard input output: standard output With a new body, our idol Aroma White (or should we call her Kaori Minamiya?) begins to uncover her lost past through the OS s…

人工智能在肿瘤细胞分类中的应用|顶刊速递·24-06-06

小罗碎碎念 推文主题——人工智能在肿瘤细胞分类中的应用。 重点关注 临床方向的同学/老师建议重点关注第四篇&第六篇文章&#xff0c;最近DNA甲基化和蛋白组学与AI的结合&#xff0c;在顶刊中出现的频率很高&#xff0c;建议思考一下能否和自己的课题结合。 工科的同学重…

LeetCode题练习与总结:验证回文串--125

一、题目描述 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xf…

入职一周感慨

上周太忙了&#xff0c;去打了个球&#xff0c;买了个二手电动车&#xff0c;然后按了个spa。所以忘记吾日三省吾身了&#xff0c;罪孽呀。 本来事情都很顺利的&#xff0c;昨天在工作上&#xff0c;我不小心把cdh集群的主节点ntp remove了&#xff0c;然后重启了所有服务&…

【永久使用】Xshell7+Xftp7免费版安装教程

Xshell7是用来连接linux服务器的软件。 Xftp7是和linux服务器进行文件操作的软件&#xff08;可新增&#xff0c;删除服务器上的文件&#xff09;&#xff0c;可嵌入在Xshell7中运行。 如何安装 先下载安装文件&#xff08;免费获取&#xff09; https://gitee.com/hadluo/…