sql最佳化工具之--sqlT
SQLT 概覽
SQLTXPLAIN,也稱為 SQLT,是 Oracle Server Technologies Center of Expertise - ST CoE 提供的一款工具。 SQLT 主要方法 透過輸入的一個 SQL 語句,可輸出一組診斷檔案。這些檔案通常用於診斷效能不佳或者產生錯誤結果的 SQL 語句。
對於sql語句的調優,SQLT 需要您有一些專業的知識來進行分析。對於許多問題來說我們推薦首先使用SQL Health Check 來檢查您的SQL,假如不能解決再嘗試使用SQLT。SQLHC的詳細介紹請看:
Document 1366133.1 SQL Tuning Health-Check Script (SQLHC)
一旦安裝,便可透過向 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 SQLTXPLAIN 和 SQLTXADMIN 下。它不會將任何物件安裝到應用程式 schema 中。您可以在 UNIX、Linux 或 Windows 平臺,Oracle DB 10.2、11.1、11.2 及更高版本中安裝此版本的 SQLT。
安裝步驟:
解除安裝先前版(可選)。
該可選步驟將刪除所有廢棄的 SQLTXPLAIN/SQLTXADMIN schema 物件,併為全新安裝準備環境。如果要保留 SQLT Repository 的現有內容,請跳過此步驟(推薦)。
# cd sqlt/install
# sqlplus / as sysdba
SQL> START sqdrop.sql
以 SYS 身份連線資料庫並執行安裝指令碼 sqlt/install/sqcreate.sql。
# cd sqlt/install
# sqlplus / as sysdba
SQL> START sqcreate.sql
在安裝期間,系統將要求您輸入以下引數值:
可選連線識別符號(當安裝在一個可插拔資料庫上時是必須的)
在一些受限訪問的系統中,您可能需要指定連線識別符號,例如 @PROD。如果不需要連線識別符號,則不要輸入任何資料,只需單擊Enter鍵。什麼也不鍵入是最常使用的安裝方法。
當安裝在一個可插拔資料庫上時連線識別符號是必須提供的。
SQLTXPLAIN 密碼。
在大多數系統中區分大小寫。
SQLTXPLAIN 預設表空間。
從可用的永久表空間列表中,選擇 SQLT Repository 的 SQLTXPLAIN 應使用的表空間。它必須具有 50MB 以上的可用空間。
SQLTXPLAIN 臨時表空間。
從可用的臨時表空間列表中,選擇 SQLTXPLAIN 臨時操作和臨時物件應使用的表空間。
可選應用程式使用者。
這是發出要分析 SQL 語句的使用者。例如,在 EBS 系統上,指定為 APPS;在 Siebel 上,應指定為 SIEBEL;在 People Soft 上,應指定為 SYSADM。系統不會要求您輸入此使用者的密碼。也可以在安裝該工具後新增其他的 SQLT 使用者,方法為:授予他們角色 SQLT_USER_ROLE。
授權的 Oracle Pack。(T,D 或 N)
可以指定 T 表示 Oracle Tuning;D 表示 Oracle Diagnostic,或 N 表示都沒有。如果選擇 T 或 D,SQLT 可以在它生成的診斷檔案中包含授權的內容。預設值為 T。如果選擇 N,SQLT 將只安裝限定的功能。
如果需要靜默安裝,可以使用下面三個選項來傳遞所有 6 個安裝引數:
在檔案中。
首先使用一個指令碼進行值的預先定義,類似於示例指令碼 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
命令列。
執行 sqlt/install/sqcsilent2.sql,而不是 sqlt/install/sqcreate.sql。前者以內嵌形式輸入 6 個安裝引數。
# cd sqlt/install
# sqlplus / as sysdba
SQL> START sqcsilent2.sql '' sqltxplain USERS TEMP '' T
在 Oracle 內部安裝。
執行 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
假如您需要更多關於安裝問題的幫助,您能從下面的論壇得到幫助:SQLTXPLAIN: SQLT Installation Issues
解除安裝 SQLT
解除安裝 SQLT 會同時移除 SQLT Repository 以及所有 SQLTXPLAIN/SQLTXADMIN schema 物件。另外還會刪除 SQLTXPLAIN 和 SQLTXADMIN 使用者。要解除安裝 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 的新舊執行程式之間執行 COMPARE。
要升級 SQLT,只需執行安裝,而不用執行可選解除安裝步驟。
如果升級失敗,可能是先前的 SQLT 版本太舊而無法升級。在這種情況下,請先繼續解除安裝 SQLT,然後執行全新安裝。
常見問題
請參考 MOS 文件 ID1454160.1.
主要方法
在使用 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種主要方法來生成診斷詳細資訊 XTRACT,XECUTE,XTRXEC,XTRSBY,XPLAIN,XPREXT 和 XPREXC。 XTRACT,XECUTE,XTRXEC,XTRSBY,XPREXT 和 XPREXC 處理繫結變數和會做 bind peeking(繫結變數窺視),但是 XPLAIN 不會。這是因為 XPLAIN 是基於 EXPLAIN PLAN FOR 命令執行的,該命令不做 bind peeking。因此,如果可能請避免使用XPLAIN.
除了 XPLAIN 的 bind peeking 限制外,所有這 7種主要方法都可以提供足夠的診斷詳細資訊,對效能較差或產生錯誤結果集的 SQL 進行初步評估。如果該 SQL 仍位於記憶體中或者 Automatic Workload Repository (AWR) 中,請使用 XTRACT 或 XTRXEC,其他情況請使用 XECUTE。對於 Data Guard 或備用只讀資料庫,請使用 XTRSBY。僅當其他方法都不可行時,再考慮使用 XPLAIN。XPREXT 和 XPREXC 是類似於 XTRACT 和 XECUTE,但為了提高 SQLT 的效能它們禁了一些 SQLT 的特性。
XTRACT 方法
如果您知道待分析 SQL 的 SQL_ID 或 HASH_VALUE,請使用該方法,否則請使用 XECUTE。您可以在 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_ID 或 HASH_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 方法
與 XTRACT方法相比,該方法提供的資訊更為詳細。正如名稱 XECUTE 所指示的,它將執行正在分析的 SQL,然後生成一組診斷檔案。它的主要缺點是如果正在分析的 SQL 需要很長時間來執行,那麼該方法也要花費很長的時間。
根據經驗法則,僅當 SQL 執行少於 1 小時的情況下,才考慮使用此方法,否則請使用 XTRACT。
使用此 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 方法
該方法合併了 XTRACT 和 XECUTE 的功能。實際上,XTRXEC 連續執行了這兩種方法。針對所請求 SQL 語句找到的開銷較大的計劃,XTRACT 階段將生成一個包含提取的 SQL 以及繫結宣告和賦值的指令碼。然後,XTRXEC 使用第一階段建立的指令碼執行XECUTE 階段。
SQLT 根據在記憶體中生成開銷最大的執行計劃時窺視到的值,建立指令碼的繫結變數的以供 XTRACT使用。判斷計劃的開銷大小的標準是基於這個計劃的平均執行時間。
如果 XTRXEC 僅執行了第一個階段(XTRACT) 後就輸出錯誤,您可能需要檢查在第二階段(XECUTE)使用的指令碼並相應調整繫結變數。使用不常用資料型別時尤其需要進行調整。
使用此方法時,它會要求提供 SQLTXPLAIN 密碼,這個在匯出與該 XTRXEC 執行所對應的 SQLT Repository 時會被使用。
該方法需要對執行 SQLT 的應用程式使用者授予 SQLT_USER_ROLE 角色。
要使用該 XTRXEC 方法,首先確保已安裝了 SQLT,然後以執行待分析 SQL 的應用程式使用者身份連線到 SQL*Plus,並執行 sqlt/run/sqltxtrxec.sql 指令碼,傳遞 SQL_ID 或 HASH_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_ID 或 HASH_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_ID 或 HASH_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.sql 或 sqlt/utl/sqlhcxec.sql。這兩個只讀指令碼不在資料庫上安裝任何東西,也不執行 DML 命令。它們提供在 XTRSBY 中沒有的其他資訊。
XPLAIN 方法
該方法是基於 EXPLAIN PLAN FOR 命令執行的,因此它將無視您的 SQL 語句引用的繫結變數。僅當無法使用 XTRACT 或 XECUTE 時才使用該方法。
使用此 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 方法
假如您想使用 XTRACT 同時希望禁用一些 SQLT 的特性使之 執行更快,請使用這個方法。指令碼 sqlt/run/sqltcommon11.sql 顯示了哪些特性被禁用。
假如您知道要被分析的 SQL 的 SQL_ID 或者 HASH_VALUE,使用這個方法,否則請使用 XPREXC.您可以在 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_ID 或 HASH_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 方法
假如您想使用 XECUTE 同時希望禁用一些 SQLT 的特性使之執行更快,請使用這個方法。指令碼 sqlt/run/sqltcommon11.sql 顯示哪些特性被禁用
根據經驗法則,僅當 SQL 執行少於 1 小時的情況下,才考慮使用此方法,否則請使用 XPREXT。
使用此 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 還提供了一些特殊方法。
最常用的特殊方法是 COMPARE。該方法將 SQLT 先前的兩次執行(主要方法中的任何一個)作為輸入並生成差異分析的報告。
其他特殊方法包括:TRCANLZR,TRCAXTR,TRCASPLIT 和 XTRSET。前三種方法基於一個單獨的 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$INPUT1 或 TRCA$INPUT2 目錄中。這兩個目錄在安裝。期間分別預設為 USER_DUMP_DEST 和 BACKGROUND_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 方法
該方法執行的操作與 TRCANLZR相同,但是當 trace 分析完成時,它會針對在 trace 中發現的頂級 SQL 繼續執行XTRACT 。該方法基本上自動呼叫併合並 TRCANLZR 和 XTRACT 生成的所有報告。
要使用此 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_ID 或 HASH_VALUE 標識的 SQL 語句列表,然後對其中每個 SQL 語句執行XTRACT。最後它將所有 SQLT 檔案合併到一個壓縮檔案中。透過一系列測試確定相同 SQL 語句集的基準時需要使用此 XTRSET 方法。
使用此方法時,它只要求提供一次 SQLTXPLAIN 密碼,將在對 SQL 語句列表的每個 XTRACT 執行匯出 SQLT Repository 時需要。
要使用此 XTRSET 方法,必須首先安裝了 SQLT。導航到 sqlt/run 目錄並啟動 SQL*Plus,以發出所有或大部分 SQL 語句的應用程式使用者身份連線。然後,執行 sqlt/run/sqltxtrset.sql 指令碼。出現提示時,傳遞由 SQL_ID 或 HASH_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 要求時才使用這些高階方法和模組:PROFILE, XGRAM, XPLORE 和 XHUME。最後一個僅供 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 系統中使用,然後以 SYS 或 SQLTXPLAIN 身份連線到 SQL*Plus,執行 sqlt/utl/sqltprofile.sql 指令碼。它將要求提供先前 SQLT 執行的列表中的 STATEMENT_ID。選擇 STATEMENT_ID 後,它將要求提供可用計劃列表中的 PLAN_HASH_VALUE。這些執行計劃是在對 SQL 使用 XTRACT 或 XECUTE 時捕獲和儲存的。
在需要實施自定義 SQL Profile 的 TARGET 系統中,不需要安裝 SQLT。
該 PROFILE 方法基本上包含 4 個步驟。
在 SOURCE 系統上使用 XTRACT 或 XECUTE。
在 SOURCE 中執行 sqlt/utl/sqltprofile.sql,以生成自定義 SQL Profile 的指令碼。
檢視生成的指令碼並根據需要調整 SQL 文字。例如,在使用 XECUTE 時要移除由 /* ^^unique_id */ 生成的註釋。
在要固定計劃的 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 執行 XTRACT 或 XECUTE您可以使用 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 模組的指令碼的按字母排序列表:
sqlt/utl/xgram/sqlt_delete_column_hgrm.sql
sqlt/utl/xgram/sqlt_delete_hgrm_bucket.sql
sqlt/utl/xgram/sqlt_delete_schema_hgrm.sql
sqlt/utl/xgram/sqlt_delete_table_hgrm.sql
sqlt/utl/xgram/sqlt_display_column_stats.sql
sqlt/utl/xgram/sqlt_insert_hgrm_bucket.sql
sqlt/utl/xgram/sqlt_set_bucket_size.sql
sqlt/utl/xgram/sqlt_set_column_hgrm.sql
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:
當使用“差”計劃時,SQL 執行效能差或者返回錯誤結果。
可以在測試系統上重新生成差計劃(最好沒有真實資料)。
可以透過切換 OFE 在測試系統上重新生成“好”計劃。
您需要將原因範圍縮小到特定引數或 bug fix control。
您對測試系統具有完全訪問許可權,包括 SYS 訪問許可權。
當符合以下任一條件時不要使用 XPLORE:
SQL 語句可能導致資料損壞或被更新。
在 SQL 引用的表中存在大量資料。
執行 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:
已知 SQL 有多個計劃並且其中一個或多個效能較差。
Bind peeking 已經被排除不是導致計劃不穩定的故障。
對 CBO 引數的更改已經被排除不是導致計劃不穩定的故障。
您具有能產生已知計劃的 SQLT TC(“好”或“差”計劃)。
您需要了解計劃的不穩定性或者正在查詢專用的已知“好”計劃。
您對 Oracle 內部測試系統具有完全訪問許可權,包括 SYS 訪問許可權。
當符合以下任一條件時不要使用 XHUME:
SQL 語句可能導致資料損壞或被更新。
您只有一個生產環境中可以執行 TC。
您沒有使用 SQLT 建立 TC。
您對包含您 TC 的 Oracle 內部測試系統沒有 SYS 訪問許可權。
Bind peeking 或 CBO 引數尚未被排除不是導致計劃不穩定的故障。
要安裝和使用此 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
參考
NOTE:1614201.1 - SQLT Changes
NOTE:1454160.1 - FAQ: SQLT (SQLTXPLAIN) Frequently Asked Questions
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2141161/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- sql最佳化工具SQLTSQL
- 最佳化sql的利器SQLTSQL
- SQLT 最佳化SQL 用複合索引代替單列索引的案例SQL索引
- 優化sql的利器SQLT優化SQL
- Oracle工具(Oracle Tools) – SQLT(SQLTXPLAIN)OracleSQLAI
- oracle sqlt(sqltxplain) 診斷工具OracleSQLAI
- 小米 sql 最佳化工具SQL
- SQL最佳化 之 -- joinSQL
- Oracle SQLT 診斷SQL語句效能(3)OracleSQL
- Oracle SQLT 診斷SQL語句效能(2)OracleSQL
- Oracle SQLT 診斷SQL語句效能(1)OracleSQL
- sqltSQL
- Sql最佳化之回表SQL
- SQL效能最佳化之索引最佳化法SQL索引
- 效能最佳化之SQL語句最佳化SQL
- Oracle效能最佳化之SQL最佳化(轉)OracleSQL
- Sql最佳化(十九) 調優工具(2)sql_traceSQL
- SQLT (SQLTXPLAIN) - Tool that helps to diagnose a SQL statement [ID 215187.1]SQLAI
- Oracle SQL最佳化之sql tuning advisor(STA)OracleSQL
- 【SQL】sql優化小工具之SQLHCSQL優化
- SQLT 使用指南SQL
- SQLT 安裝部署SQL
- sql最佳化:使用sql profile最佳化sql語句SQL
- SQL最佳化工具(MYSQL)——SQLAdvisor安裝使用MySql
- Effective MySQL之SQL語句最佳化 小結MySql
- SQLT 概要和安裝SQL
- SQL最佳化SQL
- SQL Server最佳化必備之任務排程SQLServer
- 【最佳化】SQL_TRACE之生成跟蹤檔案SQL
- Oracle12c中SQL最佳化(SQL TUNING)新特性之SQL計劃指令OracleSQL
- oracle11g中SQL最佳化(SQL TUNING)新特性之SQL Plan Management(SPM)OracleSQL
- SQLT安裝使用說明SQL
- 【SQL最佳化】SQL最佳化的10點注意事項SQL
- MySQL最佳化之如何查詢SQL效率低的原因MySql
- SQL最佳化案例-分割槽索引之無字首索引(六)SQL索引
- SQL最佳化1SQL
- PL/SQL最佳化SQL
- sql最佳化(mysql)MySql