使用oracle sql profile固定执行计划

2013-02-05 16:19:36
版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。

使用sql profile固定执行计划实验@H_403_14@ 10g之前有outlines,10g之后sql profile作为新特性之一出现。@H_403_14@ 如果针对非绑定变量的sql,outlines则力不从心。

下面是实验过程

  
  
  1. --1.准备阶段
  2. sql>select*fromv$version;
  3. BANNER
  4. ----------------------------------------------------------------
  5. OracleDatabase10gEnterpriseEditionRelease10.2.0.1.0-Prod
  6. PL/sqlRelease10.2.0.1.0-Production
  7. CORE10.2.0.1.0Production
  8. TNSfor32-bitWindows:Version10.2.0.1.0-Production
  9. NLSRTLVersion10.2.0.1.0-Production
  10. sql>createtabletest_raugherasfromdba_objects;
  11. 表已创建。
  12. sql>indexind_objectidontest_raugher(object_id);
  13. 索引已创建。
  14. sql>selectobject_idfromtest_raugherwhererownum<2;
  15. OBJECT_ID
  16. ----------
  17. 20
  18. sql>execdbms_stats.gather_table_stats(user,'TEST_RAUGHER',cascade=>true);
  19. PL/sql过程已成功完成。
  20. --原sql执行计划
  21. sql>setautottraceexplain
  22. sql>whereobject_id=20;
  23. 执行计划
  24. ----------------------------------------------------------
  25. Planhashvalue:800879874
  26. --------------------------------------------------------------------------------------------
  27. |Id|Operation|Name|Rows|Bytes|Cost(%cpu)|Time|
  28. --------------------------------------------------------------------------------------------
  29. |0|SELECTSTATEMENT||1|95|2(0)|00:00:01|
  30. |1|TABLEACCESSBYINDEXROWID|TEST_RAUGHER|1|95|2(0)|00:00:01|
  31. |*2|INDEXRANGESCAN|IND_OBJECTID|1||1(0)|00:00:01|
  32. --------------------------------------------------------------------------------------------
  33. PredicateInformation(identifiedbyoperationid):
  34. ---------------------------------------------------
  35. 2-access("OBJECT_ID"=20)
  36. sql>
  37. --新sql执行计划
  38. sql>select/*+full(test_raugher)*/*whereobject_id=20;
  39. 执行计划
  40. ----------------------------------------------------------
  41. Planhashvalue:3725671026
  42. ----------------------------------------------------------------------------------
  43. |Id|Operation|Time|
  44. ----------------------------------------------------------------------------------
  45. |0|SELECTSTATEMENT||1|95|166(2)|00:00:02|
  46. |*1|FULL|TEST_RAUGHER|1|95|166(2)|00:00:02|
  47. ----------------------------------------------------------------------------------
  48. PredicateInformation(identified@H_403_487@---------------------------------------------------
  49. 1-filter("OBJECT_ID"=20)
  50. --2.获取sqlsql_id
  51. sql>colsql_idfora20
  52. sql>colsql_textfora100
  53. sql>selectsql_id,sql_textfromv$sqlwheresql_textlike'%full(test_raugher)%';
  54. sql_IDsql_TEXT
  55. ------------------------------------------------------------------------------------------------------------------------
  56. 5nkhk378705z3like'%full(test_raugher)%'
  57. g23hbdmcsdahcwhereobject_id=20
  58. dqp79vx5pmw0kEXPLAINPLANSETSTATEMENT_ID='PLUS4294967295'FORfromtest_raug
  59. herwhereobject_id=20
  60. --3.获取sql的outline
  61. sql>setpagesize1000
  62. sql>fromtable(dbms_xplan.display_cursor('g23hbdmcsdahc',null,'outline'));
  63. PLAN_TABLE_OUTPUT
  64. -----------------------------------------------------------------------------------------------
  65. -----------------------------------------------------------------------------------------------
  66. sql_IDg23hbdmcsdahc,childnumber0
  67. -------------------------------------
  68. whereobject_id=20
  69. Planhashvalue:3725671026
  70. ----------------------------------------------------------------------------------
  71. |Id|Operation|@H_403_487@----------------------------------------------------------------------------------
  72. |0|SELECTSTATEMENT||||166(100)||
  73. |*1|FULL|TEST_RAUGHER|1|95|166(2)|00:00:02|
  74. ----------------------------------------------------------------------------------
  75. OutlineData
  76. -------------
  77. /*+
  78. BEGIN_OUTLINE_DATA
  79. IGNORE_OPTIM_EMBEDDED_HINTS
  80. OPTIMIZER_FEATURES_ENABLE('10.2.0.1')
  81. ALL_ROWS
  82. OUTLINE_LEAF(@"SEL$1")
  83. FULL(@"SEL$1""TEST_RAUGHER"@"SEL$1")
  84. END_OUTLINE_DATA
  85. */
  86. PredicateInformation(identified@H_403_487@---------------------------------------------------
  87. 1-filter("OBJECT_ID"=20)
  88. 已选择31行。
  89. --4.创建sqlprofile(sqlPROFILE_001)
  90. sql>declare
  91. 2v_hintssys.sqlprof_attr;
  92. 3begin
  93. 4v_hints:=sys.sqlprof_attr(
  94. 5'BEGIN_OUTLINE_DATA',
  95. 6'IGNORE_OPTIM_EMBEDDED_HINTS',
  96. 7'OPTIMIZER_FEATURES_ENABLE(''10.2.0.1'')',
  97. 8'ALL_ROWS',
  98. 9'OUTLINE_LEAF(@"SEL$1")',
  99. 10'FULL(@"SEL$1""TEST_RAUGHER"@"SEL$1")',
  100. 11'END_OUTLINE_DATA');
  101. 12dbms_sqltune.import_sql_profile(
  102. 13'select*fromtest_raugherwhereobject_id=20',
  103. 14v_hints,'sqlPROFILE_001',
  104. 15force_match=>true,replace=>false);
  105. 16end;
  106. 17/
  107. PL/sql过程已成功完成。
  108. --5.查看是否使用sqlprofile
  109. sql>setautottraceexplain
  110. sql>@H_403_487@---------------------------------------------------
  111. 1-filter("OBJECT_ID"=20)
  112. Note
  113. -----
  114. -sqlprofile"sqlPROFILE_001"usedforthisstatement
  115. sql>whereobject_id=200;
  116. 执行计划
  117. ---------------------------------------------------
  118. 1-filter("OBJECT_ID"=200)
  119. Note
  120. forthisstatement

创建sql profile

   
   
  • DBMS_sqlTUNE.IMPORT_sql_PROFILE(
  • sql_text=>'FULLQUERYTEXT',
  • profile=>sqlprof_attr('HINTSPECIFICATIONWITHFULLOBJECTALIASES'),
  • name=>'PROFILENAME',
  • force_match=>TRUE/FALSE,
  • FALSE);
  • sql_text用于指定sql的全文本,可查询V$sqlAREA.sql_FULLTEXT或DBA_HIST_sqlTEXT.sql_TEXT获得。 

    删除sql proflie

       
       
  • BEGIN
  • DBMS_sqlTUNE.DROP_sql_PROFILE(name=>'PROFILENAME');
  • END;
  • / @H_403_14@
  • sql profile相关视图

    SELECTname,created,category,sql_Textfromdba_sql_profilesORDERBYcreatedDESC;
       
       
  • SELECTsql_attr.attr_valoutline_hints
  • FROMdba_sql_profilessql_profiles,sys.sqlPROF$ATTRsql_attr
  • WHEREsql_profiles.signature=sql_attr.signature
  • ANDsql_profiles.name='sqlPROFILE_001'
  • BYsql_attr.attr#ASC;
  • 相关文章

    数据库版本:11.2.0.4 RAC(1)问题现象从EM里面可以看到,在23号早上8:45~8:55时,数据库等待会话暴增...
    (一)问题背景最近在对一个大约200万行数据的表查看执行计划时,发现存在异常,理论上应该返回100多万...
    (一)删除备份--DELETE命令用于删除RMAN备份记录及相应的物理文件。当使用RMAN执行备份操作时,会在RM...
    (1)DRA介绍 数据恢复顾问(Data Recovery Advise)是一个诊断和修复数据库的工具,DRA能够修复数据文...
    RMAN(Recovery Manager)是Oracle恢复管理器的简称,是集数据库备份(backup)、修复(restore)和恢复...
    (1)备份对象 可以使用RMAN进行的备份对象如下: --整个数据库:备份所有的数据文件和控制文件; --数...