您好,登錄后才能下訂單哦!
SQL 語句處理階段
透徹理解 SQL 處理有助于理解 SQL 統計信息。在 SQL 語句處理過程中,有四個重要階段:分析、綁定、執行和提取。
反向箭頭表示處理方案(例如,提取-(再)綁定-執行-提取)。
提取階段僅適用于帶有 returning 子句的查詢和 DML 語句。
注:有關 SQL 語句處理的詳細說明,請參閱《Oracle Database 11g Application Developers Guide: Fundamentals》和《Oracle Database 11g: Concepts》。
分析階段
分析是 SQL 語句處理的一個階段。當應用程序執行 SQL 語句時,其將對 Oracle DB 進行一次分析調用。在分析調用期間,Oracle DB 將:
檢查語句的語法和語義有效性
確定執行該語句的進程是否具有運行的權限
在共享池中搜索該語句的可共享匹配
為該語句分配專用 SQL 區域
存在兩類分析操作:
軟分析:提交一條 SQL 語句,并在共享池找到一個匹配。該匹配可以是另一用戶之前執行的結果。會共享該 SQL 語句,這對性能有利。但是,軟分析仍需要語法和安全檢查,這將占用系統資源。
硬分析:第一次提交一條 SQL 語句,而在共享池中未找到可共享的匹配。硬分析最耗費資源,且不可伸縮,因為硬分析會執行分析中所涉及的所有操作。
如果正確使用綁定變量,則可能存在更多的軟分析,從而減少硬分析,并將分析后的語句在庫高速緩存中保存更長時間。
SQL 存儲
Oracle 服務器使用庫高速緩存和 SQLAREA 來存儲 SQL 語句和 PL/SQL 塊。如果將語句存儲在高速緩存中,Oracle 服務器將:
將語句減少到 ASCII 文本的數值
使用此數字的散列函數
將此語句的游標置于散列鏈上
散列值不是唯一值,多條語句可以散列到相同的值。這些語句的游標上下文都存儲在同一散列鏈中。搜索散列鏈以獲得正確的語句。任何時候提交語句,都會搜索高速緩存。如果沒有找到游標句柄,則會從該語句構建游標。后續提交語句時,會找到該游標句柄并重復使用此游標。
若已分析并執行該語句,且該游標句柄仍位于客戶機高速緩存中,則可調用并執行該游標,而無需在共享池中搜索該語句。不管何時作出分析請求,分析計數統計信息都會遞增,但是在會話高速緩存中尋找語句的開銷明顯降低。
注:理想情況下,在 SQL 語句第一次提交時進行一次硬分析,而后對每個使用該語句的其它會話進行一次軟分析。這取決于會話高速緩存和共享池中是否存在足夠的內存來保留游標信息。
游標的使用和分析
每個開發人員都希望其代碼能夠以盡可能快的速度運行。對于使用 SQL 語句的代碼,這意味著游標訪問的速度必須很快。訪問游標可能的最快方法是通過服務器會話的會話內存中打開的游標高速緩存進行訪問。在打開的游標高速緩存中每個打開的游標都有一個指向該游標句柄 SGA 內存位置的指針。要執行該游標,需要使用指針,而不需要分析。一個打開的游標是已經過分析的游標,并且游標句柄位于庫高速緩存中。
如果已將 SESSION_CACHED_CURSORS 參數設置為某個值,則在關閉游標后,會將游標信息移至會話已關閉的游標高速緩存中。(版本 10.2.0.2 之前,默認值為 0,在該版本中已更改為 50。)
打開游標時,會話會散列 SQL 語句,并在關閉的游標高速緩存中執行散列查找。如果找到該游標,則會將其移至打開的游標高速緩存中,然后使用指向共享池中該游標句柄的指針來執行該游標,無需進行任何分析。
如果未在會話中找到游標,則會使用散列值在共享池中搜索該游標句柄的散列鏈。搜索將注冊為分析。如果找到游標句柄,并且剩余的游標尚未到期釋放,則執行此游標。這屬于軟分析。
游標的使用和分析(續)
如果游標已在共享池中到期釋放,或者游標不存在于共享池中,則會構建該游標。這屬于硬分析。構建游標需要查找獨立對象(如表、索引、區和序列)的元數據。如果尚未將這些對象的元數據高速緩存在共享池中,則會生成遞歸 SQL 以提取數據字典中的信息。
在大量游標提交到共享池且共享池內存分配不足的某些情況下,游標可能很快便在高速緩存中到期釋放,即時此時位于兩次提取之間。這種情況將導致出現大量硬分析。
注:有關優化共享池,以便優化游標處理的詳細信息,請參閱“優化共享池”課程。
綁定階段
綁定階段期間:
Oracle DB 檢查該語句對綁定變量的引用。
Oracle DB 會為每個變量分配或重新分配一個值。
當在某一語句中使用綁定變量時,優化程序將假設需要使用游標共享,且不同的調用應使用相同的執行計劃。這有助于通過減少大量運行硬分析來改善性能。
如果存在直方圖,則優化程序將假定數據分配與該優化程序的默認假設不匹配。因此,如果使用不同的執行計劃,在使用不同綁定變量多次調用游標時將獲得顯著的優勢。此情況下,自適應游標共享將創建新計劃。如果不嘗試新計劃,則性能可能會因為某些綁定變量值而降低。
游標共享受 Oracle Database 11g 的數據庫初始化參數和自適應游標共享功能影響。有關詳細信息,請參閱“優化共享池”課程。
執行階段
執行計劃是一系列步驟,服務器進程使用這些步驟訪問并確定數據緩沖區中的所需數據行。多個用戶可共享相同執行計劃。Oracle DB 針對 DML 語句執行物理讀取或邏輯讀取/寫入,同時視需要進行數據排序。
注:物理讀取為磁盤讀取;邏輯讀取涉及的是數據庫緩沖區高速緩存內存中已存在的塊。物理讀取需要磁盤 I/O,因此會占用更多資源和時間。
提取階段
提取階段,Oracle DB 針對 SELECT 語句進行行檢索。每個提取操作通常使用數組提取對多行進行檢索。數組檢索可通過減少網絡往返次數來提高性能。每個 Oracle 工具都有自己的方式來調整數組大小;例如,在 SQL*Plus 中,可通過使用 ARRAYSIZE 設置來更改提取大小:
SQL> show arraysize arraysize 15 SQL> set arraysize 50
SQL*Plus 每次默認處理 15 行。過大的數組幾乎不具優勢,或根本不具優勢。
DML 處理步驟
數據操縱語言 (DML) 語句僅需要兩個處理階段:
分析階段與處理查詢使用的分析階段相同。
執行階段需要執行其它處理才能進行數據更改。
DML 執行階段
執行 DML 語句:
1. 如果緩沖區高速緩存中沒有數據塊和回退塊,則服務器進程會將其從數據文件讀取到緩沖區高速緩存。服務器進程將鎖定要修改的行。
2. 服務器進程將記錄對數據緩沖區所作的更改以及還原更改。這些更改將在修改內存中的數據和回退緩沖區之前寫入到重做日志緩沖區中。這稱作“先行寫事件記錄”。
3. 回退緩沖區包含修改操作前數據的值。回退緩沖區用于存儲之前的數據映像,因此可視需要回退 DML 語句。數據緩沖區將記錄數據的新值。
4. 用戶將獲得該 DML 操作的反饋(如該操作影響的行數)。
DML 處理步驟(續)
DML 執行階段(續)
由于 DML 而更改的所有內存中數據塊和回退塊(緩沖區高速緩存中)將標記為灰緩沖區,即不同于磁盤上的對應塊。數據庫寫入進程 (DBWR) 不會將這些緩沖區立即寫入到磁盤。當提交事務處理時,日志寫入進程將立即在重做日志文件中記錄對這些塊進行的更改的重做更改記錄,且灰塊最終由 DBWR 寫入磁盤,這將由增量檢查點算法確定。注:在 DBWR 將灰塊寫入磁盤之前,必須將灰塊的重做更改記錄寫入重做日志文件。
UPDATE、DELETE 或 INSERT 命令均使用類似的步驟。DELETE 命令執行之前的映像包含要刪除行的列值,而 INSERT 命令執行之前的映像僅包含行位置信息。
提交事務處理之前,對塊進行的更改僅記錄在內存結構中,而不會立即寫入到磁盤中。實例進程遵循一種惰性寫入算法,以提高整體性能。提交事務處理之后,寫入操作將是永久性的。在 LWGR 進程將重做信息記錄到磁盤之前,不會發布“已提交”消息,以確保完整的可恢復性。DBWR 根據檢查點算法將數據塊寫入到磁盤。提交事務處理前,如果計算機出現故障導致 SGA 丟失,則將同時丟失這些更改。遵循的規則是:提交事務處理之前,該事務處理并非永久性的。
有關處理數據庫緩沖區高速緩存的詳細信息,請參閱“優化緩沖區高速緩存”課程。
快速提交
Oracle 采用一種快速提交機制,來保證出現實例故障時能夠恢復已提交的更改。
系統更改號
每當提交事務處理時,Oracle DB 將為該事務處理分配一個唯一的系統更改號 (SCN)。Oracle DB 將 SCN 用作內部時間戳來讓數據保持同步,這樣從數據文件中檢索數據時可提供讀一致性。通過 SCN 實例可執行一致性檢查,而無需依賴操作系統的日期和時間。
發出 COMMIT 時,將執行以下步驟:
服務器進程將提交記錄連同 SCN 一起保存在重做日志緩沖區中。
后臺日志寫入進程 (LGWR) 對直到提交記錄為止(包括提交記錄)的所有重做日志緩沖區條目執行一次相鄰寫入,并寫入到重做日志文件中。這將保證即使出現實例故障,也不會丟失更改。
服務器進程向用戶進程發送一條消息,說明事務處理完成。
最后 DBWR 基于其自身內部計時機制和增量檢查點設置,將實際數據塊更改寫回磁盤。
Oracle 優化程序的作用
優化程序是 Oracle DB 的一部分,用于為 SQL 語句創建執行計劃。確定執行計劃是處理任何 SQL 語句的重要一步,會對執行時間產生重大影響。
執行計劃是執行語句時按順序執行的一系列操作。“影響優化程序”課程講述了各步驟的詳細信息。優化程序會考慮與被引用對象相關的以及與查詢中所指定的條件相關的許多因素。優化程序所需的信息包括:
為系統(I/O、CPU 等)以及方案對象(行數、索引等)搜集的統計信息
字典中的信息
WHERE 子句限定詞
開發人員提供的提示
使用諸如 Enterprise Manager、EXPLAIN PLAN 和 SQL*Plus AUTOTRACE 等診斷工具時,可以看到優化程序選擇的執行計劃。
注:根據其功能的不同,Oracle Database 11g 優化程序具有兩個名稱:查詢優化程序或運行時優化程序和自動優化程序。
Oracle 優化程序的作用(續)
優化程序操作:對于由 Oracle Server 處理的任何 SQL 語句,優化程序將執行以下操作:
評估表達式和條件:優化程序首先盡可能全面評估含有常數的表達式和條件。
語句轉換:對于涉及的復雜語句,例如,關聯的子查詢或視圖,優化程序可能將原始語句轉換為等效的聯接語句。
選擇優化程序方法:優化程序確定優化目標。
選擇訪問路徑:對于語句訪問的每個表,優化程序選擇一或多個可用的訪問路徑以獲得表數據。如果沒有可用的統計信息(如使用位圖索引),優化程序將跳過某些訪問路徑。
選擇聯接順序:對于聯接兩個以上表的聯接語句,該優化程序首先選擇聯接哪兩個表,然后選擇哪個表將聯接到結果,等等。
選擇聯接方法:對于任何聯接語句,優化程序選擇用于聯接的操作。
注:對于不同的 Oracle DB 版本,優化程序可能不會作出相同的決定。在最近的版本中,因為有更多信息可用,優化程序可能作出不同的決定。
優化程序有兩種工作模式,第一種為運行時優化程序,是常用模式,該模式在運行時創建執行計劃。在此模式中,該優化程序的時間有限,其僅可考慮有限個數的備選方案。第二種模式稱為自動優化程序 (ATO)。在此模式中,優化程序有更多時間考慮更多選項和收集統計信息。ATO 可生成更好的計劃,并創建 SQL 概要文件,未來每當提交 SQL 語句時,該概要文件將幫助優化程序選擇更好的計劃。
確定不良 SQL
SQL 的優勢之一是,可以編寫不同的 SQL 語句來產生相同的結果。任何能夠產生正確結果的 SQL 語句便是正確的 SQL 語句。但是,不同的 SQL 可能需要不同數量的資源。不良 SQL 可能是正確的,但是效率不高,需要更多資源。
不良 SQL 的癥狀可能是幻燈片上所列特征的任何一項。下一張幻燈片中所示的頂級 SQL 報表提供了一種查找消耗最多系統資源的 SQL 語句的方法。
導致不良 SQL 原因可能是不當的設計、不良的編碼,或是優化程序選擇了低效的執行計劃。DBA 很少有機會控制設計或代碼,但是可以影響優化程序來生成更好的執行計劃。
從理論上講,給定關系數據集上任何給定的結果集都存在一個最優執行計劃。優化程序試圖在給定的時間和資源的限制條件下找到該最優執行計劃。找到該最優計劃可能需要很長時間。例如,您可能不愿等待優化程序花 5 分鐘時間生成一個能將運行時減少 5 秒鐘的計劃。優化程序評估試用執行計劃的順序受包括 SQL 編寫方式在內的多種因素的影響。
頂級 SQL 報表
在優化方面,最大的投資收益在于 SQL 優化。頂級 SQL 報表在確定占用系統資源最多的語句方面非常有效。研究表明,通常 20% 的 SQL 語句占用了 80% 的資源,而 10% 的語句占用了 50% 的資源。這意味著,通過確定并優化頂級 SQL 語句,可改善整個系統的性能。
使用頂級 SQL 報表簡化了查找占用資源最多的 SQL 語句的過程。AWR 和 Statspack 報表都包括一組頂級 SQL 列表。每個報表以若干類別按照資源使用情況排序列出了頂級 SQL 語句。這些類別包括:用時、CPU 時間、獲取數、讀取數、執行數、分析調用、可共享內存和版本計數。各個報表不包括完整的 SQL 文本,但各個報表之后按照 SQL_ID 給出了所有 SQL 文本的報表。
默認情況下,這些報表中不包括全部 SQL 語句。所包括語句的數目由 AWR 的 topnsql 參數設置和 Statspack 中的級別和閾值設置控制。有關 Statspack 參數的詳細信息,請參閱附錄“使用 Statspack”。
什么是執行計劃?
執行某一語句時,服務器將執行由該優化程序創建的計劃步驟。每一步驟要么從數據庫物理檢索數據行,要么以某種方式為發出該語句的用戶準備數據行。用于運行語句的步驟的組合稱作“執行計劃”。
執行計劃包括語句所訪問的每個表的訪問方法以及這些表的順序(聯接順序)。優化程序還使用不同的方法來組合多個表的行(聯接方法)。執行計劃的步驟并不按編號順序執行。
通過執行計劃,可查看優化程序所選的方法。有時執行計劃會明確說明某一語句效率不高的原因;例如,當某一索引查詢選擇全表掃描 (FTS) 時,這種掃描涉及很多 I/O 操作。這種情況下,問題就變為優化程序為什么選擇 FTS。“影響優化程序”課程詳細說明了此類問題。
查看執行計劃的方法
通過 EXPLAIN PLAN 命令,可查看優化程序用來執行 SQL 語句的執行計劃,而無需執行該 SQL 語句。
SQL 跟蹤實用程序用于度量 SQL 語句的計時統計信息。
自動工作量資料檔案庫 (AWR) 是 Oracle Database 11g 中的一個內置資料檔案庫。Oracle DB 定期捕獲其所有重要統計信息和工作量信息的快照,并將快照保存在 AWR 中,包括占用資源較多的 SQL 語句的列表。AWR 數據包括執行計劃。
V$SQL_PLAN 視圖包含有關所執行 SQL 語句及其執行計劃(仍位于共享池中)的信息。
SQL*Plus 中可用的 AUTOTRACE 命令生成 PLAN_TABLE 輸出和有關查詢的性能的統計信息。此命令提供了許多與 SQL 跟蹤相同的統計信息,諸如磁盤讀取和內存讀取。
您可使用 DBMS_XPLAN 程序包方法來顯示由 EXPLAIN PLAN 命令和 V$SQL_PLAN 查詢以及 AWR 生成的執行計劃。
使用執行計劃
查看執行計劃用于:
確定當前的執行計劃
確定在一個表上創建索引的效果
查找包含某一特定訪問路徑的游標(例如,全表掃描或索引范圍掃描)
確定優化程序所選或所未選的索引
確定優化程序是否選擇開發人員所期望的特定執行計劃(例如,嵌套循環聯接)
您可使用執行計劃來作出以下決定:
刪除或創建索引
生成數據庫對象的統計信息
修改初始化參數值
將應用程序或數據庫遷移到一個新的版本
默認情況下,SQL 在共享池中到期釋放后,將不保留執行計劃。如果之前所用的計劃保留在用戶定義的表中,或作為基線計劃加載,則確定 SQL 語句性能的更改如何與該語句的執行計劃的更改相關聯是可能的。
DBMS_XPLAN 程序包:概覽
DBMS_XPLAN 程序包提供了一種簡單方法來以若干預定義格式顯示 EXPLAIN PLAN 命令的輸出。還可使用 DBMS_XPLAN 程序包來顯示存儲在 AWR 中的語句的計劃。此外,它還提供了一種方法,用以基于 V$SQL_PLAN 固定視圖和 V$SQL_PLAN_STATISTICS_ALL 固定視圖中存儲的信息來顯示高速緩存的 SQL 游標的 SQL 執行計劃和 SQL 執行運行時統計信息。
DBMS_XPLAN 程序包提供了可用于檢索和顯示執行計劃的三種表函數:
DISPLAY 格式化并顯示 PLAN_TABLE 的計劃表的內容。
DISPLAY_AWR 格式化并顯示存儲在 AWR 中的 SQL 語句的執行計劃的內容。
DISPLAY_CURSOR 格式化并顯示任何從 V$SQL_PLAN 視圖載入的游標的執行計劃的內容。
DBMS_XPLAN 程序包:概覽(續)
此程序包的方法包含一個 FORMAT 參數,通過此參數,可指定所顯示計劃的詳細級別。
BASIC:顯示最少的計劃信息(操作 ID、對象名稱和操作選項)
TYPICAL:默認。顯示計劃中相關性最高的信息。可用時,僅顯示分區修剪、并行和謂詞。
ALL:最大級別。包括 TYPICAL 級別所顯示的信息,并添加投影信息以及針對并行執行服務器而生成的 SQL 語句(僅當并行時)。
SERIAL:與 TYPICAL 類似,但不顯示并行信息,即使并行執行計劃,也同樣如此。
此程序包以調用用戶的權限運行,而不以程序包所有者的權限 (SYS) 運行。DISPLAY_CURSOR 表函數需要以下固定視圖上的 SELECT 權限:V$SQL_PLAN、V$SESSION 和 V$SQL_PLAN_STATISTICS_ALL。使用 DISPLAY_AWR 函數需要 DBA_HIST_SQL_PLAN、DBA_HIST_SQLTEXT 和 V$DATABASE 上的 SELECT 權限。所有這些權限均作為 SELECT_CATALOG_ROLE 的一部分而自動授予。但是,建議您不要不加區分地授予此角色,因為這可能導致安全問題。
DISPLAY_CURSOR 和 DISPLAY_AWR 函數接受 SQL_ID 作為一個參數(如本課程后續示例所示)。可通過查詢 V$SQL 或 DBA_HIST_SQLTEXT 來獲得語句的 SQL_ID。
EXPLAIN PLAN 命令
EXPLAIN PLAN 命令用于生成優化程序用以執行 SQL 語句的執行計劃。其不執行語句,但簡單生成可能使用的計劃,并將此計劃插入到表中。如果查看計劃,可看到 Oracle 服務器執行相應語句的方式。
要使用 EXPLAIN PLAN,必須:
首先使用 EXPLAIN PLAN 命令解釋 SQL 語句
使用 DBMS_XPLAN 程序包中的方法檢索計劃步驟
PLAN_TABLE 是作為全局臨時表而自動創建的,用于為所有用戶保存 EXPLAIN PLAN 語句的輸出。PLAN_TABLE 是默認的示例輸出表,EXPLAIN PLAN 語句將在其中插入說明執行計劃的行。
注:EXPLAIN PLAN 可能生成一個不同于優化程序實際所使用計劃的計劃,其原因如下:
EXPLAIN PLAN 命令無法訪問綁定變量。
鑒于登錄觸發器或會話參數設置,SQL*Plus 會話可能具有不同的環境。
V$SQLPLAN 將使用該實際計劃。
EXPLAIN PLAN 命令:示例
此命令將 SQL 語句的執行計劃插入到計劃表中,并添加名稱標記 demo01,以便后續參考。標記是可選的。也可以使用以下語法:
EXPLAIN PLAN
FOR
SELECT e.last_name, d.department_name FROM hr.employees e, hr.departments d
WHERE e.department_id =d.department_id;
EXPLAIN PLAN 命令:輸出
DBMS_XPLAN 程序包的 DISPLAY 函數可用于格式化并顯示計劃表中存儲的最后一條語句。
幻燈片顯示了按照上一張幻燈片上所示使用 DBMS_XPLAN 程序包檢索該示例的 PLAN 表中的信息。
還可使用以下所示語法來檢索 PLAN 表。
SELECT plan_table_output FROM TABLE(dbms_xplan.display('plan_table','demo01','serial'));
輸出的內容與幻燈片中顯示的內容相同。在此示例中,可使用另一計劃表名稱替換 PLAN_TABLE,'demo01' 代表語句 ID。
您可運行 utlxpls.sql 腳本(位于 ORACLE_HOME/rdbms/admin/ 目錄下)以顯示所解釋的最后一條語句的 EXPLAIN PLAN。該腳本使用 DBMS_XPLAN 程序包的 DISPLAY 表函數。
讀取執行計劃
可從執行計劃構造一棵執行樹(或“分析樹”),以更清晰了解如何處理語句。要構造該樹,請從步驟 1 開始。然后查找步驟 1 的所有子步驟,并在步驟 1 下方將其繪制成子級步驟或分支。對于每個步驟,重復此過程查找該步驟的所有子步驟,直到所有步驟都繪出。Oracle DB 為執行計劃中的每個步驟分配一個編號,表示 PLAN_TABLE 的 ID 列。每個步驟由一個“節點”表示。每個節點的操作結果會傳遞到其父節點,父節點將此結果用作輸入。
步驟的順序由這些步驟的父-子關系來確定。執行計劃的每個步驟從數據庫檢索行,或者將一或多個其它步驟(也稱作“行源”)的行接受為輸入。子步驟將至少被執行一次,且結果會饋送至父步驟。當一個父步驟具有多個子步驟時,將按照步驟的位置次序執行各子步驟。如果下層子步驟是按照從左向右排列的,則可從左向右、從下到上讀取計劃。
圖中,編號對應于 PLAN 表中的 ID 值(參看前一張幻燈片)。優化程序通過在主鍵列執行 FULL INDEX SCAN 而使用索引掃描,從 DEPARTMENTS 表檢索行。然后在 EMPLOYEES 表上執行一次 FULL TABLE SCAN 和 SORT 操作。然后對兩個結果集執行 MERGED 以獲得查詢的最終結果。
使用 V$SQL_PLAN
該視圖提供了一種方法,用于檢查最近執行過的游標的執行計劃。此視圖中的信息非常類似于 PLAN_TABLE 的輸出。但是,EXPLAIN PLAN 顯示的是執行相應語句時可以使用的理論計劃,而 V$SQL_PLAN 包含實際使用的計劃。鑒于綁定變量取數、cursor_sharing 參數設置等原因,EXPLAIN PLAN 語句獲得的執行計劃可能不同于所用的實際執行計劃。
V$SQL_PLAN 顯示了特定游標的計劃。每條 SQL 語句可能具有多個相關的游標,各游標以 CHILD_NUMBER 標識。例如,如果所引用的對象位于不同方案中,則不同用戶執行的同一語句具有不同的相關游標。提示不同或綁定變量值不同可能引起游標不同。V$SQL_PLAN 可用于查看同一語句的不同子游標的不同計劃。
注:另一有用視圖為 V$SQL_PLAN_STATISTICS,此視圖為每個緩存的游標的執行計劃中的每個操作提供執行統計信息。同時,V$SQL_PLAN_STATISTICS_ALL 視圖組合了 V$SQL_PLAN 中的信息和 V$SQL_PLAN_STATISTICS 以及 V$SQL_WORKAREA 中的執行統計信息。
V$SQL_PLAN 列
V$SQL_PLAN 視圖的幾乎所有列都顯示在 PLAN_TABLE 列中。兩個視圖中,同名的列意義相同。
ADDRESS 和 HASH_VALUE 列可用于聯接 V$SQLAREA,以添加特定于游標的信息。
ADDRESS、HASH_VALUE 和 CHILD_NUMBER 列可用于聯接 V$SQL,以添加特定于子游標的信息。
查詢 V$SQL_PLAN
可使用 DBMS_XPLAN.DISPLAY_CURSOR() 函數來查詢 V$SQL_PLAN,以顯示當前或上一次執行的語句(如示例所示)。對于給定語句,可將該語句的 SQL_ID 值作為參數傳遞,以獲得執行計劃。要獲得 SQL_ID:
SELECT e.last_name, d.department_name
FROM hr.employees e, hr.departments d WHERE e.department_id =d.department_id;
SELECT SQL_ID, SQL_TEXT FROM V$SQL
WHERE SQL_TEXT LIKE '%SELECT e.last_name,%' ;
13saxr0mmz1s3 select SQL_id, sql_text from v$SQL …
cfz0cdukrfdnu SELECT e.last_name, d.department_name …
FORMAT 參數控制計劃的詳細級別。除了標準值(BASIC、TYPICAL、SERIAL 和 ALL)外,還有兩個受支持的值,用于顯示游標的運行時統計信息。
RUNSTATS_LAST:顯示上一次執行該游標的運行時統計信息
RUNSTATS_TOT:顯示自第一次分析和執行某一特定 SQL 語句之后,該語句所有執行的全部運行時統計信息
V$SQL_PLAN_STATISTICS 視圖
V$SQL_PLAN_STATISTICS 視圖提供了計劃中每個操作的實際執行統計信息,如輸出行數和所用時間。除輸出行數外,所有統計信息都是累計的結果。例如,聯接操作的統計信息還包括其兩個輸入的統計信息。V$SQL_PLAN_STATISTICS 中的統計信息對已編譯(在 STATISTICS_LEVEL 初始化參數設置為 ALL 的情況下進行編譯)的游標是可用的。
V$SQL_PLAN_STATISTICS_ALL 視圖包含了使用 SQL 內存的行源的內存使用情況統計信息(排序或散列聯接)。此視圖連接 V$SQL_PLAN 中的信息與 V$SQL_PLAN_STATISTICS 和 V$SQL_WORKAREA 的執行統計信息。
查詢 AWR
可使用 DBMS_XPLAN.DISPLAY_AWR() 函數來顯示 AWR 中存儲的所有計劃。本示例將 SQL_ID 作為參數傳入。完成此示例的步驟如下:
1. 執行 SQL 語句。
SQL> select /* example */ *
2> from hr.employees natural join hr.departments;
2. 查詢 V$SQL_TEXT 以獲得 SQL_ID。
SQL> select sql_id, sql_text from v$SQL
2> where sql_text like '%example%';
SQL_ID SQL_TEXT
------------- -------------------------------------------
F8tc4anpz5cdb select sql_id, sql_text from v$SQL …
454rug2yva18w select /* example */ * from …
3. 使用 SQL_ID 確認 DBA_HIST_SQLTEXT 字典視圖已捕獲此語句。如果查詢未返回行,則表示 AWR 中尚未加載該語句。
查詢 AWR(續)
SQL> SELECT SQL_ID, SQL_TEXT FROM dba_hist_sqltext WHERE SQL_ID =' 454rug2yva18w';
no rows selected
您可手動獲取 AWR 快照,而不是等待下一張快照(每小時采集一次)。如果 SQL 不在 topnsql 范圍內,可能不會捕獲 SQL。為此,可使用 MODIFY_SNAPSHOT_SETTING 過程修改 topnsql 范圍來強制捕獲所有 SQL 語句。然后在 DBA_HIST_SQLTEXT 中檢查是否已捕獲:
SQL> exec –
2> DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(-
3> topnsql => 'MAXIMUM');
PL/SQL procedure successfully completed.
SQL> exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
PL/SQL procedure successfully completed.
SQL> exec –
2> DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(-
3> topnsql => 'DEFAULT');
PL/SQL procedure successfully completed.
SQL> SELECT SQL_ID, SQL_TEXT FROM dba_hist_sqltext WHERE SQL_ID =' 454rug2yva18w';
SQL_ID SQL_TEXT
-------------- -------------------------------
454rug2yva18w select /* example */ * from …
4. 使用 DBMS_XPLAN.DISPLAY_AWR () 函數檢索執行計劃:
SQL>SELECT PLAN_TABLE_OUTPUT FROM TABLE (DBMS_XPLAN.DISPLAY_AWR('454rug2yva18w’));
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------
SQL_ID 454rug2yva18w
--------------------
select /* example */ * from hr.employees natural join hr.departments
Plan hash value: 2052257371
----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 7 (100)| |
| 1 | HASH JOIN | | 11 | 968 | 7 (15)| 00:00:01 |
| 2 | TABLE ACCESS FULL| DEPARTMENTS | 11 | 220 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| EMPLOYEES | 107 | 7276 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------------
SQL*Plus AUTOTRACE
在 SQL*Plus 中,可通過使用 AUTOTRACE 設置來自動獲得執行計劃以及有關運行 SQL 命令的某些其它統計信息。與 EXPLAIN PLAN 命令不同,該語句會實際運行。但是,可通過指定 AUTOTRACE TRACEONLY EXPLAIN 來選擇隱藏語句結果。
AUTOTRACE 是用于優化 SQL 語句的方便診斷工具。由于其完全屬聲明性質,使用起來較 EXPLAIN PLAN 容易。
命令選項
OFF 禁用 SQL 語句的自動跟蹤
ON 啟用 SQL 語句的自動跟蹤
TRACEONLY 啟用 SQL 語句的自動跟蹤,并隱藏語句輸出
EXPLAIN 顯示執行計劃,但不顯示統計信息
STATISTICS 顯示統計信息,但不顯示執行計劃
注:如果忽略 EXPLAIN 和 STATISTICS 命令選項,將默認顯示執行計劃和統計信息。
使用 SQL*Plus AUTOTRACE
先決條件
要訪問 STATISTICS 數據,必須具有訪問若干動態性能表的權限。DBA 可通過使用在 plustrce.sql 腳本中創建的 PLUSTRACE 角色來授予權限。DBA 必須以 SYS 用戶的身份運行該腳本,具有 DBA 角色的任何人都可對要使用 AUTOTRACE 的選項 STATISTICS 的用戶授予 PLUSTRACE 角色。
示例
幻燈片顯示了 AUTOTRACE 命令的示例。
控制 AUTOTRACE 執行計劃布局
執行計劃由按以下順序顯示的四列組成:
ID_PLUS_EXP 各步驟的行號
PARENT_ID_PLUS_EXP 父步驟行號
PLAN_PLUS_EXP 報表步驟
OBJECT_NODE_PLUS_EXP 所用的數據庫鏈接或并行查詢服務器
您可更改這些列的格式,或通過使用 SQL*Plus COLUMN 命令隱藏這些列。有關更多信息,請參閱《Oracle SQL*Plus User’s Guide and Reference》。
SQL*Plus AUTOTRACE:統計信息
AUTOTRACE 將顯示多種統計信息,這些信息并非全部與此階段的討論有關。最重要的統計信息包括以下內容:
db block gets 當前獲取數的邏輯 I/O 數
consistent gets 緩沖區高速緩存塊的讀取數
physical reads 從磁盤讀取的塊數
redo size 所生成的重做數(針對 DML 語句)
sorts (memory) 在內存中執行的排序數
sorts (disk) 使用臨時磁盤存儲執行的排序數
注:數據庫塊獲取數為緩沖區高速緩存中當前塊的讀取數。一致的獲取數是具有還原數據的緩沖區高速緩存塊的讀取數。物理讀取數為磁盤塊讀取數。通常會監視三種統計信息:數據庫塊獲取數、一致獲取數和物理讀取數。與檢索的行數相比,這些數值應該比較低。應該在內存中(而非在磁盤上)執行排序。
SQL 跟蹤工具
如果您使用的是標準版,或不具備診斷包,則使用 SQL 跟蹤工具和 TKPROF 可收集 SQL 執行計劃的統計信息,以便比較性能。比較兩個執行計劃的一種較好方法是:執行這些語句,并比較統計信息以確定哪個更好。SQL 跟蹤將其會話統計信息輸出寫入到一個文件,您可使用 TKPROF 對該文件進行格式化。您可使用這些工具以及 EXPLAIN PLAN 來獲得最佳結果。
SQL 跟蹤工具:
可為會話或實例啟用
報告分析、執行和提取階段的容量和時間統計信息
產生可由 TKPROF 格式化的輸出
當為某一會話啟用 SQL 跟蹤工具時,Oracle DB 會生成一個跟蹤文件,其中包含該會話的跟蹤 SQL 語句的會話統計信息。當為某一實例啟用 SQL 跟蹤工具時,Oracle DB 會為所有會話創建跟蹤文件。
注:SQL 跟蹤涉及一些開銷,因而您可能不希望在實例級啟用 SQL 跟蹤。
SQL 跟蹤工具(續)
SQL 跟蹤工具提供有關各個 SQL 語句的性能信息。SQL 跟蹤提供以下信息(包括行源信息):
分析、執行和提取計數
CPU 時間和占用時間
物理讀取數和邏輯讀取數
處理的行數
庫高速緩存未命中數
每次分析所用的用戶名
每次提交和回退
顯示每一 SQL 語句的實際執行計劃的行操作
行數、一致讀取數、物理讀取數、物理寫入數以及針對行的每一操作的用時
注:使用 TKPROF 實用程序可獲得每個跟蹤文件的概要。
使用 SQL 跟蹤工具的方法
必須完成以下步驟以使用 SQL 跟蹤:
1. 設置適當的初始化參數。
2. 啟用 SQL 跟蹤。
3. 運行應用程序(并在完成時禁用跟蹤)。
4. 禁用 SQL 跟蹤。
5. 關閉會話(關閉會話將同時禁用會話級的跟蹤)。
6. 使用 tkprof 格式化由 SQL 跟蹤產生的跟蹤文件。
7. 解釋輸出,并視需要優化 SQL 語句。
運行 SQL 跟蹤將增加系統開銷。視需要僅使用 SQL 跟蹤,并且在會話級使用,而非在實例級使用。
注:此示例假設使用專用服務器。在共享服務器環境、XA 或應用程序級連接共享情況下,多個會話可能服務于某單個會話。需要跟蹤所有涉及的服務器,并通過使用 trcsess 實用程序來組合跟蹤文件,然后提交到 tkprof 以便格式化。有關 trcsess 的詳細信息,請參閱“應用程序監視”課程。
初始化參數
有多個初始化參數與 SQL 跟蹤有關。
STATISTICS_LEVEL
Oracle 提供的 STATISTICS_LEVEL 初始化參數控制所有主要的統計信息收集或數據庫中的指導。該參數設置數據庫的統計信息收集級別。根據 STATISTICS_LEVEL 的設置收集某些指導或統計信息。
BASIC:不收集指導或統計信息。禁用監視和許多自動功能。Oracle 建議您不要使用此設置,因為這將禁用重要的 Oracle 功能。
TYPICAL:此為默認值,且確保收集所有主要統計信息,同時提供最佳整體數據庫性能。對于大多數環境而言,此設置應足夠了。TYPICAL 導致啟用 TIMED_STATISTICS。
ALL:包括 TYPICAL 設置所收集的所有指導或統計信息,加上定時操作系統統計信息和行源執行統計信息。
此視圖列出了受 STATISTICS_LEVEL 控制的統計信息或指導的狀態。
初始化參數(續)
TIMED_STATISTICS
SQL 跟蹤工具提供某一進程中有關 SQL 執行的各種信息,且可選地包括定時信息。如果需要定時信息,則必須將此參數設置為 TRUE。STATISTICS LEVEL 參數將自動設置此參數。通過以下方式設置參數文件中的 TIMED_STATISTICS 參數,可從 STATISTICS_LEVEL 單獨設置此參數:
SQL> ALTER SYSTEM SET TIMED_STATISTICS = TRUE
對于特定會話,也可使用以下命令動態設置此參數:
SQL> ALTER SESSION SET timed_statistics=TRUE;
定時統計信息以微秒計。
MAX_DUMP_FILE_SIZE
如果在實例級啟用 SQL 跟蹤工具,則每次對服務器的調用都會在一個文件(以操作系統的文件格式)中產生一個文本行。這些文件(操作系統塊中)的最大大小受此初始化參數限制。這是一個動態參數,也是一個會話參數。
警告:默認值為 UNLIMITED,因此這些跟蹤文件可能增長而填滿文件系統。
DIAGNOSTIC_DEST 是自動診斷資料檔案庫的根目錄。此目錄的默認值派生自 ORACLE_BASE 環境變量,在 UNIX 下,其為 $ORACLE_BASE/diag。啟用該 Trace 工具時生成的文件將放在此資料檔案庫的子目錄下:../rdbms/<db_name>/<instance_name>/trace。
獲得有關參數設置的信息
可通過查詢 V$PARAMETER 視圖來顯示當前的參數值:
SQL> SELECT name, value
2 FROM v$parameter
3 WHERE name LIKE '%dest%';
或者,可使用以下方法:
SQL> SHOW PARAMETER dest
為某一會話啟用 SQL 跟蹤
可使用所示命令為會話啟用 SQL 跟蹤。當要從 PL/SQL 單元內啟用或禁用 SQL 跟蹤時,這些過程調用比較有用。
DBA 還可使用所提供的程序包為另一用戶的會話啟用 SQL 跟蹤。
SQL> EXECUTE dbms_system.set_sql_trace_in_session 2 (session_id, serial_id, true);
在此過程調用中,session_id 和 serial_id 為 V$SESSION 的 SID 和 SERIAL# 列中的值,其中 V$SESSION 是數據庫管理員常用的數據字典視圖。
若要為整個實例啟用 SQL 跟蹤,則使用 DBMS_MONITOR 程序包中的 DATABASE_TRACE_ENABLE 過程。
警告:實例范圍內的跟蹤將產生大量的跟蹤文件,并會影響性能。
注: 在可以使用 DBMS_MONITOR 程序包之前,必須在其上授予 EXECUTE 權限。
通過使用 10046 事件,可將等待事件信息寫入該會話的跟蹤文件中。有關此事件的詳細信息,請參閱 MetaLink Note: 171647.1,“Tracing Oracle Applications”。要捕獲等待事件信息,請運行以下 SQL 語句:
ALTER SESSION SET EVENTS '10046 trace name context forever,level 8';
為某一會話禁用 SQL 跟蹤
完成優化之后,使用前述方法之一禁用 SQL 跟蹤,用 FALSE 一詞替換 TRUE,或用 disable 替換 enable。如果為單次會話啟用了 SQL 跟蹤,則退出該會話將同時禁用 SQL 跟蹤。
格式化跟蹤文件
使用 TKPROF 命令將跟蹤文件格式化為可讀的輸出。TKPROF 語法如下:
OS> tkprof tracefile outputfile [options]
tracefile 跟蹤輸出文件的名稱(對 TKPROF 而言是輸入)outputfile 存儲格式化結果的文件的名稱
如果不帶任何參數執行 TKPROF 命令,則會生成一條用法消息以及所有TKPROF 選項的說明。請參閱下一張幻燈片上的完整列表。以下為當不帶任何參數執行 TKPROF 命令時得到的輸出:Usage: tkprof tracefile outputfile [explain= ] [table= ]
[print= ] [insert= ] [sys= ] [sort= ]
默認情況下,.trc 文件以 SPID 命名。可在 V$PROCESS 中找到 SPID。以下是查找該文件的更簡單方法:
SQL> ALTER SESSION SET TRACEFILE_IDENTIFIER = 'MY_FILE';
然后 TKPROF 中的跟蹤文件將包含“MY_FILE”字符串。
TKPROF 命令選項
黑體顯示的選項是最常用的選項:
INSERT 創建 SQL 腳本以將 TKPROF 結果載入到數據庫表中
SORT 報表中對語句排序的順序(請參閱下一頁的值列表)
PRINT 僅在這么多個(已排序)語句上生成報表(此選項與 SORT 選項組合尤其有用。)
EXPLAIN 以指定方案登錄并執行 EXPLAIN PLAN
SYS 禁用用戶 SYS 執行的遞歸 SQL 語句的列表
AGGREGATE 禁用或啟用 TKPROF 的(默認)行為,將完全相同的 SQL 語句聚合到一條記錄中
WAITS 指定是否記錄在跟蹤文件中找到的任何等待事件的概要
TABLE 指定在將執行計劃寫入到輸出文件之前,用來臨時存儲執行計劃的表(如果未指定 EXPLAIN,則將忽略此參數。當若干個體同時使用 TKPROF 來優化同一方案時,可避免具有破壞性的干擾。)
RECORD 使用在跟蹤文件中找到的所有非遞歸 SQL 語句創建 SQL 腳本 (此腳本可用于后續重放優化會話。)
TKPROF 命令選項(續)
排序選項
prscnt 調用分析的次數
prscpu 分析所占用的 CPU 時間
prsela 分析所占用的時間
prsdsk 分析期間磁盤讀取數
prsqry 分析期間一致讀取的緩沖區數
prscu 分析期間當前讀取的緩沖區數
prsmis 分析期間庫高速緩存中的未命中數
execnt 調用的執行數
execpu 執行所占用的 CPU 時間
exeela 執行所占用的時間
exedsk 執行期間磁盤讀取數
exeqry 執行期間一致讀取的緩沖區數
execu 執行期間當前讀取的緩沖區數
exerow 執行期間處理的行數
exemis 執行期間庫高速緩存的未命中數
fchcnt 調用提取的次數
fchcpu 提取所占用的 CPU 時間
fchela 提取所占用的時間
fchdsk 提取期間磁盤讀取數
fchqry 提取期間一致讀取的緩沖區數
fchcu 提取期間當前讀取的緩沖區數
fchrow 提取的行數
userid 分析游標的用戶的 ID
TKPROF 命令的輸出
TKPROF 輸出按照 SQL 處理步驟列出了 SQL 語句的統計信息。包含統計信息的每行的步驟由調用列的值來標識。
分析 此步驟將 SQL 語句轉換為執行計劃,并包括對適當安全授權的檢查和對表、列 及其它引用對象的存在的檢查。
執行 此步驟中,Oracle 服務器實際執行該語句。對于 INSERT、UPDATE 和 DELETE 語句,此步驟將修改數據(包括需要時的排序操作)。對于 SELECT 語句,此 步驟將確定所選行。
提取 此步驟對查詢所返回的行進行檢索,并在需要時進行排序。提取的執行僅適用 于 SELECT 語句。注:“分析”值包括“硬分析”和“軟分析”。硬分析是指執行計劃的開發(包括優化);然后其將存儲在庫高速緩存中。軟分析是指,在將 SQL 語句發送到數據庫以進行分析時,數據庫發現其位于庫高速緩存中,僅需確認諸如訪問權限等事宜。硬分析代價可能會比較高,尤其是因為需要優化。就庫高速緩存活動而言,軟分析的代價通常比較高。
TKPROF 命令的輸出(續)
將在下頁解釋輸出。
示例輸出如下:
SQL ID :6assxhyzbq5jf
select max(cust_credit_limit)
from customers where cust_city ='Paris'
call count cpu elapsed disk query current rows
------- ------ ------ -------- -------- -------- -------- ----------
Parse 1 0.00 0.02 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.01 0.26 1455 1457 0 1
------- ------ ------ -------- -------- -------- -------- ----------
total 4 0.02 0.28 1455 1457 0 1
TKPROF 命令的輸出(續)
TKPROF 在 CALL 列旁邊顯示了每條語句的以下統計信息:
Count 分析、執行或提取語句的次數(解釋其它列中的統計信息之前,檢查此列 的值是否大于 1。除非使用 AGGREGATE = NO 選項,否則 TKPROF 會將 完全相同的語句執行聚合成一個概要表。)
CPU 所有分析、執行或提取調用所用的總 CPU 時間(以秒計)
Elapsed 所有分析、執行或提取調用所占用的總時間(以秒計)
Disk 所有分析、執行或提取調用從磁盤上的數據文件物理讀取的數據塊的總數
Query 所有分析、執行或提取調用在一致模式下檢索的緩沖區的總數(對于查詢, 通常是在一致模式下檢索緩沖區。)
Current 當前模式下檢索的緩沖區的總數(對于 DML 語句,通常是在當前模式下檢 索緩沖區。但是,始終在當前模式下檢索段頭塊。)
Rows SQL 語句處理的總行數(該總數不包括該 SQL 語句的子查詢所處理的行。 對于 SELECT 語句,所返回的行數用于提取步驟。對于 UPDATE、 DELETE 和INSERT 語句,所處理的行數用于執行步驟。)
附注
DISK 等效于 v$sysstat 或 AUTOTRACE 的物理讀取數。
QUERY 等效于 v$sysstat 或 AUTOTRACE 的一致獲取數。
CURRENT 等效于 v$sysstat 或 AUTOTRACE 的數據庫塊獲取數。
遞歸調用
要執行一條由用戶發出的 SQL 語句,Oracle 服務器必須間或執行其它語句。這些語句稱作“遞歸 SQL 語句”。例如,如果在一個表中插入一行,而該表空間不足以保存該行,則 Oracle 服務器將進行遞歸調用以動態分配空間。當數據字典高速緩存中沒有數據字典信息而必須從磁盤檢索時,也會生成遞歸調用。
如果在啟用 SQL 跟蹤工具時發生遞歸調用,則 TKPROF 將在輸出文件中清晰標出遞歸 SQL 語句。可通過設置 SYS=NO 命令行參數來禁用在輸出文件中列出遞歸調用。請注意,遞歸 SQL 語句的統計信息將始終包含在引起遞歸調用的 SQL 語句的列表中。
庫高速緩存未命中數
TKPROF 還針對每條 SQL 語句列出了分析和執行步驟產生的庫高速緩存未命中數。這些統計信息將出現在表格式統計信息之下的單行中。
遞歸調用(續)
行源操作
這些信息提供了執行于行上的各個操作所處理的行數以及其它行源信息,如物理讀取數和寫入數;cr = 一致讀取數,pw = 物理寫入數,pr = 物理讀取數,time = 時間(以微秒計),cost = 成本估計,size = 行源字節數估計,card =基數(行數)。
分析用戶 ID
此為上一次分析該語句的用戶的 ID。
行源操作
行源操作顯示了該 SQL 語句執行的數據源。僅當在跟蹤期間已關閉游標時,才包含此信息。如果行源操作未出現在跟蹤文件中,則您可能要查看 EXPLAIN PLAN。
執行計劃
如果在 TKPROF 命令行上指定 EXPLAIN 參數,則 TKPROF 將使用 EXPLAIN PLAN 命令來為每個跟蹤的 SQL 語句生成執行計劃。TKPROF 還顯示了執行計劃的每一步驟所處理的行數。
注:請注意,執行計劃是在運行 TKPROF 命令時生成的,而不是生成跟蹤文件時。如果自跟蹤語句起,已創建或刪除某個索引,則結果可能明顯不同。
優化程序模式或提示
這表示在執行語句期間所用的優化程序提示。如果無提示,則將顯示所用的優化程序模式。
...
select max(cust_credit_limit)
from customers where cust_city ='Paris'
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.00 0.00 77 77 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.01 0.01 77 77 0 1
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 85 (SH)
Rows Row Source Operation
------- ---------------------------------------------------
1 SORT AGGREGATE (cr=77 pr=77 pw=77 time=0 us)
77 TABLE ACCESS BY INDEX ROWID CUSTOMERS (cr=77 pr=77 pw=77 time=555 us
cost=85 size=1260 card=90)
77 INDEX RANGE SCAN CUST_CUST_CITY_IDX (cr=2 pr=2 pw=2 time=1 us cost=1
size=0 card=90)(object id 75264)
不帶索引的 TKPROF 輸出:示例
幻燈片中的示例展示了正從 CUSTOMERS 表提取多次執行的結果集(行)。其需要 .12 秒的 CPU 提取時間。該語句是通過全表掃描 CUSTOMERS 表而執行的,這可以從輸出的行源操作看出。
必須優化該語句。
注:如果 CPU 或 elapsed 的值為 0,則未設置 timed_statistics。
帶有索引的 TKPROF 輸出:示例
幻燈片中所示結果表示,當在 CUST_CITY 列上創建一個索引后,CPU 時間便減為 .01 秒。之所以實現這些結果,是因為該語句使用索引來檢索數據。另外,由于此示例是再次執行同一語句,因此大多數數據塊已經位于內存中。通過合理利用索引,可顯著改善性能。使用 SQL 跟蹤工具確定具有提高潛力的區域。
注:除非需要,否則不應構建索引。因為必須添加、更改或刪除對行的引用,所以索引一定會減慢 INSERT、UPDATE 和 DELETE 命令的處理速度。應刪除未使用的索引。但是,可使用索引監視功能來確定并刪除任何未使用的索引,或使用 SQL 訪問指導來確定未使用的索引,而不需通過EXPLAIN PLAN 處理所有應用程序 SQL。
生成優化程序跟蹤
可通過命令使優化程序產生對成本決定(通過命令作出)的跟蹤。此方法偶爾用于為 Oracle 技術支持提供其它有關優化程序行為的信息。
ALTER SESSION SET EVENTS
'10053 trace name context forever, level 1';
可使用以下命令修改與其它跟蹤文件位置相同的優化程序跟蹤的位置和跟蹤文件的名稱:
ALTER SESSION SET TRACEFILE_IDENTIFIER='opt';
該跟蹤文件無需格式化,但該文件相當大,所以請確保使用以下命令增大會話中該跟蹤的允許大小:
ALTER SESSION SET MAX_DUMPFILE_SIZE=UNLIMITED;
通過退出會話或使用以下命令,停止會話中的跟蹤:
ALTER SESSION SET EVENTS
'10053 trace name context off';
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。