oracle sqlt(sqltxplain) 診斷工具

selectshen發表於2016-05-31
文件Doc ID 1526574.1包含了下載,安裝,參考資料,最佳實踐等相關資訊.

以下是一個簡單的安裝測試:
OS:centos 6.6
DB:oracle 11.2.0.4

#安裝
[oracle@ct6604 ~]$ ll sqlt*
-rw-r--r-- 1 root root 919827 Apr  5 16:06 sqlt_latest.zip
#解壓
[oracle@ct6604 ~]$ unzip sqlt_latest.zip
[oracle@ct6604 ~]$ cd sqlt
[oracle@ct6604 sqlt]$ ls
doc  input  install  run  sqlt_instructions.html  sqlt_instructions.txt  utl
[oracle@ct6604 sqlt]$ cd install/

[oracle@ct6604 install]$ ORACLE_SID=ctdb
[oracle@ct6604 install]$ sqlplus / as sysdba
#解除安裝先前sqlt版本(可選)
SQL> @sqdrop.sql

#安裝sqlt
#sqcsilent2.sql後面6個引數的含義:connect_identifier,tool_password,default_tablespace,temporary_tablespace,main_application_schema,pack_license       
SQL> @sqcsilent2.sql '' sqlt_pwd USERS TEMP SYSTEM T
SQL> exit

#測試
[oracle@ct6604 install]$ cd ~
[oracle@ct6604 ~]$ sqlplus system/system
SQL> select /* 1 */a.* from scott.emp a,scott.dept b where a.deptno=b.deptno and b.dname='SALES';
SQL> select sql_text,sql_id from v$sql where sql_text like 'select /* 1 */a.* from scott.emp a%';
/*
SQL_TEXT
--------------------------------------------------------------------------------
SQL_ID
-------------
select /* 1 */a.* from scott.emp a,scott.dept b where a.deptno=b.deptno and b.dn
ame='SALES'
864hxkdxph5th
*/

#用於設定生成測試用例時是否包含業務資料以及要收集的比例,預設不收集業務資料
SQL>EXEC sqltxadmin.sqlt$a.set_sess_param('tcb_export_data', 'TRUE');
SQL>EXEC sqltxadmin.sqlt$a.set_sess_param('tcb_sampling_percent', '100');
SQL>EXEC sqltxadmin.sqlt$a.set_sess_param('tcb_export_pkg_body', 'TRUE');

#生成報告
SQL> @/home/oracle/sqlt/run/sqltxtrxec.sql 864hxkdxph5th sqlt_pwd
/*
...
updating: sqlt_s95230_tc_script.sql (deflated 17%)

  adding: sqlt_s95230_xtract_864hxkdxph5th.zip (stored 0%)
  adding: sqlt_s95231_xecute.zip (stored 0%)
  adding: sqltxtrxec.log (deflated 74%)


PL/SQL procedure successfully completed.


SQLTXTRXEC completed.
*/

下面是官方的sqlt使用指南 (文件 ID 1677588.1)

SQLT 概覽

SQLTXPLAIN,也稱為 SQLT,是 Oracle Server Technologies Center of Expertise - ST CoE 提供的一款工具。 SQLT 透過輸入的一個 SQL 語句,可輸出一組診斷檔案。這些檔案通常用於診斷效能不佳或者產生錯誤結果的 SQL 語句。

一旦,便可透過向 SQLT 傳遞一個包含 SQL 語句指令碼(包括繫結變數)的文字檔案或者其 SQL_ID,對 SQL 語句進行分析。SQL_ID 可在 AWR 和 ASH 的報告中找到,HASH_VALUE 出現在 SQL_TRACE 的輸出中(SQL 文字的上面以"hv="的標誌來識別)。您也能在 V$SQL 檢視中發現這些欄位。請參照接下來的文件:

Document 1627387.1 How to Determine the SQL_ID for a SQL Statement

SQLT 會連線到資料庫,收集執行計劃、基於成本的 Optimizer CBO 統計資訊、Schema 物件後設資料、效能統計資訊、配置引數和會影響正在分析的 SQL 效能的其他元素。這些方法會對有問題的SQL_ID產生一攬子輸出,包括一個html格式的"main"報表。關於如何使用"main"報表,您可以參考 下面的文件:

Document 1922234.1 SQLT Main Report: Usage Suggestions

SQLT 可以使用 Oracle Diagnostic 和(或)Oracle Tuning Packs,前提是您的資料庫需要具有這兩個軟體包的許可證。這兩個軟體包向 SQLT 工具提供了增強的功能。在 SQLT 安裝期間,您可以指定是否其中一個軟體包在您的資料庫被授權使用。如果一個都沒有,SQLT 仍會提供一些基本資訊,用於最開始的 SQL 效能診斷。


安全模式

SQLT的過程中會建立兩個使用者和一個角色。這些使用者和角色的名字都是固定的。

SQLT repository 是由使用者 SQLTXPLAIN管理的。SQLT 的使用者每次使用 SQLT 提供的時都要提供 SQLTXPLAIN 的密碼。 SQLTXPLAIN 使用者被賦予了以下系統許可權:

  • CREATE SESSION
  • CREATE TABLE

SQLT 包含的 PL/SQL 程式包以及檢視都是由使用者 SQLTXADMIN 管理的。SQLTXADMIN 使用者處於鎖定狀態並且由一個隨機產生的密碼保護。SQLTXADMIN 使用者被賦予了以下系統許可權:

  • ADMINISTER SQL MANAGEMENT OBJECT
  • ADMINISTER SQL TUNING SET
  • ADVISOR
  • ALTER SESSION
  • ANALYZE ANY
  • SELECT ANY DICTIONARY
  • SELECT_CATALOG_ROLE

所有 SQLT 的使用者在使用 SQLT 提供的之前必須被賦予 SQLT_USER_ROLE 這個角色。SQLT_USER_ROLE 角色被賦予了以下系統許可權:

  • ADVISOR
  • SELECT_CATALOG_ROLE

12c 在預設情況下 SYS 使用者不能作為 SQLT 的使用者,因為 PL/SQL 安全模型上改變的原因。
為了處理這個改變,SQLTADMIN 需要在 SYS 上被授予 INHERIT PRIVILEGES 許可權。
GRANT INHERIT PRIVILEGES ON USER SYS TO SQLTXADMIN
更多詳細的內容請參見 Oracle? Database PL/SQL Language Reference 12c Release 1 (12.1) - Invoker's Rights and Definer's Rights (AUTHID Property) and in Oracle? Database Security Guide 12c Release 1 (12.1) - Managing Security for Definer's Rights and Invoker's Rights


安裝 SQLT

SQLT 安裝在其自己的 schema SQLTXPLAINSQLTXADMIN 下。它不會將任何物件安裝到應用程式 schema 中。您可以在 UNIX、Linux 或 Windows 平臺,Oracle DB 10.2、11.1、11.2 及更高版本中安裝此版本的 SQLT。

安裝步驟:

  1. 先前版(可選)。
  2. 該可選步驟將刪除所有廢棄的 SQLTXPLAIN/SQLTXADMIN schema 物件,併為全新安裝準備環境。如果要保留 SQLT Repository 的現有內容,請跳過此步驟(推薦)。

    # cd sqlt/install
    # sqlplus / as sysdba
    SQL> START sqdrop.sql
    
  3. SYS 身份連線資料庫並執行安裝指令碼 sqlt/install/sqcreate.sql
  4. # cd sqlt/install
    # sqlplus / as sysdba
    SQL> START sqcreate.sql
    

在安裝期間,系統將要求您輸入以下引數值:

  1. 可選連線識別符號(當安裝在一個可插拔資料庫上時是必須的)
  2. 在一些受限訪問的系統中,您可能需要指定連線識別符號,例如 @PROD。如果不需要連線識別符號,則不要輸入任何資料,只需單擊Enter鍵。什麼也不鍵入是最常使用的安裝方法。
    當安裝在一個可插拔資料庫上時連線識別符號是必須提供的。

  3. SQLTXPLAIN 密碼。
  4. 在大多數系統中區分大小寫。

  5. SQLTXPLAIN 預設表空間。
  6. 從可用的永久表空間列表中,選擇 SQLT Repository 的 SQLTXPLAIN 應使用的表空間。它必須具有 50MB 以上的可用空間。

  7. SQLTXPLAIN 臨時表空間。
  8. 從可用的臨時表空間列表中,選擇 SQLTXPLAIN 臨時操作和臨時物件應使用的表空間。

  9. 可選應用程式使用者。
  10. 這是發出要分析 SQL 語句的使用者。例如,在 EBS 系統上,指定為 APPS;在 Siebel 上,應指定為 SIEBEL;在 People Soft 上,應指定為 SYSADM。系統不會要求您輸入此使用者的密碼。也可以在安裝該工具後新增其他的 SQLT 使用者,方法為:授予他們角色 SQLT_USER_ROLE

  11. 授權的 Oracle Pack。(T,D 或 N)
  12. 可以指定 T 表示 Oracle Tuning;D 表示 Oracle Diagnostic,或 N 表示都沒有。如果選擇 TD,SQLT 可以在它生成的診斷檔案中包含授權的內容。預設值為 T。如果選擇 N,SQLT 將只安裝限定的功能。

如果需要靜默安裝,可以使用下面三個選項來傳遞所有 6 個安裝引數:

  1. 在檔案中。
  2. 首先使用一個指令碼進行值的預先定義,類似於示例指令碼 sqlt/install/sqdefparams.sql。然後使用 sqlt/install/sqcsilent.sql,而不是 sqlt/install/sqcreate.sql

    # cd sqlt/install
    # sqlplus / as sysdba
    SQL> START sqdefparams.sql
    SQL> START sqcsilent.sql
    
  3. 命令列。
  4. 執行 sqlt/install/sqcsilent2.sql,而不是 sqlt/install/sqcreate.sql。前者以內嵌形式輸入 6 個安裝引數。

    # cd sqlt/install
    # sqlplus / as sysdba
    SQL> START sqcsilent2.sql '' sqltxplain USERS TEMP '' T
    
  5. 在 Oracle 內部安裝。
  6. 執行 sqlt/install/sqcinternal.sql,而不是 sqlt/install/sqcreate.sql。前者首先執行 sqlt/install/sqdefparams.sql,然後是 sqlt/install/sqcsilent.sql

    # cd sqlt/install
    # sqlplus / as sysdba
    SQL> START sqcinternal.sql
    

假如您需要更多關於安裝問題的幫助,您能從下面的論壇得到幫助:


解除安裝 SQLT

解除安裝 SQLT 會同時移除 SQLT Repository 以及所有 SQLTXPLAIN/SQLTXADMIN schema 物件。另外還會刪除 SQLTXPLAINSQLTXADMIN 使用者。要解除安裝 SQLT,只需以 SYS 身份連線,執行 sqlt/install/sqdrop.sql

# cd sqlt/install
# sqlplus / as sysdba
SQL> START sqdrop.sql

升級 SQLT

如果在系統中已安裝先前版本的 SQLT,則可以將 SQLT 升級到其最新版本,同時部分保留現有 SQLT Repository 的一些物件。然後可以使用新遷移的 SQLT Repository 來恢復 CBO 統計資訊,或者在 SQLT 的新舊執行程式之間執行

要升級 SQLT,只需執行,而不用執行可選步驟。

如果升級失敗,可能是先前的 SQLT 版本太舊而無法升級。在這種情況下,請先繼續 SQLT,然後執行全新


常見問題

請參考 MOS 文件 ID.


主要方法

在使用 SQLT 提供的主要方法之前,須確保 SQLT 已經被正確,並且使用 SQLT 的使用者被賦予了 SQLT_USER_ROLE 角色。

假如 SQLT 安裝繞過了 SQL*Net (意味著您並沒有在安裝期間沒有指定連線符),那麼在從遠端客戶端執行任何 SQLT 主要方法前,您將需要手動設定連線符引數。即,假如您連線使用 sqlplus scott/tiger@myprod 那麼您需要執行: EXEC sqltxadmin.sqlt$a.set_sess_param('connect_identifier', '@myprod');

SQLT 為一個 SQL 語句提供了下面 7種主要方法來生成診斷詳細資訊 處理繫結變數和會做 bind peeking(繫結變數窺視),但是 不會。這是因為 是基於 EXPLAIN PLAN FOR 命令執行的,該命令不做 bind peeking。因此,如果可能請避免使用.

除了 的 bind peeking 限制外,所有這 7種主要方法都可以提供足夠的診斷詳細資訊,對效能較差或產生錯誤結果集的 SQL 進行初步評估。如果該 SQL 仍位於記憶體中或者 Automatic Workload Repository (AWR) 中,請使用 ,其他情況請使用 。對於 Data Guard 或備用只讀資料庫,請使用 。僅當其他方法都不可行時,再考慮使用 是類似於 ,但為了提高 SQLT 的效能它們禁了一些 SQLT 的特性。


XTRACT 方法

如果您知道待分析 SQL 的 SQL_IDHASH_VALUE,請使用該方法,否則請使用 您可以在 AWR report 中找到 SQL_ID,在 SQL trace 中找到 HASH_VALUE(在 SQL 文字上面,透過 "hv=" 標記進行標識)。

如果該 SQL 仍位於記憶體中,或其已被 AWR 捕獲,那麼使用 XTRACT 可發現該 SQL 並提供一組診斷檔案,否則 XTRACT 將輸出錯誤。

如果對 SQL 進行硬分析時將引數 STATISTICS_LEVEL 設定為 ALL,將可以得到重要的效能統計資訊(如每步操作的實際行數)。您也可以透過在 SQL 中包括以下 CBO 提示來生成同樣有用的效能統計資訊:/*+ GATHER_PLAN_STATISTICS */。在 11g 中,您可以在 SQL 中包含以下 CBO 提示以獲得增強的診斷資訊:/*+ GATHER_PLAN_STATISTICS MONITOR */

使用此方法時,它會要求提供 SQLTXPLAIN 密碼,這個在匯出與該 XTRACT 執行所對應的 SQLT Repository 時會被使用。

該方法需要對執行 SQLT 的應用程式使用者授予 SQLT_USER_ROLE 角色。

要使用該 XTRACT 方法,首先確保已SQLT,然後以已執行待分析 SQL 的應用程式使用者身份連線到 SQL*Plus,並執行 sqlt/run/sqltxtract.sql 指令碼,傳遞 SQL_IDHASH_VALUE

# cd sqlt/run
# sqlplus apps
SQL> START sqltxtract.sql [SQL_ID]|[HASH_VALUE] [sqltxplain_password]
SQL> START sqltxtract.sql 0w6uydn50g8cx sqltxplain_password
SQL> START sqltxtract.sql 2524255098 sqltxplain_password

XECUTE 方法

方法相比,該方法提供的資訊更為詳細。正如名稱 XECUTE 所指示的,它將執行正在分析的 SQL,然後生成一組診斷檔案。它的主要缺點是如果正在分析的 SQL 需要很長時間來執行,那麼該方法也要花費很長的時間。

根據經驗法則,僅當 SQL 執行少於 1 小時的情況下,才考慮使用此方法,否則請使用

使用此 XECUTE 方法之前,必須建立一個包含 SQL 文字的文字檔案。如果 SQL 包括繫結變數,則您的檔案必須包含繫結變數宣告和賦值。以 sqlt/input/sample/script1.sql 為例。您的 SQL 應該包含標記 /* ^^unique_id */(強烈建議)。

如果您的 SQL 需要與 SQL*Plus 無法使用的資料型別繫結,或者它使用了集合,您可能需要將 SQL 嵌入到匿名 PL/SQL 塊中。在這種情況下,請使用 sqlt/input/sample/plsql1.sql 作為此方法的輸入示例。

對於修改資料的語句,例如 INSERT/UPDATE/DELETE,工具會在語句執行之前建立一個儲存點,這樣在會話結束時事務處理可以回退到該儲存點。關於 SAVEPOINT(儲存點)的更多資訊,請參閱《Oracle Concepts》參考手冊。

使用此方法時,它會要求提供 SQLTXPLAIN 密碼,這個在匯出與該 XECUTE 執行所對應的 SQLT Repository 時會被使用。

該方法需要對執行 SQLT 的應用程式使用者授予 SQLT_USER_ROLE 角色。

要使用該 XECUT 方法,首先確保已SQLT,然後以已執行待分析 SQL 的應用程式使用者身份連線到 SQL*Plus,並執行 sqlt/run/sqltxecute.sql 指令碼,傳遞包含 SQL 文字及其繫結變數的文字檔名稱。您需要將該檔案放置到 sqlt/input 目錄下,並在位於 sqlt 主目錄時執行 XECUTE,如下所示:

# cd sqlt
# sqlplus apps
SQL> START [path]sqltxecute.sql [path]scriptname [sqltxplain_password]
SQL> START run/sqltxecute.sql input/sample/script1.sql sqltxplain_password

XTRXEC 方法

該方法合併了 的功能。實際上,XTRXEC 連續執行了這兩種方法。針對所請求 SQL 語句找到的開銷較大的計劃, 階段將生成一個包含提取的 SQL 以及繫結宣告和賦值的指令碼。然後,XTRXEC 使用第一階段建立的指令碼執行 階段。

SQLT 根據在記憶體中生成開銷最大的執行計劃時窺視到的值,建立指令碼的繫結變數的以供 使用。判斷計劃的開銷大小的標準是基於這個計劃的平均執行時間。

如果 XTRXEC 僅執行了第一個階段() 後就輸出錯誤,您可能需要檢查在第二階段()使用的指令碼並相應調整繫結變數。使用不常用資料型別時尤其需要進行調整。

使用此方法時,它會要求提供 SQLTXPLAIN 密碼,這個在匯出與該 XTRXEC 執行所對應的 SQLT Repository 時會被使用。

該方法需要對執行 SQLT 的應用程式使用者授予 SQLT_USER_ROLE 角色。

要使用該 XTRXEC 方法,首先確保已SQLT,然後以執行待分析 SQL 的應用程式使用者身份連線到 SQL*Plus,並執行 sqlt/run/sqltxtrxec.sql 指令碼,傳遞 SQL_IDHASH_VALUE

# cd sqlt/run
# sqlplus apps
SQL> START sqltxtrxec.sql [SQL_ID]|[HASH_VALUE] [sqltxplain_password]
SQL> START sqltxtrxec.sql 0w6uydn50g8cx sqltxplain_password
SQL> START sqltxtrxec.sql 2524255098 sqltxplain_password

XTRSBY 方法

如果需要分析在 Data Guard 或備用只讀資料庫上執行的 SQL,請使用該方法。您需要知道要分析的 SQL 的 SQL_IDHASH_VALUE

在主庫上建立一個到備庫的database link,連線到的使用者需要有訪問資料字典的許可權,通常都是使用有 DBA 許可權的使用者。
CREATE PUBLIC DATABASE LINK V1123 CONNECT TO mydba IDENTIFIED by mydba_password
USING '(DESCRIPTION = (ADDRESS=(PROTOCOL=TCP)
(HOST=coesrv14.us.oracle.com)(PORT=1521))(CONNECT_DATA=(SID = V1123)))';

如果該 SQL 仍位於只讀資料庫中的記憶體中,那麼使用 XTRSBY 可發現該 SQL 並提供一組診斷檔案,否則 XTRSBY 將輸出錯誤。

如果對只讀資料庫中的 SQL 進行硬分析時將引數 STATISTICS_LEVEL 設定為 ALL,將可以得到重要的效能統計資訊(如每個執行計劃操作的實際行數)。您也可以透過在 SQL 中包括以下 CBO 提示來生成同樣有用的效能統計資訊:/*+ GATHER_PLAN_STATISTICS */。在 11g 中,您可以在 SQL 中包含以下 CBO 提示以獲得改進的診斷資訊:/*+ GATHER_PLAN_STATISTICS MONITOR */

使用此方法時,它會要求提供 SQLTXPLAIN 密碼,這個在匯出與該 XTRSBY 執行所對應的 SQLT Repository 時會被使用。

XTRSBY 需要 3 個引數: SQL id,DB_LINK的 ID,以及 SQLTXPLAIN 的密碼。

該方法需要對執行 SQLT 的應用程式使用者授予 SQLT_USER_ROLE 角色。

要使用該 XTRSBY 方法,首先確保在主資料庫上已安裝了 SQLT,並且已複製到該只讀資料庫中。然後連線到主要資料庫中的 SQL*Plus 並執行 sqlt/run/sqltxtrsby.sql 指令碼,傳遞 SQL_IDHASH_VALUE,然後是 DB_LINK。

# cd sqlt/run
# sqlplus apps
SQL> START sqltxtrsby.sql [SQL_ID]|[HASH_VALUE] [sqltxplain_password] [DB_LINK]
SQL> START sqltxtrsby.sql 0w6uydn50g8cx sqltxplain_password V1123
SQL> START sqltxtrsby.sql 2524255098 sqltxplain_password v1123

除了 XTRSBY,還可以從只讀資料庫直接執行 sqlt/utl/sqlhc.sqlsqlt/utl/sqlhcxec.sql。這兩個只讀指令碼不在資料庫上安裝任何東西,也不執行 DML 命令。它們提供在 XTRSBY 中沒有的其他資訊。


XPLAIN 方法

該方法是基於 EXPLAIN PLAN FOR 命令執行的,因此它將無視您的 SQL 語句引用的繫結變數。僅當無法使用 時才使用該方法。

使用此 XPLAIN 方法之前,必須建立一個包含 SQL 文字的文字檔案。如果 SQL 包括繫結變數,您有兩個選擇:保持 SQL 文字“不變”,或謹慎使用相同資料型別的字面值替換該繫結。以 sqlt/input/sample/sql1.sql 為例。

使用此方法時,它會要求提供 SQLTXPLAIN 密碼,這個在匯出與該 XPLAIN 執行所對應的 SQLT Repository 時會被使用。

該方法需要對執行 SQLT 的應用程式使用者授予 SQLT_USER_ROLE 角色。

要使用該 XPLAIN 方法,首先確保已SQLT,然後以已執行待分析 SQL 的應用程式使用者的身份連線到 SQL*Plus,並執行 sqlt/run/sqltxplain.sql 指令碼,傳遞包含 SQL 文字的文字檔名稱。您需要將該檔案放置到 sqlt/input 目錄下,並在位於 sqlt 主目錄時執行 XPLAIN,如下所示:

# cd sqlt
# sqlplus apps
SQL> START [path]sqltxplain.sql [path]filename [sqltxplain_password]
SQL> START run/sqltxplain.sql input/sample/sql1.sql sqltxplain_password

XPREXT 方法

假如您想使用 同時希望禁用一些 SQLT 的特性使之 執行更快,請使用這個方法。指令碼 sqlt/run/sqltcommon11.sql 顯示了哪些特性被禁用。

假如您知道要被分析的 SQL 的 SQL_ID 或者 HASH_VALUE,使用這個方法,否則請使用 .您可以在 AWR report 中找到 SQL_ID,在 SQL trace 中找到 HASH_VALUE(在 SQL 文字上面,透過 "hv=" 標記進行標識)。

使用此方法時,它會要求提供 SQLTXPLAIN 密碼,這個在匯出與該 XPREXT 執行所對應的 SQLT Repository 時會被使用。

該方法需要對執行 SQLT 的應用程式使用者授予 SQLT_USER_ROLE 角色。

要使用該 XPREXT 方法,首先確保已 SQLT,然後以已執行待分析 SQL 的應用程式使用者身份連線到 SQL*Plus,並執行 sqlt/run/sqltxprext.sql 指令碼,傳遞 SQL_IDHASH_VALUE

# cd sqlt/run
# sqlplus apps
SQL> START sqltxprext.sql [SQL_ID]|[HASH_VALUE] [sqltxplain_password]
SQL> START sqltxprext.sql 0w6uydn50g8cx sqltxplain_password
SQL> START sqltxprext.sql 2524255098 sqltxplain_password

XPREXC 方法

假如您想使用 同時希望禁用一些 SQLT 的特性使之執行更快,請使用這個方法。指令碼 sqlt/run/sqltcommon11.sql 顯示哪些特性被禁用

根據經驗法則,僅當 SQL 執行少於 1 小時的情況下,才考慮使用此方法,否則請使用

使用此 XPREXC 方法之前,必須建立一個包含 SQL 文字的文字檔案。如果 SQL 包括繫結變數,則您的檔案必須包含繫結變數宣告和賦值。以 sqlt/input/sample/script1.sql 為例。您的 SQL 應該包含標記 /* ^^unique_id */,這個標記應該拼寫準確,換句話說請不要改變它。

如果您的 SQL 需要與 SQL*Plus 無法使用的資料型別繫結,或者它使用了集合,您可能需要將 SQL 嵌入到匿名 PL/SQL 塊中。在這種情況下,請使用 sqlt/input/sample/plsql1.sql 作為此方法的輸入示例。

對於修改資料的語句,例如 INSERT/UPDATE/DELETE,工具會在語句執行之前建立一個儲存點,這樣在會話結束時事務處理可以回退到該儲存點。關於 SAVEPOINT(儲存點)的更多資訊,請參閱《Oracle Concepts》參考手冊。

用此方法時,它會要求提供 SQLTXPLAIN 密碼,這個在匯出與該 XPREXC 執行所對應的 SQLT Repository 時會被使用。

該方法需要對執行 SQLT 的應用程式使用者授予 SQLT_USER_ROLE 角色。

要使用該 XPREXC 方法,首先確保已 SQLT,然後以已執行待分析 SQL 的應用程式使用者身份連線到 SQL*Plus,並執行 sqlt/run/sqltxprexc.sql 指令碼,傳遞包含 SQL 文字及其繫結變數的文字檔名稱。您需要將該檔案放置到 sqlt/input 目錄下,並在位於 sqlt 主目錄時執行 XPREXC,如下所示:

# cd sqlt
# sqlplus apps
SQL> START [path]sqltxprexc.sql [path]scriptname [sqltxplain_password]
SQL> START run/sqltxprexc.sql input/sample/script1.sql sqltxplain_password

特殊方法

除了SQLT 還提供了一些特殊方法。

最常用的特殊方法是 。該方法將 SQLT 先前的兩次執行(中的任何一個)作為輸入並生成差異分析的報告。

其他特殊方法包括:。前三種方法基於一個單獨的 SQL trace 執行操作,最後一種對一組 SQL trace 執行操作。


COMPARE 方法

當您具有兩個相似的系統 (SOURCES),但是相同 SQL 語句在其中一個系統中執行正常而在另一個系統中不正常時,請使用該 COMPARE 方法。該方法可以幫助確定兩個 SOURCES 之間在計劃、後設資料、CBO 統計資訊、初始化引數以及問題修復控制方面的區別。前提是必須在這兩個系統中 SQLT,並且必須在兩個系統中的相同 SQL 上使用了中的任何一個。

這種比較可以在任何兩個 SOURCES 資料庫的其中一個或第三個 COMPARE 資料庫執行。後者應包含兩個 SOURCES 的 SQLT Repoitory。要匯入 SQLT Repository,請使用由任何生成的 sqlt_99999_readme.html 檔案中提供的語法。

一旦 COMPARE 系統包含來自兩個 SOURCES 的資源庫,執行 sqlt/run/sqltcompare.sql,以 SYS 或應用程式使用者身份連線。系統將顯示 STATEMENT_ID 的列表,您可以從中選擇要比較的兩個 SQLT 儲存的執行程式。輸入兩個 STATEMENT_ID 後,會要求您提供來自兩個 SOURCES 的特定 PLAN_HASH_VALUE

# cd sqlt
# sqlplus sqltxplain
SQL> START [path]sqltcompare.sql [STATEMENT_ID 1] [STATEMENT_ID 2]
SQL> START run/sqltcompare.sql 92263 72597
SQL> START run/sqltcompare.sql

TRCANLZR 方法

該方法將 SQL 跟蹤檔名作為輸入並分析該檔案。實際 trace 必須位於 TRCA$INPUT1 目錄中,其在期間預設為 USER_DUMP_DEST 目錄。

TRCANLZR 方法還可以將多個相關 trace 作為一組同時進行分析。當分析 PX trace 時將需要用到該功能。在這種情況下,需要建立一個包含 trace 列表的 control.txt 檔案(每行一個檔名,不包括路徑指定),並將此 control.txt 放置到 TRCA$INPUT1TRCA$INPUT2 目錄中。這兩個目錄在。期間分別預設為 USER_DUMP_DESTBACKGROUND_DUMP_DEST。然後,TRCANLZR 將從兩個輸入目錄之一讀取 control.txt 檔案,並在這兩個目錄的任何一箇中查詢 trace 集。

TRCANLZR 類似於 TKPROF,但它具有擴充套件功能。當它分析一個 trace (或 trace 集)時,它還包括類似 CBO 統計資訊的 Schema 物件特徵以及一些其他重要的效能度量。

要使用此 TRCANLZR 方法,請確保首先已經SQLT。然後,以生成 trace 的應用程式使用者身份啟動 SQL*Plus,並執行 sqlt/run/sqltrcanlzr.sql 指令碼,傳遞待分析 trace 的名稱或者填充了檔名的 control.txt 檔名稱。不用包括任何路徑指定。

# cd sqlt
# sqlplus [application_user]
SQL> START [path]sqltrcanlzr.sql [SQL Trace filename|control.txt]
SQL> START run/sqltrcanlzr.sql V1122_ora_24292.trc
SQL> START run/sqltrcanlzr.sql control.txt

TRCAXTR 方法

該方法執行的操作與 相同,但是當 trace 分析完成時,它會針對在 trace 中發現的頂級 SQL 繼續執行該方法基本上自動呼叫併合並 生成的所有報告。

要使用此 TRCAXTR 方法,請確保首先已經SQLT。然後,進入到 sqlt/run 目錄並啟動 SQL*Plus,以生成 trace 的應用程式使用者身份連線。接著,執行 sqlt/run/sqltrcaxtr.sql 指令碼,傳遞待分析 trace 的名稱或者填充了檔名的 control.txt 檔名稱。不用包括任何路徑指定。

# cd sqlt/run
# sqlplus [application_user]
SQL> START sqltrcaxtr.sql [SQL Trace filename|control.txt]
SQL> START sqltrcaxtr.sql V1122_ora_24292.trc
SQL> START sqltrcaxtr.sql control.txt

TRCASPLIT 方法

該方法將 EVENT 10046 和其他 EVENT(通常是 10053)建立的 SQL trace 檔名作為輸入。然後,它繼續將此輸入 trace 檔案分為兩個輸出檔案。一個包含與 EVENT 10046 對應的 trace 行,另一個包含其補充資訊。換句話說,第二個檔案包含不屬於 EVENT 10046 語法部分的那些 trace 行。所以,如果輸入 trace 是同時使用 EVENT 10046 和 EVENT 10053 建立的,得到的輸出檔案將是 10046 trace 和 10053 trace 。實際輸入 trace 必須位於 TRCA$INPUT1 目錄中,其在期間預設為 USER_DUMP_DEST 目錄。

要使用此 TRCASPLIT 方法,請確保首先已經SQLT。然後,啟動 SQL*Plus(以任何 SQLT 使用者身份連線)並執行 sqlt/run/sqltrcasplit.sql 指令碼,傳遞待分割 trace 的名稱。不用包括任何路徑指定。

# cd sqlt
# sqlplus [sqlt_user]
SQL> START [path]sqltrcasplit.sql [SQL Trace filename]
SQL> START run/sqltrcasplit.sql V1122_ora_24292.trc

XTRSET 方法

XTRSET 從記憶體或 AWR 提取由 SQL_IDHASH_VALUE 標識的 SQL 語句列表,然後對其中每個 SQL 語句執行最後它將所有 SQLT 檔案合併到一個壓縮檔案中。透過一系列測試確定相同 SQL 語句集的基準時需要使用此 XTRSET 方法。

使用此方法時,它只要求提供一次 SQLTXPLAIN 密碼,將在對 SQL 語句列表的每個 執行匯出 SQLT Repository 時需要。

要使用此 XTRSET 方法,必須首先SQLT。導航到 sqlt/run 目錄並啟動 SQL*Plus,以發出所有或大部分 SQL 語句的應用程式使用者身份連線。然後,執行 sqlt/run/sqltxtrset.sql 指令碼。出現提示時,傳遞由 SQL_IDHASH_VALUE 標識的 SQL 語句列表(以逗號分隔),以及 SQLTXPLAIN 的密碼。

# cd sqlt/run
# sqlplus [application_user]
SQL> START sqltxtrset.sql
List of SQL_IDs or HASH_VALUEs: 2yas208zgt5cv, 6rczmqdtg99mu, 8w8tjgac6tv12

高階方法和模組

除了,SQLT 還提供了一些其他功能。僅當 Oracle Support 要求時才使用這些高階方法和模組:, , 。最後一個僅供 Oracle Support 使用,僅用於內部測試環境中。


PROFILE 方法

當效能較差的 SQL 語句正好有已知的更好的計劃時,在 10g 使用該 PROFILE 方法可以提供一個快速修復。這個更好的計劃可以位於相同或不同系統中的記憶體中,或者位於相同或不同系統的 AWR 中。換句話說,如果有更好的計劃,該方法允許使用自定義 SQL Profile “固定”該計劃。使用該方法之前,必須對您要為其提取和固定此計劃的 SQL 使用中的任何一個。在 11g 或更高的版本你可以使用 SQL Plan Management (SPM) 來代替這個方法。

請注意,PROFILE 使用了 DBMS_SQLTUNE API,其是“SQL Tuning Advisor”的一部分,因此需要 Oracle Tuning Pack 的使用許可。僅當您的資料庫具有 Oracle Tuning Pack 的許可時才使用該 PROFILE 方法。

要使用該 PROFILE 方法,請確保 SQLT 已經並在 SOURCE 系統中使用,然後以 SYSSQLTXPLAIN 身份連線到 SQL*Plus,執行 sqlt/utl/sqltprofile.sql 指令碼。它將要求提供先前 SQLT 執行的列表中的 STATEMENT_ID。選擇 STATEMENT_ID 後,它將要求提供可用計劃列表中的 PLAN_HASH_VALUE。這些執行計劃是在對 SQL 使用 時捕獲和儲存的。

在需要實施自定義 SQL Profile 的 TARGET 系統中,不需要安裝 SQLT

該 PROFILE 方法基本上包含 4 個步驟。

  1. 在 SOURCE 系統上使用
  2. 在 SOURCE 中執行 sqlt/utl/sqltprofile.sql,以生成自定義 SQL Profile 的指令碼。
  3. 檢視生成的指令碼並根據需要調整 SQL 文字。例如,在使用 時要移除由 /* ^^unique_id */ 生成的註釋。
  4. 在要固定計劃的 TARGET 系統中執行生成的指令碼。
# cd sqlt/utl
# sqlplus sqltxplain
SQL> START sqltprofile.sql [statement id] [plan hash value];
SQL> START sqltprofile.sql 32263 923669362;
SQL> START sqltprofile.sql 32263;
SQL> START sqltprofile.sql;

由該方法建立的自定義 SQL Profile 是基於計劃大綱資料完成的,因此它更穩定。如果您稍後要刪除此自定義 SQLProfile,您可以在 PROFILE 生成的指令碼內找到刪除命令。

如果尚未在 SOURCE 系統中安裝 SQLT 或者無法為有關 SQL 執行 您可以使用 sqlt/utl/coe_xfr_sql_profile.sql 實現 PROFILE 方法提供的相同功能。該指令碼也使用了 DBMS_SQLTUNE;因此,需要 Oracle Tuning Pack 的許可。

如果您的系統為 11g 並且在考慮使用該 PROFILE 方法,請檢視由任何生成的動態 Readme 檔案,並查詢 "Create SQL Plan Baseline from SQL Set" 部分內容。如動態 Readme 檔案中所述,您可以考慮透過 SQL Set 使用“SQL Plan Management SPM”。


XGRAM 模組

XGRAM 模組提供了修改 CBO 直方圖的功能,用以增強某些列的 CBO 統計資訊或作為測試用例的一部分。透過該模組,可以插入、更新或刪除直方圖或單個儲存桶。

實施 XGRAM 模組的指令碼的按字母排序列表:

  1. sqlt/utl/xgram/sqlt_delete_column_hgrm.sql
  2. sqlt/utl/xgram/sqlt_delete_hgrm_bucket.sql
  3. sqlt/utl/xgram/sqlt_delete_schema_hgrm.sql
  4. sqlt/utl/xgram/sqlt_delete_table_hgrm.sql
  5. sqlt/utl/xgram/sqlt_display_column_stats.sql
  6. sqlt/utl/xgram/sqlt_insert_hgrm_bucket.sql
  7. sqlt/utl/xgram/sqlt_set_bucket_size.sql
  8. sqlt/utl/xgram/sqlt_set_column_hgrm.sql
  9. sqlt/utl/xgram/sqlt_set_min_max_values.sql

XGRAM 是在 SQLT 安裝過程中自動安裝的。如果您想在 SQLT 以外使用這個模組,您只需要安裝一個單獨的 package 並使用以上指令碼(不依賴於 SQLTXADMIN)。


XPLORE 模組

如果在資料庫升級後 SQL 開始效能變差或者它可能產生明顯的錯誤結果,那麼使用 XPLORE 模組將有所幫助。如果將 optimizer_features_enable OFE 切換到升級之前的資料庫版本,SQL 重新執行正常或者產生不同的結果,您可以使用此 XPLORE 模組嘗試標識哪個特定 Optimizer 功能或修復引入了未預期的行為。確定特定故障有助於進一步故障排除或者對此特定功能和(或)修復執行更詳細的研究。

此模組透過切換初始化引數和 fix control 引數來搜尋計劃。

僅當滿足以下所有條件時才使用 XPLORE:

  1. 當使用“差”計劃時,SQL 執行效能差或者返回錯誤結果。
  2. 可以在測試系統上重新生成差計劃(最好沒有真實資料)。
  3. 可以透過切換 OFE 在測試系統上重新生成“好”計劃。
  4. 您需要將原因範圍縮小到特定引數或 bug fix control。
  5. 您對測試系統具有完全訪問許可權,包括 SYS 訪問許可權。

當符合以下任一條件時不要使用 XPLORE:

  1. SQL 語句可能導致資料損壞或被更新。
  2. 在 SQL 引用的表中存在大量資料。
  3. 執行 SQL 需要的時間可能超過幾秒鐘。

要安裝和使用該 XPLORE 模組,請閱讀相應的 sqlt/utl/xplore/readme.txt


XHUME 模組

該模組僅供 Oracle Support 使用,且只能在 Oracle 內部系統中使用。因為它會更新資料字典,而且 Oracle 不支援此操作。

XHUME 可用於搜尋僅舊版本的 Schema 物件統計資訊(與一個 SQL 相關)可以產生的計劃。使用 SQLT 建立測試用例 (TC) 後,該 XHUME 模組將系統地還原先前版本的統計資訊,並透過執行正在研究的 SQL 來生成計劃。它將捕獲統計資訊的每個版本可以生成的計劃。然後生成報告,可用於瞭解執行計劃不穩定性的原因,或者查詢可用於建立 SQL Profile 或 SQL Plan Baseline 的執行計劃。

該模組永遠不能應用於生產系統,因為它會修改資料字典。僅能用於 Oracle 內部測試環境。

作為修改測試用例 (TC) Schema 物件的建立日期的替代方案,可以在 TC 實施之前更改伺服器上的日期並在建立 TC 後重置為當前日期。這個臨時的先前日期至少要早一個月,這樣 Schema 物件統計資訊的所有歷史記錄的儲存時間均將新於 TC 物件建立時間。

僅當滿足以下所有下列條件時才使用 XHUME:

  1. 已知 SQL 有多個計劃並且其中一個或多個效能較差。
  2. Bind peeking 已經被排除不是導致計劃不穩定的故障。
  3. 對 CBO 引數的更改已經被排除不是導致計劃不穩定的故障。
  4. 您具有能產生已知計劃的 SQLT TC(“好”或“差”計劃)。
  5. 您需要了解計劃的不穩定性或者正在查詢專用的已知“好”計劃。
  6. 您對 Oracle 內部測試系統具有完全訪問許可權,包括 SYS 訪問許可權。

當符合以下任一條件時不要使用 XHUME:

  1. SQL 語句可能導致資料損壞或被更新。
  2. 您只有一個生產環境中可以執行 TC
  3. 您沒有使用 SQLT 建立 TC
  4. 您對包含您 TC 的 Oracle 內部測試系統沒有 SYS 訪問許可權。
  5. Bind peekingCBO 引數尚未被排除不是導致計劃不穩定的故障。

要安裝和使用此 XHUME 模組,請閱讀相應的 sqlt/utl/xhume/readme.txt


上傳SQLT檔案給Oracle技術支援

在SQLT執行後,它會產生一個zip格式的輸出檔案(這個檔案包含了SQLT相關的各種輸出)。這個檔案的檔名一般為:

sqlt_s<sqltrun#>_<method>_<sql_id>.zip 
如果您已經使用一個特定的方法執行完一個SQLT,那麼您可以根據方法的名稱來找到輸出檔案。比如,下面的檔案就是使用XTRACT方法執行SQLT後產生的::

sqlt_s45774_xtract_fp48hh5dkm529.zip
如果輸出檔案的檔名是類似下面的格式:
sqlt_s50605_log.zip
那麼SQLT很可能並未成功執行,請檢查log檔案中的錯誤日誌.
一個正常的SQLT zip檔案一般包含下面的檔案(僅作參考) :
$ unzip -v sqlt_s45774_xtract_fp48hh5dkm529.zip
Archive: sqlt_s45774_xtract_fp48hh5dkm529.zip
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
0 Stored 0 0% 04-09-2015 18:34 00000000 sqlt_s45774_10053_explain.trc
0 Stored 0 0% 04-09-2015 18:34 00000000 sqlt_s45774_10053_i1_c0_extract.trc
610 Stored 610 0% 04-09-2015 18:35 51c54175 sqlt_s45774_cell_state.zip
4187 Stored 4187 0% 04-09-2015 18:35 ded1bbdd sqlt_s45774_driver.zip
12814 Defl:N 2983 77% 04-09-2015 18:34 d359b6e7 sqlt_s45774_lite.html
18879 Stored 18879 0% 04-09-2015 18:35 8270f836 sqlt_s45774_log.zip
862169 Defl:N 121759 86% 04-09-2015 18:34 9c99af83 sqlt_s45774_main.html
3991 Stored 3991 0% 04-09-2015 18:35 d42245f2 sqlt_s45774_opatch.zip
12572 Defl:N 3645 71% 04-09-2015 18:34 2c6b2c0a sqlt_s45774_readme.html
199784 Stored 199784 0% 04-09-2015 18:35 93a85ee1 sqlt_s45774_tc.zip
394 Defl:N 293 26% 04-09-2015 18:35 a405bd8b sqlt_s45774_tc_script.sql
35 Stored 35 0% 04-09-2015 18:35 4e1901f1 sqlt_s45774_tc_sql.sql
52511 Stored 52511 0% 04-09-2015 18:35 2aee61c6 sqlt_s45774_tcx.zip
406 Stored 406 0% 04-09-2015 18:35 6df4be4d sqlt_s45774_trc.zip
216 Defl:N 113 48% 04-09-2015 18:35 213361e5 sqlt_s45774_xpand.sql
2319 Stored 2319 0% 04-09-2015 18:35 6f79e5b8 sqlt_s45774_sqldx.zip
-------- ------- --- -------
1170887 411515 65% 16 files

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28539951/viewspace-2109691/,如需轉載,請註明出處,否則將追究法律責任。

相關文章