使用Oracle sql profile固定执行计划


使用sql profile固定执行计划实验

Oracle 10g之前有outlines,10g之后sql profile作为新特性之一出现。

如果针对非绑定变量的sql,outlines则力不从心。

下面是实验过程

  1. --1.准备阶段
  2. SQL> select * from v$version;
  3. BANNER
  4. ----------------------------------------------------------------
  5. Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
  6. PL/SQL Release 10.2.0.1.0 - Production
  7. CORE 10.2.0.1.0 Production
  8. TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
  9. NLSRTL Version 10.2.0.1.0 - Production
  10. SQL> createtable test_raugher asselect * from dba_objects;
  11. 表已创建。
  12. SQL> createindex ind_objectid on test_raugher(object_id);
  13. 索引已创建。
  14. SQL> select object_id from test_raugher where rownum<2;
  15. OBJECT_ID
  16. ----------
  17. 20
  18. SQL> exec dbms_stats.gather_table_stats(user,'TEST_RAUGHER',cascade=>true);
  19. PL/SQL 过程已成功完成。
  20. --原sql执行计划
  21. SQL> set autot trace explain
  22. SQL> select * from test_raugher where object_id=20;
  23. 执行计划
  24. ----------------------------------------------------------
  25. Plan hash value: 800879874
  26. --------------------------------------------------------------------------------------------
  27. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  28. --------------------------------------------------------------------------------------------
  29. | 0 | SELECT STATEMENT | | 1 | 95 | 2 (0)| 00:00:01 |
  30. | 1 | TABLE ACCESS BYINDEX ROWID| TEST_RAUGHER | 1 | 95 | 2 (0)| 00:00:01 |
  31. |* 2 | INDEX RANGE SCAN | IND_OBJECTID | 1 | | 1 (0)| 00:00:01 |
  32. --------------------------------------------------------------------------------------------
  33. Predicate Information (identified by operation id):
  34. ---------------------------------------------------
  35. 2 - access("OBJECT_ID"=20)
  36. SQL>
  37. --新sql执行计划
  38. SQL> select /*+ full(test_raugher) */ * from test_raugher where object_id=20;
  39. 执行计划
  40. ----------------------------------------------------------
  41. Plan hash value: 3725671026
  42. ----------------------------------------------------------------------------------
  43. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  44. ----------------------------------------------------------------------------------
  45. | 0 | SELECT STATEMENT | | 1 | 95 | 166 (2)| 00:00:02 |
  46. |* 1 | TABLE ACCESS FULL| TEST_RAUGHER | 1 | 95 | 166 (2)| 00:00:02 |
  47. ----------------------------------------------------------------------------------
  48. Predicate Information (identified by operation id):
  49. ---------------------------------------------------
  50. 1 - filter("OBJECT_ID"=20)
  51. --2.获取新sql的sql_id
  52. SQL> col sql_id for a20
  53. SQL> col sql_text for a100
  54. SQL> select sql_id,sql_text from v$sql where sql_text like'%full(test_raugher)%';
  55. SQL_ID SQL_TEXT
  56. -------------------- ----------------------------------------------------------------------------------------------------
  57. 5nkhk378705z3 select sql_id,sql_text from v$sql where sql_text like'%full(test_raugher)%'
  58. g23hbdmcsdahc select /*+ full(test_raugher) */ * from test_raugher where object_id=20
  59. dqp79vx5pmw0k EXPLAIN PLAN SET STATEMENT_ID='PLUS4294967295'FORselect /*+ full(test_raugher) */ * from test_raug
  60. her where object_id=20
  61. --3.获取新sql的outline
  62. SQL> set pagesize 1000
  63. SQL> select * fromtable(dbms_xplan.display_cursor('g23hbdmcsdahc',null,'outline'));
  64. PLAN_TABLE_OUTPUT
  65. -----------------------------------------------------------------------------------------------
  66. -----------------------------------------------------------------------------------------------
  67. SQL_ID g23hbdmcsdahc, child number 0
  68. -------------------------------------
  69. select /*+ full(test_raugher) */ * from test_raugher where object_id=20
  70. Plan hash value: 3725671026
  71. ----------------------------------------------------------------------------------
  72. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  73. ----------------------------------------------------------------------------------
  74. | 0 | SELECT STATEMENT | | | | 166 (100)| |
  75. |* 1 | TABLE ACCESS FULL| TEST_RAUGHER | 1 | 95 | 166 (2)| 00:00:02 |
  76. ----------------------------------------------------------------------------------
  77. Outline Data
  78. -------------
  79. /*+
  80. BEGIN_OUTLINE_DATA
  81. IGNORE_OPTIM_EMBEDDED_HINTS
  82. OPTIMIZER_FEATURES_ENABLE('10.2.0.1')
  83. ALL_ROWS
  84. OUTLINE_LEAF(@"SEL$1")
  85. FULL(@"SEL$1""TEST_RAUGHER"@"SEL$1")
  86. END_OUTLINE_DATA
  87. */
  88. Predicate Information (identified by operation id):
  89. ---------------------------------------------------
  90. 1 - filter("OBJECT_ID"=20)
  91. 已选择31行。
  92. --4.创建sql profile(SQLPROFILE_001)
  93. SQL> declare
  94. 2 v_hints sys.sqlprof_attr;
  95. 3 begin
  96. 4 v_hints:=sys.sqlprof_attr(
  97. 5 'BEGIN_OUTLINE_DATA',
  98. 6 'IGNORE_OPTIM_EMBEDDED_HINTS',
  99. 7 'OPTIMIZER_FEATURES_ENABLE(''10.2.0.1'')',
  100. 8 'ALL_ROWS',
  101. 9 'OUTLINE_LEAF(@"SEL$1")',
  102. 10 'FULL(@"SEL$1" "TEST_RAUGHER"@"SEL$1")',
  103. 11 'END_OUTLINE_DATA');
  104. 12 dbms_sqltune.import_sql_profile(
  105. 13 'select * from test_raugher where object_id=20',
  106. 14 v_hints,'SQLPROFILE_001',
  107. 15 force_match=>true,replace=>false);
  108. 16 end;
  109. 17 /
  110. PL/SQL 过程已成功完成。
  111. --5.查看是否使用sql profile
  112. SQL> set autot trace explain
  113. SQL> select * from test_raugher where object_id=20;
  114. 执行计划
  115. ----------------------------------------------------------
  116. Plan hash value: 3725671026
  117. ----------------------------------------------------------------------------------
  118. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  119. ----------------------------------------------------------------------------------
  120. | 0 | SELECT STATEMENT | | 1 | 95 | 166 (2)| 00:00:02 |
  121. |* 1 | TABLE ACCESS FULL| TEST_RAUGHER | 1 | 95 | 166 (2)| 00:00:02 |
  122. ----------------------------------------------------------------------------------
  123. Predicate Information (identified by operation id):
  124. ---------------------------------------------------
  125. 1 - filter("OBJECT_ID"=20)
  126. Note
  127. -----
  128. - SQL profile "SQLPROFILE_001" used for this statement
  129. SQL> select * from test_raugher where object_id=200;
  130. 执行计划
  131. ----------------------------------------------------------
  132. Plan hash value: 3725671026
  133. ----------------------------------------------------------------------------------
  134. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  135. ----------------------------------------------------------------------------------
  136. | 0 | SELECT STATEMENT | | 1 | 95 | 166 (2)| 00:00:02 |
  137. |* 1 | TABLE ACCESS FULL| TEST_RAUGHER | 1 | 95 | 166 (2)| 00:00:02 |
  138. ----------------------------------------------------------------------------------
  139. Predicate Information (identified by operation id):
  140. ---------------------------------------------------
  141. 1 - filter("OBJECT_ID"=200)
  142. Note
  143. -----
  144. - SQL profile "SQLPROFILE_001" used for this statement
  • 1
  • 2
  • 下一页

相关内容