Oracle 11g系統調優之dbms_sqltune包的使用

hd_system發表於2016-10-20

前沿:隨著資料庫版本的提升,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;


執行結果如下:


其中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/29209863/viewspace-2126821/,如需轉載,請註明出處,否則將追究法律責任。

相關文章