Oracle 11g系统调优之dbms_sqltune包的使用

前沿:随着数据库版本的提升,Oracle也提供了越来越多的性能诊断工具,针对SQL的调优,DBMS_SQLTUNE就是其中一个比较优秀的包。
DBMS_SQLTUNE最开始是在10G里面出现,11G里面则对其进行了加强,使得其更加符合实际需求。

1.查找系统可能存在问题的SQL

一般什么样的SQL可能会存在性能问题呢?
我们第一时间能想到的肯定是执行时间很长的SQL、其次是IO很高的SQL,这里就针对执行时间很长的SQL来做测试。
获取类似的SQL有多种方法,AWR、ADDR、动态视图等,这里我们就通过动态视图v$session_longops来获取,因为这个视图里面的语句是最近执行的,有比较强的及时性。

以下语句可查询最近数据库中执行时间比较长的SQL,包括执行时间。

点击(此处)折叠或打开

  1. select tt1.sql_text,tt1.sql_fulltext,tt2.sql_id,tt2.sums
  2. from v$sqlarea tt1,
  3. (select sql_id,sum(elapsed_seconds) as sums
  4. from v$session_longops where opname=\'Table Scan\'
  5. group by sql_id
  6. ) tt2
  7. where tt1.sql_id=tt2.sql_id
  8. order by tt2.sums desc;


执行结果如下:
Oracle 11g系统调优之dbms_sqltune包的使用_第1张图片

其中SUMS列为此SQL执行的总时间,上面我主要选取了‘Table Scan’这个类型的操作作为主要的时间损耗,从实际上来看也是如此,表扫描的方式直接关系SQL执行的效率,
表扫描占整个SQL执行时间的比重最大。

从上面,我们选取一条SQL,ID为“3c3ch9a4xdwn1”作为需要优化的SQL。


2.DBMS_SQLTUNE包
DBMS_SQLTUNE包提供了很多的子程序来对SQL进行诊断和对执行计划进行处理,这里我们只是简单的测试一下DBMS_SQLTUNE的调优功能,主要涉及到3个子过程。

DBMS_SQLTUNE.CREATE_TUNING_TASK    #创建一个SQL调优任务

DBMS_SQLTUNE.CREATE_TUNING_TASK(
  sql_id           IN VARCHAR2,                                             ---------->SQL ID,必填项
  plan_hash_value  IN NUMBER    := NULL,                           ----------->执行计划的HASN值(选填)
  scope            IN VARCHAR2  := SCOPE_COMPREHENSIVE,  ----------->任务类型,有limited和comprehensive两种
  time_limit       IN NUMBER    := TIME_LIMIT_DEFAULT,       ----------->此任务最长的执行时间
  task_name        IN VARCHAR2  := NULL,                           ----------->任务名
  description      IN VARCHAR2  := NULL)                             ----------->任务描述
RETURN VARCHAR2;

EXECUTE_TUNING_TASK
                              #执行一个SQL调优任务

DBMS_SQLTUNE.EXECUTE_TUNING_TASK(
   task_name         IN VARCHAR2,                                      ------------>任务名
   execution_name    IN VARCHAR2               := NULL,         ------------>执行时的名称,可为空
   execution_params  IN dbms_advisor.argList   := NULL,        ------------>执行参数,默认可为空
   execution_desc    IN VARCHAR2               := NULL);         ------------>执行描述

DROP_TUNING_TASK                                   #删除一个SQL调优任务


DBMS_SQLTUNE.DROP_TUNING_TASK(
 task_name         IN VARCHAR2);                                      ------------->任务名


ACCEPT_SQL_PROFILE                               #接受及应用一个SQL_PROFILE执行计划给某条SQL


DBMS_SQLTUNE.ACCEPT_SQL_PROFILE (
   task_name    IN  VARCHAR2,                                         -------------->执行优化的任务名
   object_id    IN  NUMBER   := NULL,                                -------------->对象编号,一般不填
   name         IN  VARCHAR2 := NULL,                               -------------->制定的sql_profile名称,如果不填则由系统指派
   description  IN  VARCHAR2 := NULL,                               -------------->该执行计划的描述信息
   category     IN  VARCHAR2 := NULL);                              ------------->需要与该SESSION的sqltune_category参数相匹配
   task_owner   IN VARCHAR2  := NULL,                             ------------->任务的所有者
   replace      IN BOOLEAN   := FALSE,                               ------------->如果此sql_profile已存在,则决定是否替换,默认值为不替换
   force_match  IN BOOLEAN   := FALSE,                           ------------->是否强制匹配此执行计划与所有HASH值相同的SQL,类似CURSOR_SHARING参数的FORCE
   profile_type IN VARCHAR2  := REGULAR_PROFILE);          ------------->sql_profile的类型,默认为REGULAR_PROFILE,可修改为PX_PROFILE,表示此执行计划变更为并行执行


DROP_SQL_PROFILE                                     #删除一个SQL_PROFILE的应用,让系统自动选择

DBMS_SQLTUNE.DROP_SQL_PROFILE (
   name          IN  VARCHAR2,
   ignore        IN  BOOLEAN  := FALSE);



3.具体演示过程

SQL Profile是10g中的新特性,作为自动SQL调整过程的一部分,由Oracle企业管理器来管理。除了OEM,SQL Profile可以通过DBMS_SQLTUNE包来进行管理。

查询优化器有时候会因为缺乏足够的信息,而对一条SQL语句做出错误的估计,生成糟糕的执行计划。而自动SQL调整通过SQL概要分析来解决这个问题,自动调整优化器会生成这条SQL语句的一个概要,称作SQL Profile。它由针对这条语句的一些辅助统计信息组成,通过采样和局部执行技术来确认,必要的话,会调整执行计划中的估计值。在SQL概要分析中,自 动调整优化器还可以通过一条SQL语句的执行历史信息来设置合适的优化器参数,比如将OPTIMIZER_MODE参数由ALL_ROWS改为 FIRST_ROWS。

换句话说,SQL概要是一个对象,它包含了可以帮助查询优化器为一个特定的SQL语句找到高效执行计划的信息。这些信息包括执行环境、对象统计和对查询优 化器所做评估的修正信息。它的最大优点之一就是在不修改SQL语句和会话执行环境的情况下影响查询优化器的决定。(《Oracle性能诊断艺术》)

SQL Profile中包含的并非单个执行计划的信息,必须注意的是,SQL Profile不会固定一个SQL语句的执行计划。当表的数据增长或者索引创建、删除,使用同一个SQL Profile的执行计划可能会改变,而储存在SQL Profile中的信息会继续起作用。然而,经过一段很长的时间之后,它的信息有可能会过时,需要重新生成。

SQL Profile的作用范围由CATEGORY属性来控制,这个属性决定了哪些用户会话可以应用这个概要。你可以从DBA_SQL_PROFILES中的 CATEGORY字段来查看这个属性。默认情况下,所有概要文件都创建为DEFAULT范畴,这意味着所有SQLTUNE_CATEGORY初始化参数为 DEFAULT的用户会话都可以使用这个概要。你可以修改这个属性,比如将其改为DEV,则SQLTUNE_GATEGORY参数为DEV的用户会话才能 使用它,利用这个功能,你可以在一个受限制的环境中来测试一个SQL Profile。


简单来说,Sql_Profile是用来影响数据库执行计划生成的一组信息文件的集合,可以在不改变原有SQL语句的前提下,达到类似HINTS改变其执行计划的目的。


创建一个sqltune的调优任务(即创建sql_profile的相关信息)

点击(此处)折叠或打开

  1. DECLARE
  2. my_task_name VARCHAR2(30);
  3. BEGIN
  4.    my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(
  5.                      sql_id => \'c7py7dtaxnsjm\',
  6.                      scope => \'COMPREHENSIVE\',
  7.                      time_limit => 3600,
  8.                      task_name => \'test_falist_tuning_task1\',
  9.                      description => \'Task to tune a query\');
  10.    DBMS_SQLTUNE.EXECUTE_TUNING_TASK(task_name => \'test_falist_tuning_task1\');
  11. END;

记住,DBMS_SQLTUNE.CREATE_TUNING_TASK是一个函数,必须要有返回值。
上面在定义了一个TASK后,可通过DBMS_SQLTUNE.EXECUTE_TUNING_TASK来执行此调优过程。


获取调优任务的详细信息

点击(此处)折叠或打开

  1. select dbms_sqltune.report_tuning_task(\'test_falist_tuning_task1\') from dual;

可通过dbms_sqltune.report_tuning_task,输入任务名,及可获取调优的相关信息,如下:

点击(此处)折叠或打开

  1. GENERAL INFORMATION SECTION
  2. -------------------------------------------------------------------------------
  3. Tuning Task Name : test_falist_tuning_task1
  4. Tuning Task Owner : BOLAN
  5. Workload Type : Single SQL Statement
  6. Scope : COMPREHENSIVE
  7. Time Limit(seconds): 3600
  8. Completion Status : COMPLETED
  9. Started at : 03/16/2015 21:03:11
  10. Completed at : 03/16/2015 21:04:04
  11. -------------------------------------------------------------------------------
  12. Schema Name: BOLAN
  13. SQL ID : b950haw425cq7
  14. SQL Text : SELECT C.*,D.CONTENT FROM (SELECT OBJECTID, TITLE, EDITTIME,
  15. SUBSTR(INTRO, :\"SYS_B_0\", :\"SYS_B_1\") || :\"SYS_B_2\" AS INTRO,
  16. KEYNAME, R
  17. FROM (SELECT FIE_FINANCECONTENT.OBJECTID,
  18. FIE_FINANCECONTENT.TITLE,
  19. TO_CHAR(FIE_FINANCECONTENT.DISPLAYTIME,
  20. :\"SYS_B_3\") AS EDITTIME,
  21. FIE_FINANCECONTENT.INTRO,
  22. BASE_OBJKEY.KEYNAME,
  23. ROW_NUMBER() OVER(PARTITION BY
  24. BASE_OBJKEY.KEYNAME ORDER BY FIE_FINANCECONTENT.DISPLAYTIME
  25. DESC) R
  26. FROM FIE_FINANCECONTENT
  27. INNER JOIN BASE_OBJ
  28. ON FIE_FINANCECONTENT.OBJECTID = BASE_OBJ.OBJECTID
  29. INNER JOIN BASE_OBJKEY
  30. ON BASE_OBJ.OBJECTID = BASE_OBJKEY.OBJECTID
  31. left join base_cateobj
  32. on base_cateobj.objectid = BASE_OBJKEY.OBJECTID
  33. WHERE BASE_OBJ.STATUS = :\"SYS_B_4\"
  34. AND (base_cateobj.CATEGORYID LIKE :\"SYS_B_5\" OR
  35. base_cateobj.CATEGORYID LIKE :\"SYS_B_6\")
  36. AND BASE_OBJKEY.SECURITYID IS NOT NULL
  37. ORDER BY FIE_FINANCECONTENT.DISPLAYTIME DESC) B
  38. WHERE R < :\"SYS_B_7\")C
  39. INNER JOIN FIE_OBJCONTENT D
  40. ON C.OBJECTID =D.OBJECTID
  41. Bind Variables :
  42. 5 - (VARCHAR2(32)):4
  43. 6 - (VARCHAR2(32)):000200010022%
  44. 7 - (VARCHAR2(32)):000100020008%
  45. 8 - (NUMBER):11
  46. -------------------------------------------------------------------------------
  47. FINDINGS SECTION (1 finding)
  48. -------------------------------------------------------------------------------
  49. 1- SQL Profile Finding (see explain plans section below)
  50. --------------------------------------------------------
  51. 为此语句找到了性能更好的执行计划 2。选择以下 SQL 概要文件之一进行实施。
  52. Recommendation (estimated benefit: 75.32%)
  53. ------------------------------------------
  54. - 考虑接受推荐的 SQL 概要文件。
  55. execute dbms_sqltune.accept_sql_profile(task_name =>
  56. \'test_falist_tuning_task1\', task_owner => \'BOLAN\', replace =>
  57. TRUE);
  58. Recommendation (estimated benefit: 99.89%)
  59. ------------------------------------------
  60. - 考虑接受建议的 SQL 概要文件, 以便对此语句使用并行执行。
  61. execute dbms_sqltune.accept_sql_profile(task_name =>
  62. \'test_falist_tuning_task1\', task_owner => \'BOLAN\', replace =>
  63. TRUE, profile_type => DBMS_SQLTUNE.PX_PROFILE);
  64. 与 DOP 64 并行执行此查询会使 SQL 概要文件计划上的响应时间缩短 99.56%。但是, 启用并行执行时要付出一些代价。它将增加语句的资源消耗
  65. (预计为 72.07%), 这会导致系统吞吐量降低。此外, 由于在非常短的持续时间内消耗了这些资源, 因此如果没有足够可用的硬件容量,
  66. 并发语句的响应时间将受到负面影响。
  67. The following data shows some sampled statistics for this SQL from the past
  68. week and projected weekly values when parallel execution is enabled.
  69. Past week sampled statistics for this SQL
  70. -----------------------------------------
  71. Number of executions 0
  72. Percent of total activity 0
  73. Percent of samples with #Active Sessions > 2*CPU 0
  74. Weekly DB time (in sec) 0
  75. Projected statistics with Parallel Execution
  76. --------------------------------------------
  77. Weekly DB time (in sec) 0
  78. -------------------------------------------------------------------------------
  79. ADDITIONAL INFORMATION SECTION
  80. -------------------------------------------------------------------------------
  81. - 优化程序不能合并位于执行计划的行 ID 2 处的视图。. 优化程序不能合并包含窗口函数的视图。.
  82. -------------------------------------------------------------------------------
  83. EXPLAIN PLANS SECTION
  84. -------------------------------------------------------------------------------
  85. 1- Original With Adjusted Cost
  86. ------------------------------
  87. Plan hash value: 3849921461
  88. -----------------------------------------------------------------------------------------------------------
  89. | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
  90. -----------------------------------------------------------------------------------------------------------
  91. | 0 | SELECT STATEMENT | | 19M| 29G| | 4732K (1)| 15:46:36 |
  92. |* 1 | HASH JOIN | | 19M| 29G| 17G| 4732K (1)| 15:46:36 |
  93. |* 2 | VIEW | | 19M| 17G| | 3591K (1)| 11:58:18 |
  94. | 3 | SORT ORDER BY | | 19M| 6717M| 7046M| 3591K (1)| 11:58:18 |
  95. |* 4 | WINDOW SORT PUSHED RANK | | 19M| 6717M| 7046M| 3591K (1)| 11:58:18 |
  96. |* 5 | HASH JOIN | | 19M| 6717M| 3462M| 583K (1)| 01:56:43 |
  97. |* 6 | HASH JOIN | | 20M| 3223M| 3186M| 356K (1)| 01:11:22 |
  98. |* 7 | FILTER | | | | | | |
  99. |* 8 | HASH JOIN OUTER | | 24M| 2903M| 61M| 136K (2)| 00:27:24 |
  100. |* 9 | TABLE ACCESS FULL | BASE_OBJKEY | 1049K| 49M| | 21955 (1)| 00:04:24 |
  101. | 10 | INDEX FAST FULL SCAN| PK_BASE_CATEOBJ | 14M| 1048M| | 49157 (1)| 00:09:50 |
  102. |* 11 | TABLE ACCESS FULL | BASE_OBJ | 2650K| 98M| | 55175 (1)| 00:11:03 |
  103. | 12 | TABLE ACCESS FULL | FIE_FINANCECONTENT | 2345K| 431M| | 32203 (1)| 00:06:27 |
  104. | 13 | TABLE ACCESS FULL | FIE_OBJCONTENT | 4208K| 2600M| | 134K (1)| 00:26:57 |
  105. -----------------------------------------------------------------------------------------------------------
  106. Predicate Information (identified by operation id):
  107. ---------------------------------------------------
  108. 1 - access(\"OBJECTID\"=\"D\".\"OBJECTID\")
  109. 2 - filter(\"R\"<:sys_b_7>
  110. 4 - filter(ROW_NUMBER() OVER ( PARTITION BY \"BASE_OBJKEY\".\"KEYNAME\" ORDER BY
  111. INTERNAL_FUNCTION(\"FIE_FINANCECONTENT\".\"DISPLAYTIME\") DESC )<:sys_b_7>
  112. 5 - access(\"FIE_FINANCECONTENT\".\"OBJECTID\"=\"BASE_OBJ\".\"OBJECTID\")
  113. 6 - access(\"BASE_OBJ\".\"OBJECTID\"=\"BASE_OBJKEY\".\"OBJECTID\")
  114. 7 - filter(\"BASE_CATEOBJ\".\"CATEGORYID\" LIKE :SYS_B_5 OR \"BASE_CATEOBJ\".\"CATEGORYID\" LIKE
  115. :SYS_B_6)
  116. 8 - access(\"BASE_CATEOBJ\".\"OBJECTID\"(+)=\"BASE_OBJKEY\".\"OBJECTID\")
  117. 9 - filter(\"BASE_OBJKEY\".\"SECURITYID\" IS NOT NULL)
  118. 11 - filter(\"BASE_OBJ\".\"STATUS\"=:SYS_B_4)
  119. 2- Using SQL Profile
  120. --------------------
  121. Plan hash value: 770845823
  122. ----------------------------------------------------------------------------------------------------------
  123. | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
  124. ----------------------------------------------------------------------------------------------------------
  125. | 0 | SELECT STATEMENT | | 2998K| 4486M| | 1167K (1)| 03:53:33 |
  126. |* 1 | HASH JOIN | | 2998K| 4486M| 2648M| 1167K (1)| 03:53:33 |
  127. | 2 | TABLE ACCESS FULL | FIE_OBJCONTENT | 4208K| 2600M| | 134K (1)| 00:26:57 |
  128. |* 3 | VIEW | | 2997K| 2632M| | 769K (1)| 02:33:53 |
  129. | 4 | SORT ORDER BY | | 2997K| 1014M| | 769K (1)| 02:33:53 |
  130. |* 5 | WINDOW SORT PUSHED RANK | | 2997K| 1014M| | 769K (1)| 02:33:53 |
  131. | 6 | CONCATENATION | | | | | | |
  132. |* 7 | FILTER | | | | | | |
  133. |* 8 | HASH JOIN OUTER | | 119K| 40M| 278M| 270K (1)| 00:54:01 |
  134. |* 9 | HASH JOIN | | 997K| 267M| 100M| 146K (1)| 00:29:19 |
  135. |* 10 | HASH JOIN | | 1049K| 88M| 61M| 86580 (1)| 00:17:19 |
  136. |* 11 | TABLE ACCESS FULL | BASE_OBJKEY | 1049K| 49M| | 21955 (1)| 00:04:24 |
  137. |* 12 | TABLE ACCESS FULL | BASE_OBJ | 2650K| 98M| | 55175 (1)| 00:11:03 |
  138. | 13 | TABLE ACCESS FULL | FIE_FINANCECONTENT | 2345K| 431M| | 32203 (1)| 00:06:27 |
  139. | 14 | INDEX FAST FULL SCAN| PK_BASE_CATEOBJ | 14M| 1048M| | 49157 (1)| 00:09:50 |
  140. |* 15 | FILTER | | | | | | |
  141. |* 16 | HASH JOIN OUTER | | 2878K| 974M| 278M| 270K (1)| 00:54:01 |
  142. |* 17 | HASH JOIN | | 997K| 267M| 100M| 146K (1)| 00:29:19 |
  143. |* 18 | HASH JOIN | | 1049K| 88M| 61M| 86580 (1)| 00:17:19 |
  144. |* 19 | TABLE ACCESS FULL | BASE_OBJKEY | 1049K| 49M| | 21955 (1)| 00:04:24 |
  145. |* 20 | TABLE ACCESS FULL | BASE_OBJ | 2650K| 98M| | 55175 (1)| 00:11:03 |
  146. | 21 | TABLE ACCESS FULL | FIE_FINANCECONTENT | 2345K| 431M| | 32203 (1)| 00:06:27 |
  147. | 22 | INDEX FAST FULL SCAN| PK_BASE_CATEOBJ | 14M| 1048M| | 49157 (1)| 00:09:50 |
  148. ----------------------------------------------------------------------------------------------------------
  149. Predicate Information (identified by operation id):
  150. ---------------------------------------------------
  151. 1 - access(\"OBJECTID\"=\"D\".\"OBJECTID\")
  152. 3 - filter(\"R\"<:sys_b_7>
  153. 5 - filter(ROW_NUMBER() OVER ( PARTITION BY \"BASE_OBJKEY\".\"KEYNAME\" ORDER BY
  154. INTERNAL_FUNCTION(\"FIE_FINANCECONTENT\".\"DISPLAYTIME\") DESC )<:sys_b_7>
  155. 7 - filter(\"BASE_CATEOBJ\".\"CATEGORYID\" LIKE :SYS_B_6)
  156. 8 - access(\"BASE_CATEOBJ\".\"OBJECTID\"(+)=\"BASE_OBJKEY\".\"OBJECTID\")
  157. 9 - access(\"FIE_FINANCECONTENT\".\"OBJECTID\"=\"BASE_OBJ\".\"OBJECTID\")
  158. 10 - access(\"BASE_OBJ\".\"OBJECTID\"=\"BASE_OBJKEY\".\"OBJECTID\")
  159. 11 - filter(\"BASE_OBJKEY\".\"SECURITYID\" IS NOT NULL)
  160. 12 - filter(\"BASE_OBJ\".\"STATUS\"=:SYS_B_4)
  161. 15 - filter(\"BASE_CATEOBJ\".\"CATEGORYID\" LIKE :SYS_B_5 AND LNNVL(\"BASE_CATEOBJ\".\"CATEGORYID\"
  162. LIKE :SYS_B_6))
  163. 16 - access(\"BASE_CATEOBJ\".\"OBJECTID\"(+)=\"BASE_OBJKEY\".\"OBJECTID\")
  164. 17 - access(\"FIE_FINANCECONTENT\".\"OBJECTID\"=\"BASE_OBJ\".\"OBJECTID\")
  165. 18 - access(\"BASE_OBJ\".\"OBJECTID\"=\"BASE_OBJKEY\".\"OBJECTID\")
  166. 19 - filter(\"BASE_OBJKEY\".\"SECURITYID\" IS NOT NULL)
  167. 20 - filter(\"BASE_OBJ\".\"STATUS\"=:SYS_B_4)
  168. 3- Using Parallel Execution
  169. ---------------------------
  170. Plan hash value: 89272180
  171. --------------------------------------------------------------------------------------------------------------------------------------------------------
  172. | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
  173. --------------------------------------------------------------------------------------------------------------------------------------------------------
  174. | 0 | SELECT STATEMENT | | 146K| 219M| | 5095 (1)| 00:01:02 | | | |
  175. | 1 | PX COORDINATOR | | | | | | | | | |
  176. | 2 | PX SEND QC (RANDOM) | :TQ10010 | 146K| 219M| | 5095 (1)| 00:01:02 | Q1,10 | P->S | QC (RAND) |
  177. |* 3 | HASH JOIN BUFFERED | | 146K| 219M| | 5095 (1)| 00:01:02 | Q1,10 | PCWP | |
  178. | 4 | JOIN FILTER CREATE | :BF0000 | 146K| 128M| | 2758 (1)| 00:00:34 | Q1,10 | PCWP | |
  179. | 5 | PX RECEIVE | | 146K| 128M| | 2758 (1)| 00:00:34 | Q1,10 | PCWP | |
  180. | 6 | PX SEND HASH | :TQ10008 | 146K| 128M| | 2758 (1)| 00:00:34 | Q1,08 | P->P | HASH |
  181. |* 7 | VIEW | | 146K| 128M| | 2758 (1)| 00:00:34 | Q1,08 | PCWP | |
  182. | 8 | SORT ORDER BY | | 146K| 49M| 1022M| 2758 (1)| 00:00:34 | Q1,08 | PCWP | |
  183. | 9 | PX RECEIVE | | 146K| 49M| | 2758 (1)| 00:00:34 | Q1,08 | PCWP | |
  184. | 10 | PX SEND RANGE | :TQ10007 | 146K| 49M| | 2758 (1)| 00:00:34 | Q1,07 | P->P | RANGE |
  185. |* 11 | WINDOW SORT | | 146K| 49M| 1022M| 2758 (1)| 00:00:34 | Q1,07 | PCWP | |
  186. | 12 | PX RECEIVE | | 146K| 49M| | 2758 (1)| 00:00:34 | Q1,07 | PCWP | |
  187. | 13 | PX SEND HASH | :TQ10006 | 146K| 49M| | 2758 (1)| 00:00:34 | Q1,06 | P->P | HASH |
  188. |* 14 | WINDOW CHILD PUSHED RANK | | 146K| 49M| | 2758 (1)| 00:00:34 | Q1,06 | PCWP | |
  189. |* 15 | FILTER | | | | | | | Q1,06 | PCWC | |
  190. |* 16 | HASH JOIN OUTER | | 146K| 49M| | 2753 (1)| 00:00:34 | Q1,06 | PCWP | |
  191. | 17 | PX RECEIVE | | 997K| 267M| | 1897 (1)| 00:00:23 | Q1,06 | PCWP | |
  192. | 18 | PX SEND HASH | :TQ10004 | 997K| 267M| | 1897 (1)| 00:00:23 | Q1,04 | P->P | HASH |
  193. |* 19 | HASH JOIN BUFFERED | | 997K| 267M| | 1897 (1)| 00:00:23 | Q1,04 | PCWP | |
  194. | 20 | JOIN FILTER CREATE | :BF0001 | 1049K| 88M| | 1338 (1)| 00:00:17 | Q1,04 | PCWP | |
  195. | 21 | PX RECEIVE | | 1049K| 88M| | 1338 (1)| 00:00:17 | Q1,04 | PCWP | |
  196. | 22 | PX SEND HASH | :TQ10002 | 1049K| 88M| | 1338 (1)| 00:00:17 | Q1,02 | P->P | HASH |
  197. |* 23 | HASH JOIN BUFFERED | | 1049K| 88M| | 1338 (1)| 00:00:17 | Q1,02 | PCWP | |
  198. | 24 | JOIN FILTER CREATE | :BF0002 | 1049K| 49M| | 381 (1)| 00:00:05 | Q1,02 | PCWP | |
  199. | 25 | PX RECEIVE | | 1049K| 49M| | 381 (1)| 00:00:05 | Q1,02 | PCWP | |
  200. | 26 | PX SEND HASH | :TQ10000 | 1049K| 49M| | 381 (1)| 00:00:05 | Q1,00 | P->P | HASH |
  201. | 27 | PX BLOCK ITERATOR | | 1049K| 49M| | 381 (1)| 00:00:05 | Q1,00 | PCWC | |
  202. |* 28 | TABLE ACCESS FULL| BASE_OBJKEY | 1049K| 49M| | 381 (1)| 00:00:05 | Q1,00 | PCWP | |
  203. | 29 | PX RECEIVE | | 2650K| 98M| | 957 (1)| 00:00:12 | Q1,02 | PCWP | |
  204. | 30 | PX SEND HASH | :TQ10001 | 2650K| 98M| | 957 (1)| 00:00:12 | Q1,01 | P->P | HASH |
  205. | 31 | JOIN FILTER USE | :BF0002 | 2650K| 98M| | 957 (1)| 00:00:12 | Q1,01 | PCWP | |
  206. | 32 | PX BLOCK ITERATOR | | 2650K| 98M| | 957 (1)| 00:00:12 | Q1,01 | PCWC | |
  207. |* 33 | TABLE ACCESS FULL| BASE_OBJ | 2650K| 98M| | 957 (1)| 00:00:12 | Q1,01 | PCWP | |
  208. | 34 | PX RECEIVE | | 2345K| 431M| | 558 (1)| 00:00:07 | Q1,04 | PCWP | |
  209. | 35 | PX SEND HASH | :TQ10003 | 2345K| 431M| | 558 (1)| 00:00:07 | Q1,03 | P->P | HASH |
  210. | 36 | JOIN FILTER USE | :BF0001 | 2345K| 431M| | 558 (1)| 00:00:07 | Q1,03 | PCWP | |
  211. | 37 | PX BLOCK ITERATOR | | 2345K| 431M| | 558 (1)| 00:00:07 | Q1,03 | PCWC | |
  212. |* 38 | TABLE ACCESS FULL | FIE_FINANCECONTENT | 2345K| 431M| | 558 (1)| 00:00:07 | Q1,03 | PCWP | |
  213. | 39 | PX RECEIVE | | 14M| 1048M| | 853 (1)| 00:00:11 | Q1,06 | PCWP | |
  214. | 40 | PX SEND HASH | :TQ10005 | 14M| 1048M| | 853 (1)| 00:00:11 | Q1,05 | P->P | HASH |
  215. | 41 | PX BLOCK ITERATOR | | 14M| 1048M| | 853 (1)| 00:00:11 | Q1,05 | PCWC | |
  216. | 42 | INDEX FAST FULL SCAN | PK_BASE_CATEOBJ | 14M| 1048M| | 853 (1)| 00:00:11 | Q1,05 | PCWP | |
  217. | 43 | PX RECEIVE | | 4208K| 2600M| | 2336 (1)| 00:00:29 | Q1,10 | PCWP | |
  218. | 44 | PX SEND HASH | :TQ10009 | 4208K| 2600M| | 2336 (1)| 00:00:29 | Q1,09 | P->P | HASH |
  219. | 45 | JOIN FILTER USE | :BF0000 | 4208K| 2600M| | 2336 (1)| 00:00:29 | Q1,09 | PCWP | |
  220. | 46 | PX BLOCK ITERATOR | | 4208K| 2600M| | 2336 (1)| 00:00:29 | Q1,09 | PCWC | |
  221. |* 47 | TABLE ACCESS FULL | FIE_OBJCONTENT | 4208K| 2600M| | 2336 (1)| 00:00:29 | Q1,09 | PCWP | |
  222. --------------------------------------------------------------------------------------------------------------------------------------------------------
  223. Predicate Information (identified by operation id):
  224. ---------------------------------------------------
  225. 3 - access(\"OBJECTID\"=\"D\".\"OBJECTID\")
  226. 7 - filter(\"R\"<:sys_b_7>
  227. 11 - filter(ROW_NUMBER() OVER ( PARTITION BY \"BASE_OBJKEY\".\"KEYNAME\" ORDER BY INTERNAL_FUNCTION(\"FIE_FINANCECONTENT\".\"DISPLAYTIME\") DESC
  228. )<:sys_b_7>
  229. 14 - filter(ROW_NUMBER() OVER ( PARTITION BY \"BASE_OBJKEY\".\"KEYNAME\" ORDER BY INTERNAL_FUNCTION(\"FIE_FINANCECONTENT\".\"DISPLAYTIME\") DESC
  230. )<:sys_b_7>
  231. 15 - filter(\"BASE_CATEOBJ\".\"CATEGORYID\" LIKE :SYS_B_5 OR \"BASE_CATEOBJ\".\"CATEGORYID\" LIKE :SYS_B_6)
  232. 16 - access(\"BASE_CATEOBJ\".\"OBJECTID\"(+)=\"BASE_OBJKEY\".\"OBJECTID\")
  233. 19 - access(\"FIE_FINANCECONTENT\".\"OBJECTID\"=\"BASE_OBJ\".\"OBJECTID\")
  234. 23 - access(\"BASE_OBJ\".\"OBJECTID\"=\"BASE_OBJKEY\".\"OBJECTID\")
  235. 28 - filter(\"BASE_OBJKEY\".\"SECURITYID\" IS NOT NULL)
  236. 33 - filter(\"BASE_OBJ\".\"STATUS\"=:SYS_B_4 AND SYS_OP_BLOOM_FILTER(:BF0002,\"BASE_OBJ\".\"OBJECTID\"))
  237. 38 - filter(SYS_OP_BLOOM_FILTER(:BF0001,\"FIE_FINANCECONTENT\".\"OBJECTID\"))
  238. 47 - filter(SYS_OP_BLOOM_FILTER(:BF0000,\"D\".\"OBJECTID\"))
  239. -------------------------------------------------------------------------------

重点关注红字部分,即为SQL_TUNE任务给出的调优建议,我们看到对于上面的语句,ORACLE建议其并行执行,下面也列出来了当前的执行计划和调整后的执行计划。


对上面的SQL_PROFILE进行应用

点击(此处)折叠或打开

  1. begin
  2. dbms_sqltune.accept_sql_profile(task_name =>
  3.             \'test_falist_tuning_task1\', task_owner => \'BOLAN\', replace =>
  4.             TRUE, profile_type => DBMS_SQLTUNE.PX_PROFILE);
  5. end;



查询已存在的SQL_PROFILE
select * from DBA_SQL_PROFILES;

DBA_SQL_PROFILES视图可查看当前系统中所有的SQL_PROFILES信息。


查询已存在的SQLTUNING TASK
select * from USER_ADVISOR_TASKS
USER_ADVISOR_TASKS视图可用来查看当前用户下所创建的调优任务


删除已应用的SQL_PROFILE

点击(此处)折叠或打开

  1. begin
  2. dbms_sqltune.drop_sql_profile(name => \'SYS_SQLPROF_014c22dc852c0004\');
  3. end;


删除当前用户创建的SQLTUNING TASK

点击(此处)折叠或打开

  1. begin
  2.   DBMS_SQLTUNE.drop_tuning_task(task_name => \'test_falist_tuning_task6\');
  3. end;




来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22166274/viewspace-1464707/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22166274/viewspace-1464707/

你可能感兴趣的:(Oracle 11g系统调优之dbms_sqltune包的使用)