當oracle每一次新版本的發布,這一數據庫就會變得更加的受關注,尤其是它的外部環境。oracle在oracle服務器上設置了很多基于cpu個數的重要的初始化參數,并且oracle現在已經更加地意識到cpu運行循環周期和i/o操作的使用代價。
基于成本的sql優化器(cbo)已經被提高到考慮外部的影響,尤其是當為一個sql查詢處理最佳執行的時候。因為數據庫并非運行在一個不受其他因素影響的環境中,cbo將會成為影響每一次sql操作的外部磁盤i/o代價和cpu運行周期代價的因素。這一重要的功能使得cbo成為全球多數成熟軟件產品中的其中一個。cbo的工作就是為任何sql操作選擇一個最佳的執行計劃。
根據oracle文檔,對于i/o和cpu的使用代價評價如下:
使用代價 = (#srds * sreadtim + #mrds * mreadtim + #cpucycles
-------------------------------------------------
cpuspeed )
-------------------------------------------------
sreadtim
這里:
#srds – 單塊讀入的數目
#mrds – 多塊讀入的數目
#cpucycles – cpu運行周期的數目
sreadtim - 單塊讀入的時間
mreadtim – 多塊讀入的時間
cpuspeed - 每一秒的cpu運行次數
請注意外部使用代價受到磁盤讀定的估計使用代價以及與每一次內部操作相聯系的估計cpu代價的影響。oracle保存有關sql處理的許多成分代價的詳細信息,并使用這些平均的代價來影響基于成本的sql優化器的選擇。以下是一些范例:
雜亂信號連接的代價──oracle知道一個雜亂連接所消耗的ram內存的平均數量。
分類──oracle為了執行分類和集中操作而保持跟蹤ram。
列表掃描代價──oracle保存關于執行一個多塊讀入需要時間的信息。
索引塊訪問代價──oraclet知道引出一個單一的塊所需要的平均時間。
請注意這些使用代價的評價依據是不同的,這主要取決于你對oracle優化器的選擇。如果你具有一個帶有first_rows優化器模式的oltp系統,cbo就能夠更快地返回行操作。另一方面,如果你使用的是數據倉庫的first_rows優化器模式,cbo將會被這些外部因素嚴重影響,因為first_rows模式被設計以減少資源消耗。
為了能夠完整地理解oracle的外部使用代價,讓我們深入查閱這些新的外部影響和oracle cbo如何使用外部使用代價。
現在cbo已經能夠估計每一操作需要的機器運行周期的數量級,并影響執行計劃計算的代價。與oracle查詢有關的cpu使用代價取決于當前的服務器載入情況。cpu代價通常并不是很重要,除非是整個oracle程序使用過多的cpu資源。
cbo可以估計每一操作的物理塊讀入的數量級。i/o代價與物理數據塊讀入成正比。然而,cbo不具備緩沖目錄的優先權利,也不能區別一個邏輯讀入和一個物理讀入。因為這些缺點,cbo無法識別數據塊是否已經讀入ram數據緩沖器。
注意到這些使用代價也是讀入數量的功能,并與讀入次數有關,也注意到外部代價并沒有考慮到位于ram數據緩沖器的數據塊的數量,但新的cbo發布版本應該考慮到這一因素。
這里我們可以看到oracle都使用了評測執行計劃的cpu和i/o代價評估。相比于我們處理一些類似查詢而言,這一評估會變得更加復雜,因為類似查詢可以被許多并發的程序處理。
在我文章的下一欄中,我將會講到cbo如何被統計數量所影響。為了能夠做出最好的執行計劃,cbo必須充分使用與查詢有關的所有數據項目信息,因為你必須控制如何分配統計數量,這對cbo的調整是一個關鍵的方面。
新聞熱點
疑難解答