1. 程式人生 > >【Oracle效能診斷藝術】學習筆記----第二章:關鍵概念

【Oracle效能診斷藝術】學習筆記----第二章:關鍵概念

2.1選擇性和基數 cardinality = selectivity * num_rows 2.2.0 概念 #遊標:    指向私有sql區、及其關聯的共享sql區的控制代碼 #私有sql區     儲存繫結變數、查詢執行狀態資訊等資料。屬於具體回話 #使用者全域性區     儲存私有sql區的回話的記憶體 #父遊標    儲存與遊標關聯的sql語句 #子游標    執行環境、執行計劃有關的元素。 #共享sql區    可用於多個會話,儲存在庫快取中 2.2遊標的生命週期
#開啟遊標:
 系統會在與這個會話相關的伺服器程序的伺服器端私有記憶體中為這個遊標分配一個記憶體結構,也就是使用者全域性區(User Global Area,UGA)。注意,SQL語句與遊標還沒有關聯。  在會話的UGA中分配用於開啟遊標的私有sql區、分配一個引用私有sql區的客戶端控制代碼。此時 sql語句還沒有與遊標關聯

#解析遊標:
 有一條SQL語句與這個遊標關聯。解析後內容(包括執行計劃)會被載入到共享池的庫快取(library cache)中。UGA中的結構會被更新,以儲存指向這個共享遊標在庫快取中的位置。  
#定義輸出變數
#繫結輸入變數
#執行遊標
#獲取遊標
#關閉遊標   與控制代碼和私有sql區有關的資源被釋放。庫快取中的共享sql區沒變化。 2.3解析的過程 #包含VPD的約束條件----如果系統中使用了虛擬私有資料庫(VPD,以前也稱為行級安全控制,row-level security),並且被解析的SQL語句中引用的某張表激活了它的話,安全策略生成的約束條件就會被新增到WHERE子句中。
#語法、語義以及訪問許可權檢查
#將父遊標儲存到庫快取------與父遊標有關的關鍵資訊是這個SQL語句的文字。  v$sqlarea 父遊標由(address,hash_value)或(sql_id)唯一識別。
#邏輯優化
#物理優化
#將子游標儲存到庫快取--------與子游標有關的關鍵內容是執行計劃與執行環境。  v$sql 子游標由(address,hash_value,child_number)或(sql_id,child_number)唯一識別。 軟解析(soft parse):只執行解析過程的前兩步
硬解析(hard parse):執行解析過程的所有步驟
閂鎖(latch) 2.3.1共享遊標 父遊標無法被共享的情形:SQL語句文字不匹配 可以共享父遊標而無法共享子游標的情形:執行環境不匹配 v$sql_shared_cursor 可以瞭解到是由於哪種不匹配導致多個子遊標的產生。 2.3.2繫結變數 #優點:可以在庫快取中共享遊標,避免硬解析及與之相關的額外開銷。 繫結變數分級(graduation) v$sql_bind_metadata #缺點:在WHERE子句中使用繫結變數的缺點是會有一些至關重要的資訊對查詢優化器不可見。 繫結變數窺測(bind variable peeking),9i引入。 擴充套件的遊標共享(extended cursor sharing,也稱為適應性遊標共享, adaptive cursor sharing),11g引入。它的目的是在重用一個已經存在的但是會導致執行效率低下的遊標時能夠自動進行識別。 11g: 
v$sql (is_bind_sensitive,is_bind_aware,is_shareable)
v$sql_cs_statistics
v$sql_cs_selectivity
v$sql_cs_histogram #最佳實踐 不涉及WHERE子句的時候,沒理由不使用繫結變數。 直方圖資訊對查詢優化器有很大影響的情況下,最好不要使用繫結變數。 兩個關鍵案例:
--SQL語句處理少量資料:OLTP、SQl語句頻繁執行、解析時間可能接近或高於執行時間。使用繫結變數。
--SQL語句處理大量資料:OLAT、解析時間常常比執行時間要少好幾個數量級。不使用繫結變數。 2.4讀寫資料塊
邏輯讀(logical read)
物理讀(physical read)
物理寫(physical write)
直接讀(direct read)
直接寫(direct write) 2.5小結