创建测试表

SQL> create table test as select from dba_objects;

Table created.

SQL> insert into test select
from test;

86301 rows created.

SQL> insert into test select from test;

172602 rows created.

SQL> insert into test select
from test;

345204 rows created.

执行测试语句

  1. SQL> set autot on
  2. SQL> var c varchar2(10)
  3. SQL> exec :c :='SYS'
  4. PL/SQL procedure successfully completed.
  5. SQL> select sum(OBJECT_ID) from test where owner=:c;
  6. SUM(OBJECT_ID)
  7. --------------
  8. 1.0168E+10
  9. Execution Plan
  10. ----------------------------------------------------------
  11. Plan hash value: 1420412369
  12. -----------------------------------------------------------------------------------------------
  13. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  14. -----------------------------------------------------------------------------------------------
  15. | 0 | SELECT STATEMENT | | 1 | 11 | 253 (0)| 00:00:04 |
  16. | 1 | SORT AGGREGATE | | 1 | 11 | | |
  17. | 2 | TABLE ACCESS BY INDEX ROWID| TEST | 8698 | 95678 | 253 (0)| 00:00:04 |
  18. |* 3 | INDEX RANGE SCAN | IDX_TEST_OWNER | 8698 | | 21 (0)| 00:00:01 |
  19. -----------------------------------------------------------------------------------------------
  20. Predicate Information (identified by operation id):
  21. ---------------------------------------------------
  22. 3 - access("OWNER"=:C)
  23. Statistics
  24. ----------------------------------------------------------
  25. 0 recursive calls
  26. 0 db block gets
  27. 9830 consistent gets
  28. 0 physical reads
  29. 0 redo size
  30. 537 bytes sent via SQL*Net to client
  31. 524 bytes received via SQL*Net from client
  32. 2 SQL*Net roundtrips to/from client
  33. 0 sorts (memory)
  34. 0 sorts (disk)
  35. 1 rows processed
  36. SQL> select /*+ full(test) */sum(OBJECT_ID) from test where owner=:c;
  37. SUM(OBJECT_ID)
  38. --------------
  39. 1.0168E+10
  40. Execution Plan
  41. ----------------------------------------------------------
  42. Plan hash value: 1950795681
  43. ---------------------------------------------------------------------------
  44. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  45. ---------------------------------------------------------------------------
  46. | 0 | SELECT STATEMENT | | 1 | 11 | 669 (1)| 00:00:09 |
  47. | 1 | SORT AGGREGATE | | 1 | 11 | | |
  48. |* 2 | TABLE ACCESS FULL| TEST | 8698 | 95678 | 669 (1)| 00:00:09 |
  49. ---------------------------------------------------------------------------
  50. Predicate Information (identified by operation id):
  51. ---------------------------------------------------
  52. 2 - filter("OWNER"=:C)
  53. Statistics
  54. ----------------------------------------------------------
  55. 1 recursive calls
  56. 0 db block gets
  57. 9830 consistent gets
  58. 0 physical reads
  59. 0 redo size
  60. 537 bytes sent via SQL*Net to client
  61. 524 bytes received via SQL*Net from client
  62. 2 SQL*Net roundtrips to/from client
  63. 0 sorts (memory)
  64. 0 sorts (disk)
  65. 1 rows processed

找到语句相关信息

  1. SQL> SELECT SQL_ID, PLAN_HASH_VALUE, SQL_TEXT FROM V$SQLAREA WHERE SQL_TEXT LIKE '%owner=:c%';
  2. SQL_ID PLAN_HASH_VALUE
  3. ------------- ---------------
  4. SQL_TEXT
  5. --------------------------------------------------------------------------------
  6. 4t3mf9trnnm7q 1950795681
  7. select sum(OBJECT_ID) from test where owner=:c
  8. 3jj8pqrprp35c 232555890
  9. SELECT SQL_ID, PLAN_HASH_VALUE, SQL_TEXT FROM V$SQLAREA WHERE SQL_TEXT LIKE '%ow
  10. ner=:c%'
  11. 015uu3n2hg575 1950795681
  12. select /*+ full(test) */sum(OBJECT_ID) from test where owner=:c


使用outline找到oracle生成的hint信息(红色部分)
SQL> select plan_table_output from table(dbms_xplan.display_cursor(‘&sql_id’,null,format=> ‘+OUTLINE’));
Enter value for sql_id: 015uu3n2hg575
old 1: select plan_table_output from table(dbms_xplan.display_cursor(‘&sql_id’,null,format=> ‘+OUTLINE’))
new 1: select plan_table_output from table(dbms_xplan.display_cursor(‘015uu3n2hg575’,null,format=> ‘+OUTLINE’))

PLAN_TABLE_OUTPUT
————————————————————————————————————————
SQL_ID 015uu3n2hg575, child number 0
——————————————————-
select /+ full(test) /sum(OBJECT_ID) from test where owner=:c

Plan hash value: 1950795681

—————————————————————————————————————-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
—————————————————————————————————————-
| 0 | SELECT STATEMENT | | | | 670 (100)| |
| 1 | SORT AGGREGATE | | 1 | 11 | | |
| 2 | TABLE ACCESS FULL| TEST | 76370 | 820K| 670 (1)| 00:00:09 |
—————————————————————————————————————-

Outline Data
——————-

/
+
BEGIN_OUTLINE_DATA
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE(‘11.2.0.4’)
DB_VERSION(‘11.2.0.4’)

PLAN_TABLE_OUTPUT
————————————————————————————————————————
ALL_ROWS
OUTLINE_LEAF(@”SEL$1”)
FULL(@”SEL$1” “TEST”@”SEL$1”)
END_OUTLINE_DATA
*/

Predicate Information (identified by operation id):
—————————————————————————-

2 - filter(“OWNER”=:C)

锁定执行计划


SQL> DECLARE
2 SQLFTEXT CLOB;
3 BEGIN
4 SELECT SQL_FULLTEXT INTO SQL_FTEXT FROM V$SQLAREA WHERE SQL_ID = ‘&sql_id’;
5

6 DBMS_SQLTUNE.IMPORT_SQL_PROFILE(
7 SQL_TEXT => SQL_FTEXT,
8 PROFILE => SQLPROF_ATTR(‘ ALL_ROWS OUTLINE_LEAF(@”SEL$1”) FULL(@”SEL$1” “TEST”@”SEL$1”)‘),
9 NAME => ‘PROFILE
&sqlid’,
10 REPLACE => TRUE,
11 FORCE_MATCH => TRUE
12 );
13 END;
14 /
Enter value for sql_id: 4t3mf9trnnm7q
old 4: SELECT SQL_FULLTEXT INTO SQL_FTEXT FROM V$SQLAREA WHERE SQL_ID = ‘&sql_id’;
new 4: SELECT SQL_FULLTEXT INTO SQL_FTEXT FROM V$SQLAREA WHERE SQL_ID = ‘4t3mf9trnnm7q’;
Enter value for sql_id: 4t3mf9trnnm7q
old 9: NAME => ‘PROFILE
&sql_id’,
new 9: NAME => ‘PROFILE_4t3mf9trnnm7q’,

PL/SQL procedure successfully completed.


验证

  1. SQL> var c varchar2(20)
  2. SQL> exec :c :='SYS'
  3. PL/SQL procedure successfully completed.
  4. SQL> select sum(OBJECT_ID) from test where owner=:c;
  5. SUM(OBJECT_ID)
  6. --------------
  7. 1.0168E+10
  8. Execution Plan
  9. ----------------------------------------------------------
  10. Plan hash value: 1950795681
  11. ---------------------------------------------------------------------------
  12. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  13. ---------------------------------------------------------------------------
  14. | 0 | SELECT STATEMENT | | 1 | 11 | 669 (1)| 00:00:09 |
  15. | 1 | SORT AGGREGATE | | 1 | 11 | | |
  16. |* 2 | TABLE ACCESS FULL| TEST | 8698 | 95678 | 669 (1)| 00:00:09 |
  17. ---------------------------------------------------------------------------
  18. Predicate Information (identified by operation id):
  19. ---------------------------------------------------
  20. 2 - filter("OWNER"=:C)
  21. Note
  22. -----
  23. - SQL profile "PROFILE_4t3mf9trnnm7q" used for this statement
  24. Statistics
  25. ----------------------------------------------------------
  26. 34 recursive calls
  27. 0 db block gets
  28. 9841 consistent gets
  29. 1 physical reads
  30. 0 redo size
  31. 537 bytes sent via SQL*Net to client
  32. 524 bytes received via SQL*Net from client
  33. 2 SQL*Net roundtrips to/from client
  34. 1 sorts (memory)
  35. 0 sorts (disk)
  36. 1 rows processed

如果有问题,可以禁用或者删除
禁用
EXEC DBMS_SQLTUNE.ALTER_SQL_PROFILE(‘&PROFILE_NAME’,’STATUS’,’DISABLED’);

删除
EXEC DBMS_SQLTUNE.DROP_SQL_PROFILE(‘&PROFILE_NAME’);